当前位置:网站首页>从零开始配置 vim(6)——缩写
从零开始配置 vim(6)——缩写
2022-08-04 12:29:00 【aluluka】
关于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 代替了。当我们养成肌肉记忆之后这条映射的作用也就显得可有可无了。
边栏推荐
猜你喜欢
随机推荐
面试官:连 INSERT INTO SET 都不知道怎么用,你这3年都干些什么了?
DC/DC电感底部要不要覆铜?
云原生Devops 的实现方法
【Game Of AutoTest】1、再度启程,重识游戏自动化测试
开发小程序插件如何实现盈利?
"Lonely Walking on the Moon" is a powerful medicine, it can't cure the internal friction of happy twist
微信小程序使用腾讯云对象储存上传图片
鲜花“刺客”收割七夕
【PHP实现微信公众平台开发—基础篇】第2章 微信公众账号及申请流程详解
【UML】信息系统分析与设计知识点总结
两个数组中用第二个数组的Value对比换第一个数组中的Key
电源输出的Overshoot和Undershoot 测试
UMA & Hong Kong Polytechnic & Ali propose SP-ViT to learn 2D space prior knowledge for visual Transformer!
“蔚来杯“2022牛客暑期多校训练营3 C
Do you understand the various configurations in the project?
Matlab记录
小程序在政务服务平台建设中如何发挥价值
如何让 WPF 程序更好地适配 UI 自动化
LeetCode Daily Question (858. Mirror Reflection)
Hit the interview!The latest interview booklet of Ali Jin, nine silver and ten is stable!









