Mapping 映射
Vim 的基础按键操作已经可以很好的完成基本编辑工作,然而它还是会不太方便,尤其是熟悉了成熟 IDE 很多人性化设计的人们,曾经的我也是。所幸 Vim 提供了 Mapping 映射可以更好的进行文本操作,甚至比 IDE 更方便。
从预览图中我做了这么几个事情
- 先输入一个字符串
wxnacy
但是忘记环绕双引号,但是利用映射快速完成双引号环绕 - 然后快速跳到行首输入
String name =
,再快速跳到行尾输入输入;
- 输入语句,并在不跳到行尾的情况下,在行尾插入
;
- 最后输入一行
=
并快速与上一行替换位置
简单映射
我们先把刚才说的事情放一放,从最简单的开始
map - dd
你可以在 command
模式中输入这句,然后在文本的某一行中按下 -
,如果你已经按下了,相信你已经明白他的含义,-
映射了 dd
的功能,当然 dd
的功能并没有消失,这样的意义是什么呢,可以输入少,但做的多,我在上一章中提到过,懒是第一生产力
Vim 提供了映射的功能,除了少输入字符外,它可以让我们免受一些“别扭”的按键所折磨,在预览中我们提到了,快速跳到行首行尾来编辑,其实 Vim 的基础操作就有提及,I, A
分别可以完成,然后这样的按键让从其他编辑器跳槽过来的人颇为头疼,因为现在几乎所有的编辑器都可以通过 ctrl + a, ctrl + e
来实现这个功能,就算我强迫自己适应了它的设定,在与其他编辑器切换使用时,这样的区别也会让我很恼火,所以我想改了它
nmap <c-a> I
nmap <c-e> A
imap <c-a> <esc>I
imap <c-e> <esc>A
按照这样修改你的配置文件,你就可以像其他编辑器一样使用快速跳转行首行尾了,在这里有两个新东西 <c-a>
nmap, imap
,我们来看一下。
<c-a>
就是ctrl + a
的组合键,第一个 c 就代表 ctrl- Vim 在映射上提供了四个关键词
nmap, imap, vmap, cmap
分别代表了四种使用模式,map
默认为nmap
可怕的递归
nmap dd jddk
试着用一下这个映射,结果发现它只是像按了 G
一样,跳到了最后一行,并没有按照预想的那样,先下移一行,删除,再上移一行
。那么问题出在了哪里?
我们在这里遇到了递归映射,在执行 j
以后遇到 dd
,Vim 以为我们又想映射,所以又从 j
开始执行,如此往复,陷入了递归陷阱。当然你会说,尽量避免这种情况就是了,这样好像可以解决眼前的问题,但是却解决不了以后的问题,随着自定义映射越来越多,这样的情况出现几率会越来越高,因为一共也就这么多按键,总有用完的时候,另外你以后肯定记不住那么的映射都用在哪了。所以我们应该用更好的方式来解决问题。
nnoremap dd jddk
再次试用这个映射,现在我们会发现,当按下 dd
的时候已经可以删除下一行了,Vim 提供了非递归映射,同时提供了 inoremap, vnoremap, cnoremap
一共四种模式
不要问什么时候用这种模式,答案很显然,是永远,forver。毕竟我们不能永远惦记着哪些映射可能会触发递归,因为我们的时间和精力应该用在更有意义的事情上。
相关文档 :help unmap
Leader
在解决完递归的问题,我们再来看一种情况,在上个问题中我们使用 dd
来做删除下一行的操作,那删除当前行怎么办,对,我之前提过可以用 -
来映射。但我们不能用这样映射下去,我们需要更好的解决方法。
nnoremap ;d jddk
通过这样的配置,我们并没有多输入字符,但是也达到了同样的效果,并且这样的组合几乎不会在其他地方用到,在 Vim 中我们称 ;
这样的“前缀”为 leader
let mapleader = ';'
在 ~/.vimrc
中加上这样的配置,可以设置自己的 leader
键,并用 <leader>
来配置映射
nnoremap <Leader>d jddk
这样做的好处是如果你有一天想改变这个键位,只需要修改一个地方即可,不必在到处查找,并且如果哪天你把自己的配置放到网上供他人使用,别人只需修改成自己喜欢的键位,就可以马上使用。
更多的资料可以阅读 :help mapleader
:help maplocalleader
更复杂的映射
现在我们来做一些更复杂的事情,分析一下效果预览中一些操作
nnoremap <Leader>" viw<esc>bi"<esc>ea"<esc>
这是给单词做环绕括号时的操作,你可以先复制到你的配置中试一下效果,它做了什么呢?
- 首先
viw
可以选中当前光标所在单词,我们在高级键位章节中简单提到过这个功能,下一章细讲 - 然后输入
<esc>
退出visual
模式,b
跳到单词开头,i
进入insert
模式,输入"
- 再次退出
insert
模式,e
跳到单词末尾,a
在末尾进入insert
模式,输入"
,最后退出insert
模式
如果你把 Vim 当做主编辑器来使用,这样的映射操作会经常发生,所以你需要不断的练习
" 在行尾输入分号
nnoremap <Leader>, mzA;<esc>`z
" 在正常模式和插入模式快速跳到行首行尾
nnoremap <C-a> I
nnoremap <C-e> A
inoremap <C-a> <esc>I
inoremap <C-e> <esc>A
剩下两个操作我不在进行解释,你可以自己尝试搞明白原理,你可能会发现我没有提及为什么输入 print
后会快速变成 System.out.println("")
,因为我们在上一章就讲过了。
最后提一点,如果你觉得改完键位会很乱的话,可以将原来的键位映射到 <nop>
上,这样原来的键位就会失效,你可以靠这样强迫自己使用新键位。
2018-06-04 发布