vim配置之映射
映射是我最喜欢的vim功能了,通过它可以自由的设置自己的快捷键,可以大大提高我的编写效率。映射可以理解为设置快捷键,就是让你用少量的,便于按的键来替代比较多、繁的键。
什么时候用映射
如果你有以下一个或多个困扰,那么就可以来使用映射了哦
- 不满现在的按键
- 想设置一些快捷键来提高编辑速度
- 想组合一些按键来完成新的需求
映射的分类
我们知道,vim有多种模式,与其对应的,映射也有nmap(普通映射)、imap(插入映射)、vmap(块选择映射)。
我们分别来选几个案例来讲讲这三种映射。
普通映射
" 使用F1切换显示行号
nmap <F1> :set nu! nu?<cr>
这里的CR表示回车键的意思。
插入映射
" 使用jj来代替esc键,完成从插入模式退回到普通模式
imap jj <esc>`^
一般我们都会使用jj来代替esc键,来完成快速从插入模式切换到普通模式。
" 在插入模式下向前向后删除字符
imap <C-b> <Backspace>
imap <C-d> <Esc>lxi
这里c表示ctrl键,在插入模式下,使用ctrl+b表示向后删除一个字符,而使用ctrl+d表示向前删除一个字符。
块模式映射
一般的,我们经常会对多行文本来进行增加缩进,或者减少缩进。之前一篇文章说过,可以通过块选择结合命令行、或者通过宏来实现该需求。今天,学了映射后,可以使用一个更加简单的方法即可实现需求。
vmap < <gv
vmap > >gv
现在,如果我们想对多行进行缩进,只需选择好这些行,然后按下>或<即可实现。
递归映射
如果你下一下的映射时,会发生什么
nmap dd O<esc>jddk
如果当你执行了dd后,会发生严重的问题的。因为映射两边都有dd,所以会导致无限循环。这种无限循环是由于递归造成了,所以叫做递归映射。
大家可以看到,递归映射是有危害的,所以,工作中一律不准使用递归映射,而是要采用非递归映射。那么如果进行非递归映射呢?也非常简单,加4个字母即可nore
- nmap 递归 nnoremap 非递归
- imap 递归 inoremap非递归
- vmap 递归 inoremap 非递归
leaders
在windows中有些组合键,比如win+d可以关闭所有窗口,win+l可以锁屏,而leader就有点像win键,告诉vim:我要用快捷键了。事实上,我们不关心这个leader是什么,只是需要这么一个“前缀”。(该类比并不恰当,windows中组合键需要一起按,leader只是个前缀,先按leader再按其它的键即可) 设置leader
let mapleader = ","
这样我们就把逗号设置为mapleader(逗号是惯例,比较容易按,也不会影响原来的功能)。然后你就可以这样设置:
nnoremap <leader>d dd
这样你只需要按下,d就等于执行了dd
为什么不写死呢,把逗号写进去?程序猿都知道,设为变量总是比常量写死更方便,以后容易替换;别人在复制你的配置时,马上知道这是一个leader,他就容易改为他习惯的;在许多vim插件中也会用到leader。
还有一种leader,“local leader”,你可以把这两个leader设为相同或者不同 比如
let maplocalleader="\"
这个localleader的意义往往是你想在某一种特殊文件中用一个leader,比如html,python,(不同的编程语言频繁的操作也会有差异),会方便不少。