Skip to content
On this page

开发利器:快速删除一个函数

对于代码佬日常的开发工作中,常常需要把同事或者自己写的一些屎山代码函数删除;在之前的练习中,我们曾提到过 p 这个代指段落的文本对象,所以想到要删除一个函数我们可能会先想到用它来实现,比如 dap 如此这般;但因为段落的定义是空行之间的内容为不同段落,这在一些情况下无法满足我们删除一个函数的需求,如:

const test = (a = 1) => {
  console.log(a)
  a = 2
  
  setTimeout(() => {
    console.log(a)
  }, 500);
}

我们可以注意到,在函数内部有一个空行,这时我们在空行的上方或者下方使用 dap,则只会删除一半的函数。那有没有更好的方法呢?那肯定是有的,不过我们要先来了解一下 % 命令和 vim-indent-object。

% - 匹配括号

在 vim 中,我们可以通过 % 来匹配括号,即括号 ()、中括号 []、大括号 {},当我们的光标在括号上时,我们使用 % 可以跳到与当前括号成对的另外一个括号上。

vim-indent-object - vim 缩进对象

这个是 vim 自带的一个扩展插件,该插件基于缩进级别定义了一个新的文本对象 i;即我们可以使用它来基于缩进进行一些操作,如 >ii 可以把同一个缩进级别的内容全部往右移动一个缩进(中间的 i 是指 inner)。

删除函数

通过我们上面提到的两个指令,我们就可以来研究一下怎么删除一下函数了;对于大部分使用缩进的来规范语法结构的语言如 Python 、JavaScript 等,它们的函数也是有着明显的缩进规律的,这时,我们可以使用 daI 来实现删除函数,但前提是光标在函数的内部;但如果如下面这种情况:

  const test1 = (a = 1) => {
    console.log(a)
    a = 11
    
    setTimeout(() => {
      console.log(a)
    }, 500);
  }

  const test2 = (a = 2) => {
    console.log(a)
    a = 22
    
    setTimeout(() => {
      console.log(a)
    }, 500);
  }

如果光标在 test1 或 test2 函数名那一行并使用 daI,则会把两个函数都删除;因为对于这两个函数来说,它们有同样的缩进级别。当然,在大部分情况下,daI 都是够用了的;为了让我们用得更顺手一些,我们可以把 ai 映射成 aI

  "vim.operatorPendingModeKeyBindings": [
    {
      "before": ["a", "i"],
      "after": ["a", "I"]
    }
  ],
  "vim.visualModeKeyBindings": [
    {
        "before": ["a", "i"],
        "after": ["a", "I"]
    },        
  ]

这样我们在可视化模式或者操作待决模式(operator pending mode)时可以直接使用 i 代替 I

而为了弥补上面提到的 vim-indent-object 的短板,我们还可以通过 % 配合 <Leader> 来实现删除函数;首先,对于光标在函数名所在行时(如上面提到的例子),我们可以使用 V 来选中当前行,然后需要把光标移动行末,即 $,这时光标在花括号上,再键入 %,这时候就可以选中到函数的闭合符处,最后键入 d,即可把函数删除;总的指令就是 V$%d。但是这么长一个命令未免太麻烦,这时我们就可以用 <Leader> 来映射:

  "vim.normalModeKeyBindings": [
    {
      "before": ["<Leader>", "d", "f"],
      "after": ["V", "$", "%", "d"]
    },
  ],

这样当我们光标在函数名那一行时就可以通过 <Leader> + df 来快速删除一个函数了。再加上前面提到的光标在函数内部时的删除命令,基本可以应付大部分的情况了。