Skip to content
On this page

Vim 按键映射配置详解

Vim 按键映射可用于设置 Vim 命令或命令串的别名,完成个性化 Vim 按键设置。

Vim 命令虽然很多,但是常用的 Vim 命令却被使用者所熟知。通过 Vim 按键映射,可减少按键次数、提供 Vim 的工作效率。

本文介绍 15 种常用的 Vim 按键映射配置,并详细分析了对应的 Vim 命令及功能。

打开/关闭显示行号按键映射

通过以下的 Vim 按键映射,可以在 Vim 的普通模式下按 F2 快速打开 (或关闭) 显示行号。

vim
nnoremap <F2> :set nu! nu?<CR>

还可以根据个人使用需用,设置以下类似的按键映射。

nnoremap <F3> :set list! list?<CR>
nnoremap <F4> :set wrap! wrap?<CR>
nnoremap <F6> :exec exists('syntax_on') ? 'syn off' : 'syn on'<CR>

退出 Vim 的按键映射

退出 Vim 是最常用的操作,:q:w 等命令需要先按 : 键进入 Vim 命令行模式。Vim leader 键 主要用于避免按键冲突,类似于命名空间的作用。

nnoremap <leader>q :q<CR>
nnoremap <leader>w :w<CR>

在上述按键映射的设置下,Vim 默认模式下,按 \q (因为默认的 leader 键是 \) 就等价于输入 :q 并按回车键执行,按 \w 等价于输入 :w 并按回车键执行之。

Vim 全选按键映射

可以通过 Vim 可视化模式 实现全选 Vim 中的全部文本。具体来说,先通过 gg 命令跳转到文件的首行,再按 V 进入可视化模式的行选择模式,再通过 G 命令将光标移动到尾行,从而实现选中全部文本的效果。

假设 leader 键是默认的 \,通过下面的 Vim 按键映射,可以实现按 \sa 全选当前文件所有文本的效果。

map <leader>sa ggVG"

Vim 缩进及按键映射配置

Vim 可视化模式下,> 用于增加缩进;而 gv 命令可以用于重新选取上一次由可视模式所选择的文本范围。

为了避免丢失可视化模式下的选择本文,可增加如下 Vim 按键映射配置:

vnoremap < <gv
vnoremap > >gv

Vim 分割窗口切换映射

在 Vim 窗口分割模式下,默认可以使用 <Ctrl-w> 组合键进行窗口切换。例如,<Ctrl-w>j 可切换到下面的分割窗口,<Ctrl-w>k 可切换到上面的分割窗口,<Ctrl-w>h 可切换到左边的分割窗口,而 <Ctrl-w>l可切换到右边的分割窗口。

但是,个人觉得上述按键太过繁琐,可以通过以下按键映射,减少按键次数。

map <C-j> <C-W>j
map <C-k> <C-W>k
map <C-h> <C-W>h
map <C-l> <C-W>l

在上述 Vim 按键映射设置下,通过组合键 <Ctrl-j> 可切换到下面的分割窗口,<Ctrl-k> 可切换到上面的分割窗口,<Ctrl-h> 可切换到左边的分割窗口,而 <Ctrl-l>可切换到右边的分割窗口。

Vim 光标行移动

nnoremap k gk
nnoremap gk k
nnoremap j gj
nnoremap gj j

nnoremap gk k 表示将 gk 按键映射为 k,从 Vim 光标移动之实际行与屏幕行一文可知,gk 表示上移一个屏幕行。

Vim 行首、行尾光标移动按键映射

Vim 普通模式下,^ 命令可将光标移动到当前行的第一个非空字符;$ 可将光标移动到当前行的行尾。

h 命令用于向左移动光标,l 命令用于向右移动光标。

所以,Vim 教程网进行如下按键映射,实现按大写的 H 将光标左移至当前行的第一个字符,按大小的 L 将光标右移至当前行的最后一个字符。

nnoremap H ^
nnoremap L $

Vim 命令行模式光标移动

在 Vim 的命令行模式下,如果想实现类似于《高效 Linux 技巧及 Vim 命令》一文提到的快速移动光标到行首的效果,可配置如下 Vim 按键映射。

cnoremap <C-j> <t_kd>
cnoremap <C-k> <t_ku>
cnoremap <C-a> <Home>
cnoremap <C-e> <End>

例如,cnoremap <C-a> <Home> 表示将 <Ctrl> a 组合键映射为 Home 键,从而实现在 Vim 命令行模式下按 <Ctrl> a 即可快速移动光标到行首的效果。

上述其他几个按键映射含义类似,在此不再赘述。

Vim 复制命令

y (yank 的缩写形式) 命令用于复制文本到 Vim 寄存器中,其命令格式为:["x]y{motion},表示复制 {motion} 跨越的文本 [到寄存器 x] (参考:Vim 文本编辑命令汇总)。

如果希望复制 从光标到行尾 所在范围的文本,可使用 y$ 命令。

以下 Vim 按键映射,将大写的 Y 按键映射为 y$

map Y y$

Vim 取消撤销操作

Vim 普通模式下,通过 u 可撤销上次的操作,而组合命令 <Ctrl r> 可取消撤销操作。为了减少按键操作,可将 U 键映射为 <Ctrl r> 命令,从而实现按 U 便可以取消撤销操作。

对应按键映射配置如下:

nnoremap U <C-r>

Vim 位置标记与跳转

如 Vim 位置标记 mark 详解一文所介绍,Vim 命令 'a (单引号加一个标记 a) 会将光标跳转到 a 标记所在行的行首。而 ``a` 命令会将光标跳转到标记所在行上被标记的列位置,即同时恢复行、列的位置。

nnoremap ' `
nnoremap ` '

Vim 搜索结果居中展示

nnoremap <silent> n nzz
nnoremap <silent> N Nzz
nnoremap <silent> * *zz
nnoremap <silent> # #zz
nnoremap <silent> g* g*zz

Vim 普通模式下,z 命令用于屏幕重绘。z. 命令使当前光标所在的行显示在窗口中部,且光标会移动到当前行的第一个非空白字符上;而 zz 会使当前光标所在的行显示在窗口中部,且保持光标所在列的位置不变。同时,在 Vim 普通模式下,n 命令表示跳转到下一个查找匹配项。

因此,nzz 表示把下一个查找匹配项所在的行显示在屏幕的最中间。

为了减少按键次数,同时不改变使用习惯,可以设置 Vim 普通模式下的按键映射:nnoremap <silent> n nzz,实现按 n 键就可以将下一个查找匹配项所在的行显示在屏幕的最中间。

上述其他几个按键映射同理,不再赘述。可参考《Vim 搜索命令使用方法和技巧》一文,了解 N*#、`` 在 Vim 查找匹配下的作用。

silien 命令用于安静地执行命令,既不显示正常的消息,也不会把它加进消息历史,其格式为::sil[ent][!] {command}。如果有 [!],则表示还将跳过错误消息 (即时检测到错误时,Vim 命令和按键映射也不会被终止)。