Vim script -> Luaへの注意点
1
if filereadable()をluaに書き下す際、if vim.fn.filereadable() then …と書いてはいけない。
filereadable()等の関数は返り値として数値を返すが、luaはfalseとnil以外をtrueとして扱う。
(Vim scriptにはv:trueがあるが、あくまでjson用)
これを避けるには、 util.lua 的なファイルに以下のような関数を定義しておくと良い。
code:util.lua
---数値、文字列を Vim script 流スタイルで boolean に変換する。
---@param num number | string | boolean | nil
---@return boolean
function M.to_bool(num)
if num == 0 or num == "" or num == false or num == nil then
return false
end
return true
end
return M
すると、可読性を保ったまま if util.to_bool(vim.fn.filereadable()) then ... のようなことができる。
(num == "" とかは念のため足しただけなので別に要らんかも。)
2
luaの配列はindexが1から始まる。string.sub で部分文字列を切り出すときのインデックスにも注意。
3
LuaにはLua patternと呼ばれる正規表現チックなものがあるが、一般的な正規表現よりだいぶ低機能であり、エスケープは\ではなく%であるなど独自の要素が強い。vim.regexでvimの正規表現を使えるので、機能不足を感じたらこちらを使おう。
4
ローカルオプションを設定するときにはvim.opt_localを使うようにしよう。vim.boとvim.woはややこしいので非推奨。
5
APIのwindow positionが(1, 0)-index。
vimは(1, 1)-indexだし、luaの配列は1-indexだしで混乱必至である。
6
Vim のオプションを Lua の vim.opt 等で設定するときは、そのオプションをヘルプで引いて型を確認してからにする。
たとえば set foldcolumn=2 は一見 Lua で
code:init.lua
vim.opt.foldcolumn = 2
と書けそうに見えるが、 :h foldcolumn を見ると分かる通り foldcolumn は string 型のオプションなので、 Lua では
code:init.lua
vim.opt.foldcolumn = "2"
と書かなければエラーになる。
おまけ
lua-language-serverにglobal undefined vimと言われる場合