vim.keymap.set
はLuaでNeovimのキーバインドを記載するためのユーティリティとして知られているが、マッピング対象に関数を使うときは、関数を直接呼び出すのではなく、関数自体が帰るように書く必要があるようである。
- vim.keymap.setについて
例えば、以下のようにカーソルの位置を取得する関数func()
をマッピング対象とすることを考える。
vim.keymap.set
から関数を直接呼び出しても、関数が正しく評価されない(常に0が帰ってくる)
local function func()
return tostring(vim.api.nvim_win_get_cursor(vim.fn.win_getid())[2])
end
-- 現在のカーソル位置を正しく取得できない
vim.keymap.set('i', '^', func(), {expr = true})
関数func()
が正しく評価されるためには、関数自体を返す必要があるようである。
以下のように書くことで、カーソル位置が正しく取得できるようになった。
local function func()
return function()
return tostring(vim.api.nvim_win_get_cursor(vim.fn.win_getid())[2])
end
end
vim.keymap.set('i', '^', func(), {expr = true})
またはインライン的に書くこともできる。
-- 式を埋め込むと正しく取得できる
vim.keymap.set('i', '^',
function()
return tostring(vim.api.nvim_win_get_cursor(vim.fn.win_getid())[2])
end,
{expr = true})