【问题标题】:Vim keyboard shortcut: Deleting code without deleting the if statementVim 键盘快捷键:删除代码而不删除 if 语句
【发布时间】:2014-08-23 16:09:43
【问题描述】:

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

感谢您的帮助。

【问题讨论】:

    标签: vim keyboard-shortcuts shortcut


    【解决方案1】:

    作为 Zachs 解决方案的替代方案,您可以使用以下方法:

    di{Vk]p
    

    说明:

    { } 块内开始,di{delete inside { } 块。

    然后,您选择要删除的 if 语句,现在是两行。 Vk 选择两者,然后用p 将刚刚删除的块粘贴到上面。 ] 使粘贴的块正确缩进(感谢 Kache)

    粘贴部分可能有更优雅的解决方案,但这是我想到的第一个。

    Zachs 答案的优势在于,您不必将光标移动到带有 if 的行,您只需进入其中(尽管您可能会遇到嵌套 {} 块的问题,这通常有)。此外,您不需要修复缩进。

    【讨论】:

    • 如果您在p 之前添加],它将粘贴到与周围代码相同的缩进级别。
    【解决方案2】:

    将光标移动到 if 语句所在行的任意位置。下面是命令顺序(后面会解释)

    $%dd''.
    

    解释

    $ 移动到行尾(光标现在位于{)。

    % 转到匹配的大括号(或括号等...)。光标现在位于 if 语句的 }

    dd 删除光标所在的行(} 现已删除)

    '' 转到最后跳转的行。最后一次跳转是我们使用% 的时候。 (光标回到 if 语句行)

    . 重复上一个命令 (dd)。这将删除该行(如果现在删除了语句行)

    结果:

        // 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(你可以选择任何键,只需替换&lt;C-d&gt;)Vim 将运行这些命令,执行我之前解释的操作,这次是整个文件缩进。使用此命令时,请确保您的光标位于 if 语句行,否则可能会出现意外结果。

    【讨论】:

    • 不会取消缩进块。当然,这只是多了几笔而已。
    • 阅读结果部分中的行。确实我没有在原始命令集中包含缩进
    • 要取消缩进只是该部分,在您的命令前加上$&lt;%。我相信您知道,使用gg=G 将进行格式化,并将完成整个文件。这可能会做 OP 不想要的事情。
    • 非常正确,我现在会解决这个问题(加上它更少的击键:))
    • 前缀,不是后缀。如果它在最后它只会在 for 循环体本身是一个块时才有效,在这种情况下它有一个注释所以它不会工作
    猜你喜欢
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 2014-02-19
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    相关资源
    最近更新 更多