对于所有那些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
}
感谢您的帮助。
答案 0 :(得分:3)
Zachs解决方案的替代方案,您可以使用:
di{Vk]p
<强>解释强>
您从{ }
块开始,di{
delete inside
阻止{ }
块。
然后,选择要删除的if语句,现在是两行。 Vk
选择两者,然后使用p
粘贴刚刚删除的块。 ]
使粘贴的块正确缩进(谢谢,Kache)
粘贴部分可能会有更优雅的解决方案,但这是第一个浮现在脑海中的解决方案。
对Zachs的回答是,您不必将光标移动到if
的行,您只需将其置于其中(尽管您可能遇到嵌套{{1}的问题通常有的块)。此外,您不需要修复缩进。
答案 1 :(得分:2)
使用if语句将光标移动到该行的任何位置。这是命令序列(将在后面解释)
$%dd''.
<强>解释强>:
$
到达行尾(光标现在位于{
)。
%
转到匹配的花括号(或括号等...)。光标现在位于if语句的}
dd
删除光标所在的行(}
现已删除)
''
进入最后一跳的行。最后一次跳转是我们使用%
的时候。 (如果语句行,则返回光标)
.
重复上一个命令(dd
)。这将删除该行(if语句行现在已删除)
<强>结果:强>
// do not delete this part.
for (int i = 1; i < 10; i++) {
// code
}
缩进将关闭,因此您可以使用gg=G
(正确缩进文件)来修复它。
如果您这样做很多,可以在.vimrc中制作map it to a key,也可以将其设为macro
将其制作成映射:
.vimrc中的映射示例:
nnoremap <C-d> $%dd''.gg=G
每当你按control-d
(你可以选择任何键,只需替换<C-d>
)时,Vim会运行这些命令,执行我之前解释过的操作,然后再进行整个文件缩进。使用此命令时,请确保光标位于if语句行,否则可能会出现意外结果。