LoginSignup
1
1

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})
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1