从零开始配置 vim(6)——缩写
关于vim能快速编辑文本的能力,我们见识到了 operator + motion
,见识到了.
范式和宏。甚至可以使用命令来加快文本编辑。在后面我们又介绍了快捷键绑定来快速执行我们想要的操作。今天我们再来介绍一个新的能加快我们编辑文本速度的东西——Abbreviations
缩写简介
Abbreviations
翻译成中文的意思大概是缩写。但是仅仅以缩写来描述这个特性,似乎是不够的,但是也找不到准确的中文来描述,暂时就采用这个名称吧。它的这个特性允许我们将输入的一段内容自动更新为新的内容
我们先来体验一下它的基本用法。
在命令中输入 :iabbrev mian main
我们输入 mian(
后它会自动将内容替换为 main(
。这样即使我们手误将 main
写成了 mian
,vim能自动帮我们更新。再也不用怕编辑器报找不到 main
函数了
我们发现了它的第一个用途——纠正笔误。但是基于这一特性,我们还可以使用几个简单的字符来快速展开成常用的长文本。例如
:iabbrev pcr Copyright 2022 Masimaro, all rights reserved
通过输入 pcr(program copy right)
来快速产生一条程序的版权信息。
又或者在 python
使用 nmain
展开成 if name== "__main__":
。快速写下测试语句。
我们发现 iabbrev
是 i+ abbrev
合成的一条命令。看到这相信各位小伙伴应该明白了。这个命令是作用于插入模式下。该特性还可以作用于 命令模式和替换模式。但是这里就不对它做深入的介绍了。有兴趣的小伙伴可以查看vim手册来了解。
对比键盘映射
我们可以使用快捷键映射来达到同样的效果,例如我们可以定义 :inoremap mian <esc>viwdimain
同样可以达到更正 mian
为 main
的效果
但是我们发现这有几个弊端,第一因为我们定义了一个 mian
的关键字,这就需要手速要够快了,在短时间内输入完成 mian
。第二我们针对只输入mian
确实能达到更正的效果,但是如果我连着其他的语句一起输入就不一定有这个效果了,例如我们想输入 miantest
但是它会给我们替换成 maintest
这就有点得不偿失了。在这种情况下,abbreviations
可以正常工作。而且我们发现相比于使用映射,abbreviations
显的更为简洁,也更加符合逻辑。
keywords characters
我们发现在使用 abbreviations
这一特性的时候,只有在输入空格或者回车的时候它才会启用自动更新,但是输入字母的时候却不会。如何定义输入何种字符的时候它才会启用自动更新呢?
abbreviations
这一特性是在我们输入 non-keyword character
的时候会检查上一个 non-keyword character
到这个之间的单词是否符合之前定义的替换规则,如果符合将会发生替换行为,否则不会发生。只要定义了 non-keyword character
就可以定义它发生更新的时机。那么我们该如何定义 non-keyword character
字符呢?
只要不在 iskeyword
中的字符都算是 non-keyword character
。我们执行 set iskeyword?
可以看到 iskeyword
的定义如下:
@,48-57,_,192-255
看起来很复杂是不是?首先 @
代表字母字符,48-57是字符0到字符9的ascii 编码,_
单纯的代表下划线,192-255代表ascii码中一些特殊字符。你只需要记住它包含一切字母,数字,_ 以及一些特殊字符。或者更简单的说,格式控制字符(像空格、制表符、回车)都会触发这一行为。如果你想修改 keyword
。可以在vim手册中详细阅读关于 iskeyword
部分的说明。这里就不再过多介绍,我认为当前定义更符合编码时的直觉。
本地缓冲缩写
结合上一章学习的本地设置,我们也可以设置本地缓冲的缩写,例如
:iabbre <buffer> mian main
我们发现它只在当前缓冲区中启用了。
到现在我们似乎可以结合缩写的这个特性完成代码片段的功能呢。但是别着急,要得到这个功能,还得接着往下学习。
如何形成记忆
跟快捷键类似,我们一时兴起,根据自己的习惯定义了一堆缩写,例如 定义 fnc
为 function
,定义 ret
为 return
结果自己之前养成了把这些关键字都输全的习惯。后面怎么也改不过来,这些都白定义了,该如何解决这个问题呢?
与我们当初禁用快捷键类似,我们也可以禁用某些内容,只是iabbrev
并没有提供类似 <nop>
的指令已达到禁用的目的,但是我们我们可以将对应的字符串映射成为某些无效的字符。例如我们使用如下两个命令
:iabbrev return <space>
:iabbrev ret return
为了养成习惯我们将 return
映射为空格,一旦我们习惯输入 return
就会意识到我们已经用简写 ret
代替了。当我们养成肌肉记忆之后这条映射的作用也就显得可有可无了。