I have the following Ruby code:
if some_cond && another
foo_bar
end
我想要把它改成:
foo_bar if some_cond && another
什么是在Vim中最常用的方法?
I have the following Ruby code:
if some_cond && another
foo_bar
end
我想要把它改成:
foo_bar if some_cond && another
if
行(不一定在该行的开头),我将使用以下正常模式命令序列:ddjVpkJ<<
或者使用以下 Ex 命令链:
:m+|-j|<|+d
这里使用:move +
命令将if
行向下移动一行。
:move
命令会剪切给定范围的行(如果未指定,则为当前行)并将其粘贴到由参数指定的行下面。
+
地址是对下一行的.+1
的简写(详情请参见:help {address}
)。
其次,包含条件语句主体的行与刚刚移动的if
行连接在了一起。 :join
命令将给定范围的行连接成一行。
-
范围是.-1
的缩写地址,引用光标上方的行(详情请参见:help {address}
)。
第三,使用:<
命令减少一次shiftwidth
缩进。
最后,剩余的end
行现在可以用+
来访问,并使用:delete
命令删除。
另一种方式:
ddpkJjdd
光标位于第一行的第一个字符:
if
条件,但保持光标在原位(不删除该行)if
条件光标位于第一行的第一个字符,如前所述:
if
条件另一种解决方案:
这可能不是最优的,但我可以不加思考地执行它,因为这些命令中的大多数都在我的肌肉记忆中(大多数时间你不会想如何移动,如何复制/删除和粘贴,而且记住合并行也很有帮助)。
如果您在配置文件中启用了 virtualedit
,则可以使用 $ <Space> 代替 A <Space> <Esc>,但我发现相对于 A 后跟 Ctrl-[(类似于 ESC),$ 更难使用。
有大概30种方法可以做到这一点。
这里是其中一种,假设您从单词end
的末尾开始:
dd(删除最后一行)
"aD(删除并将foo_bar
复制到缓冲区a
)
dd(删除现在为空的第二行)
"aP(从缓冲区a
粘贴到插入符前)
aSpaceEsc(插入空格并返回正常模式)
同样,在Vim中,“正确地”做某事很少适用,因为有很多方法可以完成某件事。这是如此微小的变化,以至于重新输入foo_bar
也是可以接受的。
:s//
,但这个更好,我可能会自己映射它。 - Peter Rincker:s/^\s*\(if .*\)\n\(\_.*\)\n\s*end\>/\2 \1/|<
这样的也足够好用。 - ib.:h :m
、:h :j
、:h :<
、:h :d
和:h {ad
。 - ib.