我最近开始学习 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 用户在这种情况下会做什么来实现我想要做的事情?
这di{
删除光标所在大括号内的所有内容(助记符:Delete In {)。它不考虑函数名称等语法元素。然而,Vim 确实尊重某些字符成对出现,例如 { 和 }、( 和 )、[ 和 ]、...
它将反向搜索到前一个左大括号并删除匹配右大括号的所有内容。它的作用大致相同?{<CR>d%
(尝试一下,看看会发生什么)。
在您的示例中,您位于函数名称上并想要删除相应的函数。然而,Vim 只看到这里的大括号,并且完全按照它的指示执行:删除大括号中的内容,即整个类。
这种情况下可能的解决方法:
f{di{
$di{
jdi{
d][
这样的例子还在继续......
可能还有适用于您想编写的任何语言的插件。