是否有一种简单的方法可以在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命令.该发现部分得到我们这样的:
[^=]*
...... 表示\s\+
(\
前面的额外+
是vim古怪)=
任意数量的空格,=\s\+
[^;]*
然后我们抛出一些捕获括号来保存构造替换字符串所需的\(
东西,这就是东西\)
语法
最后,我们在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)
宏的解释
<BACKSPACE>
= <ESC>
<ESC>