Eric's Blog 时光荏苒,岁月如梭

使用 Lua 重写 SpaceVim 内置插件

2022-10-22
Eric Wong

最近如果你关注 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 中又不少内置的插件,比如flygrepiedittask-manager 等等。 这些插件原先使用的是 Vim script,为的是兼容 Vim 和 Neovim。

在最新版的 SpaceVim 中,部分插件已经使用 lua 重写了。当然了,原先的 Vim script 写的版本也保留下来了,以便于兼容 Vim。

目前已经重写的插件包括:

  • flygrep: 实时异步代码检索,根据输入的内容,实时展示代码搜索结果。
  • iedit: 类似于 emacs 的 iedit-mode,提供了多光标编辑的支持。
  • todomanager: 项目待办事项管理

延生阅读

分享到:

评论

目前只支持使用邮件参与评论。