在 Vim 中使用 `di{` 仅删除函数体

Ros*_*sky 3 vim neovim

我最近开始学习 Vim,并被它关于更改/删除文本对象的行为所困扰,特别是被花括号包围的代码块。

这是代码示例:

function main() {
  console.log("Hello world");
}
Run Code Online (Sandbox Code Playgroud)

如果我将光标移动到单词 function 的开头并输入以下组合:di{Vim 将按预期删除函数体。

但是,如果我将函数移到类中:

class Program {
    main() {
        console.log("Hello world");
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将光标移动到单词的开头main并再次输入相同的组合 Vim 将删除类的主体,而不是函数。

有人可以向我解释它是如何工作的,是否有任何解决方法,或者有经验的 vim 用户在这种情况下会做什么来实现我想要做的事情?

Fri*_*ich 5

di{删除光标所在大括号内的所有内容(助记符:Delete In {)。它不考虑函数名称等语法元素。然而,Vim 确实尊重某些字符成对出现,例如 { 和 }、( 和 )、[ 和 ]、...

它将反向搜索到前一个左大括号并删除匹配右大括号的所有内容。它的作用大致相同?{<CR>d%(尝试一下,看看会发生什么)。

在您的示例中,您位于函数名称上并想要删除相应的函数。然而,Vim 只看到这里的大括号,并且完全按照它的指示执行:删除大括号中的内容,即整个类。

这种情况下可能的解决方法:

  • 移动到该行的下一个左大括号,然后删除:f{di{
  • 移动到行尾(左大括号),然后删除:$di{
  • 将光标向下移动一行(位于大括号内),然后删除:jdi{
  • 删除下一个右大括号的所有内容:d][

这样的例子还在继续......

可能还有适用于您想编写的任何语言的插件。