Vim键盘快捷键:删除代码而不删除if语句

时间:2014-08-23 16:09:43

标签: vim keyboard-shortcuts shortcut

对于所有那些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 
}

感谢您的帮助。

2 个答案:

答案 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语句行,否则可能会出现意外结果。