如何使用Vim命令跨单个运算符交换两个单词?
跨单个运算符交换两个单词的Vim命令方案
当然有啦!Vim原生就支持通过命令组合轻松完成这个操作,不用额外装插件,下面给你两种常用的思路,结合例子讲解更清楚:
假设我们有代码片段:foo + bar,想要把它改成bar + foo,试试这些方法:
方法一:文本对象+寄存器的交互式操作
这种方式适合手动处理单个场景,步骤直观:
- 把光标移到右边的单词
bar上,按下"ayaw—— 这一步是把bar(包括前面的空格)复制到a寄存器里(用自定义寄存器避免覆盖默认剪贴板) - 光标移到左边的单词
foo上,按下daw—— 删除foo和后面的空格,此时文本变成+ bar,foo会被存在默认剪贴板(0寄存器也会同步保存) - 按下
"ap—— 把a寄存器里的bar粘贴到当前位置,现在文本变成bar + bar - 移动光标到
+后面的bar上,按下"0p—— 把0寄存器里的foo粘贴过来,最终就得到了bar + foo
如果觉得记寄存器麻烦,也可以用更简洁的剪切粘贴组合:
- 光标在
bar上,daw删除它,文本变成foo + - 光标移到
foo前面,按p粘贴bar,变成bar foo + - 光标移到
foo后面的空格,按x删掉,再移到+后面按p粘贴foo,同样能完成交换。
方法二:正则表达式替换
如果需要批量处理或者快速修改一行内容,可以用Vim的替换命令:
对于当前行,按下:s/\(\w\+\) \([+*/-=]\) \(\w\+\)/\3 \2 \1/ 回车即可。
解释一下这个正则:
\(\w\+\)匹配第一个单词\([+*/-=]\)匹配单个运算符(你可以根据需要添加更多运算符,比如<>!等)\(\w\+\)匹配第二个单词\3 \2 \1就是把三个分组倒过来,实现交换
如果要处理整个文件,把命令改成:g/\(\w\+\) \([+*/-=]\) \(\w\+\)/s//\3 \2 \1/g 就行。
进阶:自定义映射简化操作
如果你经常需要做这个操作,可以在~/.vimrc里加一个自定义映射,比如:
nnoremap <leader>sw :s/\(\w\+\) \([+*/-=]\) \(\w\+\)/\3 \2 \1/<CR>
之后只要在目标行按下<leader>sw(默认<leader>是反斜杠\),就能一键交换跨运算符的两个单词,效率拉满!
内容的提问来源于stack exchange,提问作者JongHyeon Yeo
相关产品推荐
相关产品推荐

