如何在Vim中优雅实现多行字符复制粘贴及Shell变量批量改写?
嘿,这两个Vim操作问题我太熟了,给你分享几个优雅的解决方案:
需求一:多行不同长度字符的复制粘贴操作
针对不同的场景,有几种实用的操作方式:
- 复制多行不规则片段:用
visual block模式(按下Ctrl+v进入),你可以精准选中每行中不同长度的目标片段,选中后按y复制,再移动到目标位置按p粘贴。这个模式简直是非对齐多行内容处理的神器。 - 复制整行但仅粘贴内容:如果不想带行尾空格或换行符,先用
yy复制整行,接着用"_dd把原行丢进黑洞寄存器(相当于删除但不占用剪贴板),最后按p粘贴即可;或者直接用"+y复制到系统剪贴板,再在目标位置用"+p粘贴,不过前者更符合Vim原生工作流。 - 批量粘贴到多行指定位置:先复制好要粘贴的内容,进入
normal模式,把光标移到第一行的目标位置,按下Ctrl+v选中所有需要粘贴的行,再按p,就能把内容批量粘贴到每行的对应位置了。
需求二:批量生成变量映射的优雅操作
完全不用逐个复制变量!用Vim的全局替换命令就能一步搞定,效率拉满:
假设你的内容是单行的:
STORAGE_PORT='7000' API_PORT='10000' CLIENT_PORT='9042'
把光标移到这一行,执行以下替换命令:
:s/\(\w\+_PORT\)\='[^']*' /& \1:\1 /g
命令解释:
\(\w\+_PORT\):用括号捕获变量名(比如STORAGE_PORT),这个内容会存在寄存器\1里\='[^']*':匹配变量的赋值部分(比如='7000',包含后面的空格)&:代表刚才匹配到的整个原内容(也就是完整的变量赋值语句)\1:\1:把捕获到的变量名重复两次,中间加冒号,后面补空格g:全局替换,一行里所有匹配的变量都会被处理
执行完之后,这行内容就会变成你想要的样子:
STORAGE_PORT='7000' STORAGE_PORT:STORAGE_PORT API_PORT='10000' API_PORT:API_PORT CLIENT_PORT='9042' CLIENT_PORT:CLIENT_PORT
如果你的变量是每行一个(比如每行单独定义一个PORT),可以把命令改成:
:%s/\(\w\+_PORT\)\='[^']*'$/& \1:\1/g
这里%表示对所有行生效,$匹配行尾,这样每行末尾都会自动加上对应的变量映射。
另外还有个备选方案是宏录制,适合喜欢手动操作的场景:
- 把光标移到第一个变量名的开头(比如
STORAGE_PORT的S上) - 按
qa开始录制宏(存在a寄存器) - 依次执行:
yiW(复制整个变量名)→A(在行尾插入空格)→Ctrl+r 0(粘贴刚才复制的变量名)→ 输入:→ 再按Ctrl+r 0(再次粘贴变量名)→w(跳到下一个变量的开头) - 按
q停止录制 - 按
@a执行一次宏,@@重复执行,直到所有变量处理完成。不过替换命令显然更高效,尤其是变量数量多的时候。
内容的提问来源于stack exchange,提问作者LuoLeKe
相关产品推荐
相关产品推荐

