Open8

Neovim の設定やプラグイン作りに使える Tips

futsuuufutsuuu

vim.api.nvim_get_hlfg などの数値を RGB に変換する

---@type integer
local fg = vim.api.nvim_get_hl(0, { name = "Normal" }).fg
print(("#%06x"):format(fg))

C と同じ埋め込み方

futsuuufutsuuu
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 での補完も効くようになる

futsuuufutsuuu

nvim --headless で実行されているかどうか

vim.tbl_contains(vim.v.argv, "--headless")

-- or

#vim.api.nvim_list_uis() == 0
futsuuufutsuuu

[[]] の最初の改行は無視される

assert([[]] == [[
]])
futsuuufutsuuu

関数を 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
futsuuufutsuuu

循環 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 (...) はモジュール名になっている。