模式映射

在上一章节中,我们讲了如何在 Vim 中映射按键。我们使用 map 命令来让按键在普通模式下工作。 如果你在看这一章节之前,有再稍微琢磨过它的话,也许会发现映射也可以在可视模式下工作。

你可以用 nmapvmapimap 来指定具体何时需要映射。 这些命令会各自告诉 Vim 只在普通、可视、插入模式下使用映射。

运行命令:

:nmap \ dd

现在,把你的光标移动到文本文件中,并确保是在普通模式下,然后按下 \。Vim 会删除当前行。

现在,进入可视模式,然后按下 \。什么也不会发生,因为我们告诉了 Vim 只在普通模式下使用映射 (\ 默认不会做任何事情)。

运行命令:

:vmap \ U

进入可视模式,并选择一些文本,然后按下 \。Vim 会把这些文本转成大写!

在普通模式和可视模式下多试几次 \ 键,可以看出来,现在在不同的模式下,它做的事情完全不一样。

肌肉记忆

起初,你可能认为让同一个按键在不同的模式下做完全不同的事是一个非常糟糕的主意。 为什么非得要在按按键之前停下来,先想想现在到底处在什么模式下? 难道这不会把从映射中节省出来的时间全部浪费掉么?

但事实证明这根本不是问题。一旦习惯于使用 Vim 后,你再也不会考虑某个单独的按键。 你只会想:要“删除一行”,并且不“按 dd ”。 你的手指和大脑会自动记住这些映射,而这些按键会慢慢成为潜意识。

插入模式

既然我们已经讲过了如何在普通和可视模式下映射按键,让我们继续学习插入模式。 运行命令:

:imap <c-d> dd

你也许会认为,只要在插入模式下,每当按下 Ctrl+d ,就会删除当前行。 这很方便,因为不需要返回到普通模式中去删除这些行。

赶紧试试看。结果是,这并不能正常工作 —— 而只是增加了两个 d。这然而并没有什么卵用。

这个问题是因为 Vim 只是严格地按照我们所说的来做。 我们告诉了它:“当按下 <c-d> 时,你只需要按照按下 dd 所做的来做就行。”。 所以,就像平常一样,当在插入模式下按 d 键两次,就会在这一行得到两个 d

为了让映射实现我们想要的,就需要描述的很清楚。 运行命令来改变映射:

:imap <c-d> <esc>dd

<esc> 键就是告诉 Vim 要按 Esc 键,它会让我们退出插入模式。

现在,试试这个映射。能正常工作了,但是要注意,为何又回到普通模式了。 这很好理解,因为我们告诉了 Vim,<c-d> 应该要退出插入模式,并且删除一行,但是我们并没有告诉它要返回插入模式。

再运行一次命令,彻底地修复这个映射:

:imap <c-d> <esc>ddi

最后的i键会进入插入模式,最终我们的映射就完成了。

练习

设置一个映射,使在插入模式中,可以通过按 <c-u> 来把当前的单词转成大写。 记住,在可视模式下,U会把所选的文本转成大写。 如果要写一个很长的常数,比如MAX_CONNECTIONS_ALLOWED,那这个命令就非常的有用。 这样,可以先用小写把这个常数写出来,然后用映射转成大写,而不需要一直按着 Shift 键。

把这个映射加到 ~/.vimrc 中。

设置一个映射,使在普通模式下,可以通过按 <c-u> 来把当前单词转成大写。 这个会和前一个的映射稍稍有些不同,因为不需要先进入普通模式。 而且,结束的时候,要停留在普通模式下,而不是插入模式。

把这个映射加到 ~/.vimrc 中。

原文地址:http://learnvimscriptthehardway.stevelosh.com/chapters/04.html