vim

光标

h/j/k/l

左下上右

b/e

词首词尾

^/$

行首行尾

-/+

上一行行首、后一行行首

\{/}

段首段尾

gg/G

文首文尾

<Cf>

向下一页(Forward)

<cb>

向上一页(Back)

<cd>

向下半页

<cu>

向上半页

gg

光标移动到文档开头

G

光标移动到文档末尾

数字+方向

向某个方向移动指定行

字符操作

i/I插入、插入到行首

a/A

附加、附加到行尾

p/P

后粘贴、前粘贴

d/D

删除、删除到行尾

s/S

删除并插入、删除到行尾并插入

r

替换

f/F

行内查找、行内前向查找

R

进入 Replace/Insert 模式[1]

:m +1

下移一行

:m -1

上移一行

列编辑

使用列编辑一共有三个步骤:

  1. 使用 <C-v> 进入列选择模式

  2. 使用 <I> 进入列前端插入模式,或者使用 <A> 进入列后端插入

  3. 完成编辑后使用 <ESC> 退出编辑模式

然后所有选择的列都会出现相同的内容

可视模式

上面所述的 列编辑 实际上是可视模式的一种。

v

字符可视模式

V

行可视模式

<C-v>

块可视模式

窗口管理

sp/vs

分割窗口

<C-w>+方向键

在分割的窗口间切换

<C-w w>

转到下一个窗口:

<C-w +/→

调整窗口高度

<C-w </>>

调整窗口宽度

<C-w ⇒

将所有窗口设置为相同尺寸

:[vertiacl] res

调整窗口大小:

close

关闭当前窗口

qall

退出所有窗口

qall!

退出所有窗口而不保存

wqall

退出所有窗口并保存

wall

保存所有窗口

<C-w-w> 可以用来转到悬浮窗口[2]

标签页:

tabe+file

创建标签

tabc+n

关闭标签

tabn/tabp

切换标签

代码折叠

za

切换折叠

zc

折叠

zC

对所在范围内所有嵌套的折叠点进行折叠

zo

展开折叠

zO

对所在范围内所有嵌套的折叠点展开

[z

到当前打开的折叠的开始处

]z

到当前打开的折叠的末尾处

zj

向下移动。到达下一个折叠的开始处。关闭的折叠也被计入

zk

向上移动到前一折叠的结束处。关闭的折叠也被计入

此外,还可能需要在配置文件中添加:

' 基于缩进进行代码折叠
set foldmethod=indent
' 启动 Vim 时关闭折叠
set nofoldenable

终端命令

:!+命令

同样的,在执行诸如 cd 的命令的时候可以按 tab 补全

切换工作区

cd

改变vim的当前工作路径

lcd

改变当前窗口的工作路径

pwd

查看当前的工作路径

set autochdir

自动设当前编辑的文件所在目录为当前工作路径

自动对齐

gg=G

键盘

<leader> 默认是 \\

映射时映射 Alt 这种键的时候需要写成 <M-..> 的形式 箭头键是 <Right>, <Left>, <Up>, <Down>

两者组合在一起就是 <M-Up>

内置终端

:term 或者 :term bash/zsh/…​

使用 <C-\><C-n> 可以退出终端模式,更多请参阅 :help terminal-emulator

宏算是一个比较高阶的功能了,用法是:

  1. 按下 qa 开始录制宏

  2. 对行进行操作

  3. q 退出宏录制

  4. [\d]@a 执行宏

尽管宏的用法比较简单,但是依然有一些需要注意的地方:

  • 在宏录制的最后不要忘记切换到下一行,要不然宏执行的时候都是在一行上进行操作的

  • 当遇到错误的时候,宏会自动停止(例如在文件末尾尝试将光标移动到下一行)

忽略大小写

要进行忽略大小写的搜索,有两种方法:

  1. set ignorecase

  2. /string\c

非贪婪匹配

非贪婪匹配使用 \{-}

二进制模式

使用 nvim -b 可以使用二进制编辑模式,另外,使用 :set display=uhex 可以将一些符号以二进制的形式显示,这在处理 Windows 下的文件时很好用

加快 nvim 的启动速度

首先看看怎么查找拖慢 nvim 启动速度的元凶。在使用 Packer 时,使用 :PackerCompile profile=true 然后重启一次,使用 :PackerProfile 查看最慢的插件

