最近如果你关注 Neovim 的社区,就会发现使用 Lua 开发的插件越来越多。
Neovim 默认就支持 luajit,早些时候,做过一次 luajit 与 vim script 速度的比较。
以下是一个测试的 Vim Script 脚本。
function! Fibo(N) abort
let t = a:N
let b = 0
while t > 0
let t = t - 1
let a = 1
let b = 1
let c = 73
while c > 0
let c = c - 1
let tmp = a + b
let a = b
let b = tmp
endwhile
endwhile
echo b
endfunction
function! LuaFibo(N) abort
lua << EOF
local a, b, r, c, t
t = vim.api.nvim_eval("str2nr(a:N)")
while t > 0 do
t = t - 1
a = 1
b = 1
c = 73
while c > 0 do
c = c - 1
r = a + b
a = b
b = r
end
end
print(string.format("%d", b))
EOF
endfunction
function! s:test(...) abort
" for func in a:000
let start = reltime()
call call(a:1,[a:2])
let sec = reltimefloat(reltime(start))
echom printf('%s(%d): %.6g sec', a:1, a:2, sec)
" endfor
endfunction
command! -nargs=+ TestFunc call s:test(<f-args>)
载入以下脚本后执行如下命令可看到测试结果:
:TestFunc Fibo 1000
:TestFunc Fibo 10000000
:TestFunc LuaFibo 1000
:TestFunc LuaFibo 10000000
本地测试结果:
Fibo(1000): 0.410364 sec
Fibo(10000000): 1470.280914 sec
LuaFibo(1000): 9.052000e-4 sec
LuaFibo(10000000): 1.235385 sec
通过以上简单的测试,可以明显看到 luajit 的速度比 Vim script 速度要快很多。 随着 Neovim 对 Lua 的推崇,已经出现了很多使用 Lua 开发的插件。 同时,一些知名的 Vim 插件也被使用 Lua 进行重写。
SpaceVim 中又不少内置的插件,比如flygrep
、iedit
、task-manager
等等。
这些插件原先使用的是 Vim script,为的是兼容 Vim 和 Neovim。
在最新版的 SpaceVim 中,部分插件已经使用 lua 重写了。当然了,原先的 Vim script 写的版本也保留下来了,以便于兼容 Vim。
目前已经重写的插件包括:
flygrep
: 实时异步代码检索,根据输入的内容,实时展示代码搜索结果。iedit
: 类似于 emacs 的 iedit-mode,提供了多光标编辑的支持。todomanager
: 项目待办事项管理