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.
与在调用之前什么都不做的函数不同,自动命令一旦定义就会对编辑器的状态产生真正的影响。
您可以从一个函数添加一个自动命令,您可以从一个自动命令调用一个函数,但您不能指望一个作为另一个。
基本上,问题“我使用自动命令还是函数?”完全没有意义。
我对 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.
与在调用之前什么都不做的函数不同,自动命令一旦定义就会对编辑器的状态产生真正的影响。
您可以从一个函数添加一个自动命令,您可以从一个自动命令调用一个函数,但您不能指望一个作为另一个。
基本上,问题“我使用自动命令还是函数?”完全没有意义。