如何通过Vim命令在指定文本首尾添加删除线并避免插入模式问题?
这个问题我太熟悉啦!你遇到的是Vim里:normal命令执行插入操作后没法自动退出插入模式的坑,给你几个更顺畅的解决方案:
1. 改进你的:normal命令,一步到位
原来的命令因为用i进入插入模式后没退出,导致后续命令都变成了输入内容。你可以把两个步骤合并成一条:normal命令,并且加入退出插入模式的操作——在命令行里输入<Esc>的话,需要按Ctrl+V再按Esc,会显示成^[:
:normal 02wi~~^[A~~
拆解一下逻辑:
0:跳到行首2w:跳到列表项文本的第一个字符(跳过-和空格)i~~:在文本开头插入~~^[:退出插入模式(就是Esc的命令行表示)A~~:跳到行尾插入~~
2. 用替换命令更高效(推荐)
如果只是给当前行的列表项加删除线,或者要批量处理,直接用正则替换命令更省心:
:s/^\s*-\s*\(.*\)/- ~~\1~~/
这个命令会自动匹配行首的- (包括前面可能有的空格),把后面的文本用~~包裹起来。要是想处理所有行,就加个%前缀::%s/^\s*-\s*\(.*\)/- ~~\1~~/g
3. 可视化操作的命令版
如果你习惯用可视化选中的思路,也可以用这条命令模拟手动选中文本再包裹:
:normal 0f lv$h"ayA~~^[0f lP
不过这个相对复杂,不如前面两个方法直接,适合好奇原理的同学~
内容的提问来源于stack exchange,提问作者Mastermind
相关产品推荐
相关产品推荐

