惯於使用所见即所得,或者说喜欢用滑鼠的朋友们,对於 vim 这种好像只能凭藉键盘的方式很不习惯。我们可能会说 vim 是不错,可是不能滑鼠选择一块区域,然后按一个键,或是一个地方,就可以完成某些事情。比方说有一些软体可以让你在编写网页的时候,你可以用滑鼠把文字区块选起来,然后点一个小图示或是用滑鼠点击选单就做到把那个区域的前后补上<small>…</small>这样的标籤。虽然 vim 有这麼多强大的功能,有取代、置换、帮你干嘛干嘛的,… 难道,就是这样了吗? vim 真的不行了吗?
怎麼可能?只不过这次,我们必须要把前面许多已经讨论过的方式综合在一起使用,而今天使用的就是其中之一的选择模式(visual mode),透过热键的设定 (Key mapping),就可以轻鬆做到用滑鼠选择然后按一次键就完成目标的事情。
一般来说,如果我们想要做到让 ABCDE 这串东西,变成 <small>ABCDE</small> 的话,照前面我们谈过的作法,你可能会想到用:
:%s/ABCDE/<small>ABCDE</small>/g
或者是:
:%s/ABCDE/<small>\1</small>/g
但是如果 ABCDE 这种东西变多了,就是说你有许多不一样的这些东西都要给上标籤(tag),这种%s的作法,别说你觉得累,我都觉得厌烦。
现在,就请你把 vim 打开,随意输入一些字,并且进入指令模式下。
(如果你还没有 vim ,可以到 vim 的网页 下载)
先把答案给你看:
:vmap <C-S> s<small><C-R>”</small><ESC>
当你输入这串指令后,试试看用滑鼠选择,或是和我一样用键盘以 v 加上游标,选取刚才你随意输入的那些字,然后按下CTRL+S (就是上面的<C-S>),你就会发现选择的那块文字的前后都被加上了<small> </small>。
基本的语法是这样: [mode(模式)] [热键] [执行指令]
所以回过头来看我们的「答案」:
:vmap <C-S> s<small><C-R>”</small><ESC>
「vmap」 用来告诉 vim 这样的按键设定只在选择模式下才使用,
「<C-S>」 就是代表我们的「热键」,意即 CTRL+S。如果你想要的是 ALT+S,那就是<A-S>。
至於后面那一串 s<small><C-R>”</small><ESC> 自然就是我们输入的指令:
* 「s」 代表取代;就是说现在选的这个区块将会被后面的东西所取代;
* 「<C-R>」代表 CTRL+R,这是呼叫 vim 裡面使用的 registers(暂存器),而它呼叫的就是「”」这个暂存器,这个暂存器会把在选择模式 (visual mode) 下用到的 d, c, s, x 等指令「抓取」到的文字区块,放到「”」这个暂存器裡面(如果你不清楚它们的用法或意义,可以使用 :help d , :help c , :help s, :help x 来查询)。前面既然我们才刚刚使用过「s」,很明显,就代表刚刚用滑鼠(或者你和我一样都用键盘)选取到的区域就是放在「”」暂存器裡面,然后把在编辑器上面选择的区域清除,并且进入输入的模式。
* 再看后面的指令:「<small><C-R>”</small>」这意思是说,先输入一个「<small>」然后用CTRL+R把「”」暂存器里面的东西拉出来(还记得「”」里面装什么吧?),然后补上「</small>」,最后为了要让输入模式转到指令模式下,用了「<ESC>」。
如果你不想再用这个设定了,可以用:
:vunmap
来取消。
好啦,所以同样的方式你一样可以用在其他的模式下,相关的详细使用你可以参考:
:h key-mapping