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

Vim / Neovim Why use autocommands when you have lua functions?

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

function OpenTerm()
  vim.cmd("bel split")
  vim.cmd("terminal")
  vim.cmd("setlocal nonumber norelativenumber")
end

而不是写一个 autocmd ?

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

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

function OpenTerm()
  vim.cmd("bel split")
  vim.cmd("terminal")
  vim.cmd("setlocal nonumber norelativenumber")
end

是一个 Lua 函数,它完全等同于这个 Vim 脚本函数:

function! OpenTerm()
  bel split
  terminal
  setlocal nonumber norelativenumber
endfunction

这两个函数实际上与自动命令无关。它们完全是被动的,定义它们只是做了一些 low-level memory-related 的事情。要让他们做任何事情,你必须打电话给他们

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

autocmd VimEnter * call OpenTerm()

这基本上告诉 Vim 这个:

When you are done starting up, call the OpenTerm() function.

与在调用之前什么都不做的函数不同,自动命令一旦定义就会对编辑器的状态产生真正的影响。

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

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