下面是几个我碰到的问题:

  1. 加载插件时禁用 GC:在`init.lua` 的起始和结尾处分别加上 :

    collectgarbage('stop')
    collectgarbage('restart')
    
    在 200ms 的启动速度上,大概能减少 50ms
  2. 使用 filetype.nvim 。默认的 filetype.vim 会在启动时创建非常多的 autocmd,这极大地降低了启动速度(大概 9ms,但是总体影响 20ms 左右)。filetype.vim 只创建一个 autocmd。对于版本高于 0.6 的 nvim,直接安装 nathom/filetype.nvim 即可

  3. 使用 impatient.nvim。impatient.nvim 通过对模块路径和模块进行缓存,极大地加快了加载速度。安装 impatient.nvim 后,在 init.lua 中所有加载模块的代码前面加上 require("impatient") 即可

  4. 禁用内置插件:

    -- 跳过 python provider 检测
    vim.g.python_host_skip_check = 1
    vim.g.python3_host_skip_check = 1
    vim.g.python3_host_prog = '/usr/bin/python3'
    -- 禁用内置插件
    vim.g.loaded_gzip = 1
    vim.g.loaded_tar = 1
    vim.g.loaded_tarPlugin = 1
    vim.g.loaded_zip = 1
    vim.g.loaded_zipPlugin = 1
    vim.g.loaded_getscript = 1
    vim.g.loaded_getscriptPlugin = 1
    vim.g.loaded_vimball = 1
    vim.g.loaded_vimballPlugin = 1
    -- vim.g.loaded_matchit           = 1
    -- vim.g.loaded_matchparen        = 1
    vim.g.loaded_2html_plugin = 1
    vim.g.loaded_logiPat = 1
    vim.g.loaded_rrhelper = 1
    vim.g.loaded_netrw = 1
    vim.g.loaded_netrwPlugin = 1
    vim.g.loaded_netrwSettings = 1
    vim.g.loaded_netrwFileHandlers = 1
    vim.g.loaded_remote_plugins = 1
    vim.g.loaded_shada_plugin = 1
    vim.g.loaded_fzf = 1
  5. 优化 lspconfig 的配置。仿照 filetype.nvim,我们可以只创建一个 autocmd 来完成对指定 lsp 配置的加载,而不是每次启动时加载所有配置文件。在 36ms 的配置中,优化到了 29ms:

M.resolve = function()
    if _G.loaded_server == nil then
        _G.loaded_server = {}
    end
    if _G.loaded_server[vim.o.ft] ~= nil then
        return
    end

    local lsps = load_module('plugins.lspconfig.lsps')
    local utils = load_module('plugins.lspconfig.utils')
    local on_attach = function(client, bufnr)
        vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc')
        local set_keymap = load_module('keymap.lspconfig')(client, bufnr)
    end

    for _, lsp in pairs(utils.enabled_lsps) do
        local filetypes = utils:get_filetypes(lsp)
        for _, ft in pairs(filetypes) do
            if vim.o.ft == ft then
                    _G.loaded_server[vim.o.ft] = true
                    utils:setup_lsp(lsp, lsps[lsp], on_attach, utils.capabilities)
                break
            end
        end
    end

    return true
end

M.init = function()
    vim.cmd([[
    au FileType * lua require('plugins.lspconfig').resolve()
    ]])
end
  1. 在使用 luasnip 加载 vsnip 时,使用 lazy_load 而不是 load。后者会导致将近 150ms 的延迟:

    require('luasnip.loaders.from_vscode').lazy_load {
        paths = {
            '~/.local/share/nvim/site/pack/packer/start/friendly-snippets',
            vim.fn.stdpath('config') .. '/snippets',
        },
    }

使用技巧

  • 使用 :tab help <keyword> 可以用来在新标签中打开帮助

  • 使用 dip 可以用于删除大量连续空行

  • 使用 [{}] 可以在函数间快速移动

  • 插入模式下可以使用 ^w 删除前一个单词

  • 插入模式下可以使用 X-F 补全当前目录的文件名

  • 插入模式下可以使用 ^R= 执行简单的数学计算

  • 插入模式下可以用 ^R<寄存器> 来插入寄存器中的内容

  • 搜索模式下可以使用 R-W 插入光标下的单词

替代品

下面的表格列出了一些 lua 方言和拓展品:

语言类型作用

htts://github.com/terralang/terra[terra]

lua 拓展

加入了模板编程

复制当前文件路径到缓冲区[1]

:let @" = expand("%")

使用表达式寄存器生成序列

表达式寄存器可以用来计算表达式的值。在插入模式下,按下 \^r= 然后输入表达式,就会在光标处插入表达式的值。根据这个方法,可以借用表达式寄存器生成序列:

  1. 拷贝初始值

  2. 移动到下一个位置

  3. 按下 \^r= , Ctrl+0 , +1<Enter>

就会生成序列。

重复

命令重复内容

.

最后一次对文本更改的操作

@@

最后一次执行的宏

@:

最后一次在 cmdline 中执行的命令

&

最后一次替换

n N ; ,

搜索

Last moify: 2024-11-20 02:39:49
Build time:2025-07-18 09:41:42
Powered By asphinx