Open8
Neovim の設定やプラグイン作りに使える Tips
備忘録 of (普段は使わないから忘れる or 知られてないけど便利なもの)
Neovim 全体のサイズ
local width = vim.o.columns
local height = vim.o.lines
vim.api.nvim_get_hl
の fg
などの数値を RGB に変換する
---@type integer
local fg = vim.api.nvim_get_hl(0, { name = "Normal" }).fg
print(("#%06x"):format(fg))
C と同じ埋め込み方
lua/my_module.lua
local M = {
foo = require("my_module.foo")
}
return M
こうすると、require("my_module")
とすると、require("my_module.foo")
も実行される。
これを、require("my_module").foo
が実行されるまで require("my_module.foo")
を実行しない方法
lua/my_module.lua
local M = setmetatable({
foo = nil, ---@module 'my_module.foo'
}, {
__index = function(t, k)
t[k] = require("my_module." .. k)
return t[k]
end,
})
return M
ダミーを入れておくことで、language server での補完も効くようになる
nvim --headless
で実行されているかどうか
vim.tbl_contains(vim.v.argv, "--headless")
-- or
#vim.api.nvim_list_uis() == 0
[[]]
の最初の改行は無視される
assert([[]] == [[
]])
関数を wrap する方法
vim.ui.select = function(...)
-- ...
vim.ui.select(...)
end
以下ではできない
function vim.ui.select(...)
-- ...
vim.ui.select(...)
end
関数の定義の仕方によってキャプチャされる方法が違うからだと思うけど、詳しいことは知らない
逆に関数を再帰させたいときは、以下のようにする必要がある
local function foo()
foo()
end
-- local foo = function()
-- foo() -- foo is undefined
-- end
循環 require
require()
で呼び出される前に package.loaded
にセットしておけばいい。
lua/foo/bar.lua
local M = {}
package.loaded[...] = M -- package.loaded["foo.bar"] = M
-- lua/foo/baz.lua の中から require("foo.bar") ができる
require("foo.baz")
return M
require()
はファイルをチャンクとして読み込んだ後、require()
への引数、つまりモジュール名をそのチャンクに渡して実行する。
そのため、require()
を使ってファイルを読み込んだ場合、トップレベルの vararg (...
) はモジュール名になっている。