Vim进阶2 map映射
简介
map是一个 vim 中的一些列映射命令,将常用的很长的命令映射到一个新的功能键上。map是Vim强大的一个重要原因,可以自定义各种快捷键,用起来自然得心应手。
map系列命令格式
格式
以 map 命令为例,它的命令格式是这样的:
:map {lhs} {rhs}
其含义是,在 :map
作用的模式中把键系列 {lhs}
映射为 {rhs}
,{rhs}
可进行映射扫描,也就是可递归映射。
举例
:map td :tabnew .<cr>
含义:在其作用模式(普通、可视、操作符)下,输入 td
等价于输入 :tabnew . <cr>
。而普通模式下输入:tabnew . <cr>
就是打开当前目录。
而如果再映射一次
:map ts td
就是指在其作用模式下输入 ts
等价于 td
,也就是打开当前目录。不过如果没有特殊需要,一般不建议递归映射。
映射命令
不同模式下的映射命令
使用下表中不同形式的map命令,可以针对特定的模式设置键盘映射,实际上,不同的 map 命令前缀是可以相互组合的,
-
nore 表示非递归。 递归的映射。其实很好理解,也就是如果键a被映射成了b,c又被映射成了a,如果映射是递归的,那么c就被映射成了b,这个会在后面再介绍。
-
n 表示在普通模式下生效
-
v 表示在可视模式下生效
-
i 表示在插入模式下生效
-
c 表示在命令行模式下生效
常见的映射命令的有效模式如下:
Command 命令 | Normal 常规模式 | Visual 可视化模式 | Operator Pending 运算符模式 | Insert Only 插入模式 | Command Line 命令行模式 |
---|---|---|---|---|---|
:map | y | y | y | ||
:nmap | y | ||||
:vmap | y | ||||
:omap | y | ||||
:map! | y | y | |||
:imap | y | ||||
:cmap | y |
noremap
看它的名字其实也很好理解它的含义:no re map,即不要 重新 映射,就是说不要进行递归映射。
具体来说,:noremap
和 :map
命令相对,作用模式和命令格式都相同,只不过不允许再对 {rhs}
进行映射扫描,也就是 {lhs}
定义后的映射就是 {rhs}
的键序列,不会再对 {rhs}
键序列重新解释扫描。它一般用于重定义一个命令,当然如果 :map
不需要递归映射的话,建议使用 :noremap
。
比如:
:noremap ts td
它的意思是在其作用模式下,输入 ts
就是输入td,但是和 :map
不同的是,此时 td
再不会做进一步扫描解释。虽然之前已经定义了 td
,但是不会对 td
再做扫描。
取消映射
unmap
:unmap
是对应取消 :map
绑定的 {lhs}
,作用模式相同,命令格式 :unmap {lhs}
。
例如:
:unmap td
就是取消在其作用模式中 td
的绑定,比如之前 td
被绑定为 :tabnew .<cr>
,此时此绑定消失。
注意 unmap
必须要有一个参数,即被取消的 {lhs}
,否则会报错。
mapclear
:mapclear
是对应取消所有 :map
绑定的,慎用!
常用map映射参考
下面介绍几个笔者在用的 vim 映射,大家如果觉得好用的话可以加到自己的 vimrc
里面。主要还是鼓励大家在自己的日常使用中根据自己输入的痛点,灵活地设计自己的map,毕竟做不同的工作,写不同的语言,输入的痛点都是不同的,这也正是 Vim 灵活好玩的地方之一。
推荐的原则是:将自己最常用的键设置在自己最容易按到的地方。
1. 禁用方向键
为了强迫帮助新手尽快适应 hjkl 来移动光标,而非用方向键,我们可以将方向键禁用掉,包括常规模式和插入模式,这也是 MIT 建议的 vimrc 中的设置 (该链接会直接下载MIT的vimrc)。
" 常规模式禁用方向键
nnoremap <Left> :echoe "Use h"<CR>
nnoremap <Right> :echoe "Use l"<CR>
nnoremap <Up> :echoe "Use k"<CR>
nnoremap <Down> :echoe "Use j"<CR>" 插入模式禁用方向键
inoremap <Left> <ESC>:echoe "Use h"<CR>
inoremap <Right> <ESC>:echoe "Use l"<CR>
inoremap <Up> <ESC>:echoe "Use k"<CR>
inoremap <Down> <ESC>:echoe "Use j"<CR>
2. 缩进
我们在 VS Code 等编辑器中都是 Tab
和 Shift+Tab
来进行缩进和反缩进,在 Vim 中,缩进和反缩进稍显复杂,我们可以用下面的映射来使得它和我们在其他编辑器中一样。
" 常规模式
nmap <tab> V>
nmap <s-tab> V<" 可视模式
vmap <tab> >gv
vmap <s-tab> <gv
3. 移动窗口
在 Vim 分屏中,我们使用 sp
和 vsp
来同时打开多个窗口,并通过 Ctrl+w+hjkl
来在各个窗口之间进行切换,但这也很麻烦,笔者实在是没想通加那个 w 干嘛,换掉!
map <C-h> <C-w>h
map <C-j> <C-w>j
map <C-k> <C-w>k
map <C-l> <C-w>l
4. 移动到行首行位
在 Vim 常规模式下,移动到行首行位分别是 0
、^
和 $
,但是笔者也感觉直接格键巨难按,刚好 H
和 L
在平时不怎么用到,还是处在键盘的黄金位置,所以可以用来替换:
noremap H ^
noremap L $
5. 功能按键
在键盘的黄金区域,Vim 留给我们可以自己设置的键位并不多,但是功能键( F2
等)还是有很多可以用的,要注意的是,功能键离我们的手也很远,所以最好不要设置一些频繁用到的操作,而是应该让 “键如其名”,设置一些 “功能键” 在功能键上。比如开关行数显示,有时很有用,但是有时又看着很烦或者在复制文本时很碍事,以此为例,我们将开关行数设置在 F2
上:
nnoremap <F2> :set nu! nu?<CR>
其他的功能键大家可以结合自己日常输入中常用的功能来进行设置。推荐在功能键设置一些 set
的功能命令。可参考 vimrc配置文件。
笔者在这里抛砖引玉,就介绍怎么多,其他的高效映射,大家自己在日常工作中再去探索吧。
Ref:
http://www.pythonclub.org/linux/vim/map
https://www.jianshu.com/p/8ae25a680ed7