下面列举一些用 Vim 来编辑文本的例子:
这里提供的解决方案并不是最简(最少按键数)的方案,仅供参考。
注:按键数即 Keystroke, 一般一个组合键(如 Ctrl-C)算一个 Keystroke.
实例 1: 文本交换
原始文本Nothing is impossible.
目标文本Impossible is nothing.
解决方案 (Keystroke 13)cxewwcxevu0vU
依赖插件
vim-exchange
操作说明
Vim 通过 vim-exchange 插件很容易实现两段文本的位置互换。
用 cx 选取两段需要交换的文本即可,Visual Mode 下用 X 选取。
帮助文档:h exchange
实例 2: 自动使用中英文标点
原始文本<遗迹保卫战>(英语: Defense of the Ancients), 通常简称DotA, 中文也译刀塔, 是以<魔兽争霸III>资料片<魔兽争霸III: 冰封王座>为基础制作的一系列角色扮演 (RPG) 类型自定义地图.
目标文本《遗迹保卫战》(英语:Defense of the Ancients), 通常简称 DotA, 中文也译刀塔,是以《魔兽争霸 III》资料片《魔兽争霸 III:冰封王座》为基础制作的一系列角色扮演 (RPG) 类型自定义地图。
解决方案 (Keystroke 1)<Alt-Shift-P>
依赖插件
pangu.vim (组合键可自定义, 具体配置可参考Vim 安装指南)
操作说明
中英文标点在格式上存在差异。如英文符号后面经常需要加一个空格;中文标点是全角符号,而英文标点是半角符号。
在中英文混用的时候,这种差异会导致很多不便。不少人的解决方法是只用英文半角符号。
有没有一种方法可以保留半角英文符号的输入习惯,却能自动根据中英文的不同而自动使用全角中文符号或半角英文符号呢?
答案是肯定的。从上面的例子可以看到,使用 pangu.vim 插件后,可以实现一键更正中英文标点符号。
当然 pangu.vim 的某些规则和实现可能跟你的需求不一样。
如果是规则问题,可以查看该规则是否可以配置或者自行修改插件;
如果是实现问题,可以手动解决或者想一些更好的办法。
比如该插件目前不能自动把英文引号””替换成中文引号“”,估计是因为在嵌套情况下英文引号的开始和结束很难判断。
下面的实例 3, 我写了一个把英文引号替换成中文引号的命令行,简化了手动替换,仅供参考。
帮助文档:h pangu
实例 3: 把英文引号替换成中文引号
原始文本"须菩提:于意云何?可以身相见如来不?"
"不也,世尊!不可以身相得见如来。何以故?如来所说身相,即非身相。"
佛告须菩提:"凡所有相皆是虚妄,若见诸相非相,即见如来。"
目标文本“须菩提:于意云何?可以身相见如来不?”
“不也,世尊!不可以身相得见如来。何以故?如来所说身相,即非身相。”
佛告须菩提:“凡所有相皆是虚妄,若见诸相非相,即见如来。”
解决方案 (Keystroke 39):let a=['”','“']|%s/"/=reverse(a)[0]/g
依赖插件
无
操作说明
这个替换命令行逻辑比较简单,假定了英文引号没有嵌套,且成对出现没有缺失。
如果不满足条件,则需要手动替换,或者用 Visual Mode 选定符合条件的部分文本,再用命令行进行替换。:let a=['”','“']|'<,'>s/"/=reverse(a)[0]/g
这个使用了变量和函数的命令行展示了 Vim 解决问题的潜力。
帮助文档:h substitute
实例 4: 处理包围字符
原始文本1, 2, 3, 4, 5
目标文本(1, 2, 3, 4, 5)[1, 2, 3, 4, 5]1, 2, 3, 4, 5
解决方案 (Keystroke 4, 4, 3)ys$)cs)]ds]
依赖插件
surround.vim
操作说明
ys 用于添加包围字符;cs 用于改变包围字符;ds 用于删除包围字符。
使用这些命令时,光标应该位于内层字符。Visual Mode 下选取文本后,可用 S 来添加包围字符。
Visual Mode 下添加[]包围:S]
帮助文档:h surround
实例 5: 删除所有空行
原始文本有两样东西,越是经常而持久地对它们进行反复思考,它们就越是使心灵充满常新而日益增长的惊赞和敬畏:我头上的星空和我心中的道德法则。三样东西,有助于缓解生命的辛劳:希望、睡眠和微笑。生得伟大者,笑对无常。
目标文本有两样东西,越是经常而持久地对它们进行反复思考,它们就越是使心灵充满常新而日益增长的惊赞和敬畏:我头上的星空和我心中的道德法则。
三样东西,有助于缓解生命的辛劳:希望、睡眠和微笑。
生得伟大者,笑对无常。
解决方案 (Keystroke 7):g/^$/d
或:v/\S/d " :v is equivalent to :g!
依赖插件
无
操作说明
^$是用来搜索空行的正则表达式.
:v等同于:g!
这里的例子只有 2 个空行,可以直接 dd 删除。这个解决方案更适合需要删除大量空行的情况。
帮助文档:h :g
:h :d
:h :v
:h \S