Vim / Neovim 当你有 lua 函数时为什么要使用自动命令?

Cad*_*ade 0 vim lua neovim

我对 vim 有一些经验,但我的大部分时间都花在 neovim 上玩 lua (尽管我仍然不是初学者)。我错过了 vimscript 自动命令的魔力,我看到很多人都在使用它,我想知道为什么不直接写一个 lua 函数,比如......

function OpenTerm()
  vim.cmd("bel split")
  vim.cmd("terminal")
  vim.cmd("setlocal nonumber norelativenumber")
end
Run Code Online (Sandbox Code Playgroud)

而不是写一个 autocmd ?

rom*_*inl 12

你把两个完全不相关的事情混为一谈了。

你的代码片段(假设它有效,我不使用 Neovim,所以我不会测试它):

function OpenTerm()
  vim.cmd("bel split")
  vim.cmd("terminal")
  vim.cmd("setlocal nonumber norelativenumber")
end
Run Code Online (Sandbox Code Playgroud)

是一个 Lua 函数,与此 Vimscript 函数完全相同:

function! OpenTerm()
  bel split
  terminal
  setlocal nonumber norelativenumber
endfunction
Run Code Online (Sandbox Code Playgroud)

这两个函数实际上与自动命令无关。它们是完全被动的,定义它们只做了一些低级的与内存相关的事情。为了让他们做任何事情,你必须打电话给他们

自动命令是一种非常不同的东西,它允许您告诉 Vim 在事件发生时执行某些操作,如下所示:

autocmd VimEnter * call OpenTerm()
Run Code Online (Sandbox Code Playgroud)

从本质上讲,它告诉 Vim:

启动完成后,调用该OpenTerm()函数。

与在调用之前不执行任何操作的函数不同,自动命令一旦定义就会对编辑器的状态产生真正的影响。

您可以从函数添加自动命令,可以从自动命令调用函数,但不能指望一个函数充当另一个函数。

基本上,问题是“我使用自动命令还是函数?” 完全没有意义。