You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

这里%表示对所有行生效,$匹配行尾,这样每行末尾都会自动加上对应的变量映射。

另外还有个备选方案是宏录制,适合喜欢手动操作的场景:

  1. 把光标移到第一个变量名的开头(比如STORAGE_PORT的S上)
  2. 按qa开始录制宏(存在a寄存器)
  3. 依次执行:yiW(复制整个变量名)→ A (在行尾插入空格)→ Ctrl+r 0(粘贴刚才复制的变量名)→ 输入: → 再按Ctrl+r 0(再次粘贴变量名)→ w(跳到下一个变量的开头)
  4. 按q停止录制
  5. 按@a执行一次宏,@@重复执行,直到所有变量处理完成。不过替换命令显然更高效,尤其是变量数量多的时候。

内容的提问来源于stack exchange,提问作者LuoLeKe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:41:19