vim_thumb

Learning Vimscript The Hard Way — (4) Modal Mapping/模态映射

模态映射

【译注:

原文是 Modal Mapping,这个 Modal 感觉不太好译,一般来说 Modal Dialog 会译为“模态对话框”,这个时候 Modal 的意思是这个对话框是会遮盖后面的内容,必须关闭对话框才可以操作其他窗口的意思。

而这里的 Modal Mapping 其实确切的意思是“情景映射”,在不同的模式下面生效的映射,是这个意思,不过就单词术语来说,还是译成“模态映射”好了,只是在这里多嘴说明一下,此模态非彼模态。

上一章里面,我们说到了怎么在 Vim 里面做键盘映射。我们用了 map 命令来让这些键映射在常规模式里面工作。如果你在这章里面往后再了解多一些(played around a bit),你会注意到这些映射【指的是 map 命令产生的映射,参见此文】也可以在可视化模式下面工作。

通过使用nmapvmapimap命令,你可以更加精确地在不同模式下面设置映射。对应地,它们会告诉 Vim (这些映射)仅在常规模式可视化模式或者插入模式里面工作。

运行以下的命令:

:nmap \ dd

现在将你的光标移到你的文本文件里面,确认你处于常规模式,然后按一下 \(反斜杠键) ,Vim 就会把光标所在行删掉。

现在进入可视化模式,然后尝试按一下 \(反斜杠键),什么事情也不会发生,因为我们告诉了 Vim,那个映射仅仅在常规模式下面生效(注意这个反斜杠键在默认情况下是什么也不干的)。

再运行一下这个命令:

:vmap \ U

进入可视化模式,然后选择一些文本,再来按一下 \(反斜杠键) 。Vim 会将(选中的)文本变成大写!

在常规模式和可视化模式里面反复试一下反斜杠键,注意现在这个键的行为在这两种模式下面的行为已经完全不同了。

肌肉记忆 (Muscle Memory)

【译注:

感觉这个标题有点奇怪,然后百度百科了一下,原来肌肉记忆是指那种获得非常缓慢,但是记忆非常牢固的那种条件反射。作者的意图是通过这个名词来类比 Vim 技能,同样具有“不易获得,也不易遗忘”的这种特性。

开始的时候,在不同的模式下面将相同的键映射到不同的动作,听起来是一个很糟糕的注意:为什么我们按这个键的时候要停下来想想现在正处于哪一个模式呢?键映射所省下来的时间还不如在这上面耗费的时间多呢。

现实的结果告诉我们这根本不是一个问题,一旦你开始使用 Vim 了,输入的时候你就不会再思考你正在使用的这些独立的按键了。你会想:“删除一行”而不是“摁一下 dd”。你的手指和大脑会学习你的映射,然后这些键就变成下意识(subconscious)的操作了。

插入模式

现在我们已经学过如何在常规模式和可视化模式里面去做键映射了,现在我们进入到插入模式。运行下面的命令:

:imap <c-d> dd

你可能会以为(这个映射)会让你在插入模式的时候,按 Ctrl+d 就会删掉当前的行,这很方便,因为你不需要切回常规模式来删掉一行。

来吧,试一下,其实没用的。它只会让你在文件中输入两个字符 d,这就没啥用了。

问题在于,Vim 只会(机械地)做我们实实在在告诉它的(那些动作)。我们说:“当我按一下 <c-d> 我想你做按 d 再按 d 一般会做的事情。”好的,一般来说如果你在插入模式里面按两下 d,那么你就会在那行里面输入两个 d(字符)。

为了让这个映射完成我们所打算的工作,我们要把这一些做的更直白(explicit)一些。运行这个命令来改变映射:

:imap <c-d> <esc>dd

这个 <esc> 键就是我们告诉 Vim 按一下 Escape 键的方法,这可以让我们退出插入模式。

试一下这个映射,它生效了,但是注意你现在已经返回了常规模式。这是讲得通的,因为我们告诉 Vim <c-d> 应该退出插入模式然后删掉一个行,但我们却未曾告诉它让它切回插入模式。

再运行一个命令来修正这个映射,一劳永逸(once and for all)。

:imap <c-d> <esc>ddi

末尾的 i (让 Vim)进入插入模式,这就完整地完成了我们的这个映射。

练习

设置一个映射,让你能够在插入模式中通过按 <c-u> 来将当前的单词转换为大写。记得,U 键在可视化模式下面可以将选中部分变成大写。我发现这个映射在当我写一个像 MAX_CONNECTIONS_ALLOWED 这样的很长的常量的时候太有用了。我可以直接小写输入这个单词,然后用这个映射将它整体变成大写,而不用一直摁着 shift 键。

然后将这个映射加到你的 ~/.vimrc 文件里头。

【译注:

:imap <c-u> <esc>viwUi

拙解:先 <esc> 退出插入模式,然后 v 进入可视化模式,然后 iw 选择当前单词,然后 U 将其变为大写,然后 i 回到插入模式。

设置一个映射,让你可以在常规模式里面通过按 <c-u> 来将当前的单词转换为大写。这跟上面的这个映射有些不同,因为你不需要进入唱过模式。在这里你应该结束在常规模式,而不是插入模式了。

然后将这个映射加到你的 ~/.vimrc 文件里头。

【译注:

 :nmap <c-u> viwU


【转载请附】愿以此功德,回向 >>

原文链接:https://www.huangwenchao.com.cn/2014/10/vimscript-hard-4.html【Learning Vimscript The Hard Way — (4) Modal Mapping/模态映射】

发表评论

电子邮件地址不会被公开。 必填项已用*标注