这可能是所有那些vim大师的基本vim问题。
如果我想删除特定的if语句及其右括号,但不删除表达式中的代码,如何通过一些键盘快捷键来实现这一点?
例如:
if (a == 2) {
// do not delete this part.
for (int i = 1; i < 10; i++) {
// code
}
}
结果将是:
// do not delete this part.
for (int i = 1; i < 10; i++) {
// code
}
感谢您的任何帮助。
除了 Zachs 解决方案,您可以使用以下内容:
di{Vk]p
解释:
您从{ }
块内开始,di{
delete inside
{ }
块。
然后,选择要删除的 if 语句,该语句现在是两行。 Vk
选择两者,然后将刚刚删除的块粘贴到上面,并带有p
.]
使粘贴的块正确缩进(谢谢,Kache(
粘贴部分可能有一个更优雅的解决方案,这是第一个想到的解决方案。
对 Zachs 答案的优势是,您不必将光标移动到带有if
的行,您只需要在其中(尽管您可能会遇到嵌套{}
块的麻烦,通常有(。此外,您无需修复缩进。
光标移动到带有 if 语句的行上的任意位置。这是命令的顺序(稍后将解释(
$%dd''.
解释:
$
转到行尾(光标现在位于{
上(。
%
转到匹配的大括号(或括号等(。光标现在位于 if 语句的}
上
dd
删除光标所在的行(}
现在被删除(
''
转到最后一跳的线。最后一次跳跃是当我们使用%
.(光标回到 if 语句行上(
.
重复上一个命令 ( dd
(。这将删除该行(如果语句行现在已删除(
结果:
// do not delete this part.
for (int i = 1; i < 10; i++) {
// code
}
缩进将关闭,因此您可以使用gg=G
(正确缩进文件(来修复它。
如果你经常这样做,你可以把它映射到你的.vimrc中的一个键,或者你可以把它做成一个宏
。将其制作成映射:
.vimrc 中的映射示例:
nnoremap <C-d> $%dd''.gg=G
每当您按control-d
(您可以选择任何键,只需替换<C-d>
(时,Vim 都会运行这些命令,执行我之前解释的操作,然后这次是整个文件缩进。使用此命令时,请确保光标位于 if 语句行上,否则可能会出现意外结果。