交换等号周围的文字

J. *_*fer 10 vi vim

是否有一种简单的方法可以在vi/vim中围绕等号翻转代码?

例如:我想转此:

value._1 = return_val.delta_clear_flags;
value._2._1 = return_val.delta_inactive_time_ts.tv_sec;
value._2._2 = return_val.delta_inactive_time_ts.tv_nsec;
value._3    = return_val.delta_inactive_distance_km;
(...)
Run Code Online (Sandbox Code Playgroud)

进入这个:

return_val.delta_clear_flags = value._1;
return_val.delta_inactive_time_ts.tv_sec = value._2._1;
return_val.delta_inactive_time_ts.tv_nsec = value._2._2;
return_val.delta_inactive_distance_km = value._3;
(...)
Run Code Online (Sandbox Code Playgroud)

在文件中的很多行上.

我知道这看起来有点微不足道,但是在过去我需要这样做的时候我已经遇到了很多情况,而且我从来没有一个好主意/方法来做到这一点没有需要在vim中输入大量内容,或者编写awk脚本.我认为这可以通过vi中的一个衬垫实现.

单行的解释是非常受欢迎的,当我选择我接受的答案时,将会高度重视.:)

Ark*_*ady 25

像这样的东西:

:%s/\([^=]*\)\s\+=\s\+\([^;]*\)/\2 = \1
Run Code Online (Sandbox Code Playgroud)

如果您的代码比示例中显示的代码更复杂,则可能需要稍微调整一下.

编辑:解释

我们使用s/find /replace命令.该发现部分得到我们这样的:

  1. 最长的可能的字符串,包含任何 - 等号,由[^=]*...... 表示
  2. ...后跟一个或多个空格,\s\+(\前面的额外+是vim古怪)
  3. ......后面跟着=任意数量的空格,=\s\+
  4. ...后跟最长的非分号字符串, [^;]*

然后我们抛出一些捕获括号来保存构造替换字符串所需的\(东西,这就是东西\)语法

最后,我们在find replace命令的替换部分中使用捕获的字符串:即和.s//\1\2


wxs*_*wxs 12

为了感兴趣,以下是我作为录制宏的方式:

qq0"+df=xA<BACKSPACE> = <ESC>"+pxi;<ESC>jq
Run Code Online (Sandbox Code Playgroud)

在第一行上执行该操作可将"q"宏设置为执行所需操作.然后在每个后续行上,您可以通过键入以下内容来执行宏:

@q
Run Code Online (Sandbox Code Playgroud)

或者,假设您要将宏应用于接下来的10行:

10@q
Run Code Online (Sandbox Code Playgroud)

我总是发现像这样快速切换的宏比找出正则表达式更容易,因为它们本质上是我手工操作的扩展.

编辑:Dan Olson在他的评论中指出,如果你想将宏应用于一系列行,例如6-100行,你可以输入以下内容.我不知道是否有一个更简洁的语法,不需要".*"模式匹配.

:6,100g/.*/normal @q
Run Code Online (Sandbox Code Playgroud)

宏的解释

  • QQ
    • 开始在寄存器中记录q
  • 0
    • 去行的开头
  • "+ DF =
    • 删除'='并将文本放入'+'寄存器
  • X
    • 删除额外的空间
  • 一个
    • 转到行尾并进入插入模式
  • <BACKSPACE> = <ESC>
    • 删除分号,插入等号和空格
  • "+ P
    • 将先前复制的测试插入寄存器'+'
  • 喜;<ESC>
    • 重新插入尾随分号
  • Ĵ
    • 下移到下一行,准备重新应用宏
  • q
    • 停止录音