Created
January 15, 2021 16:49
-
-
Save runiq/1c01fdb1b45a8f060d6b29d6c7a93e74 to your computer and use it in GitHub Desktop.
Neovim: "native" Lua callbacks in mappings
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
local M = {} | |
M._cbs = {} | |
--- Saves a Lua function as a callback and returns a string that can be used to | |
--- run that function. | |
--- | |
---@param fn Callback | |
---@return string | |
function M.lua_callback(fn) | |
assert(type(fn) == 'function', tb('fn must be a function')) | |
local callback_number = #M._cbs + 1 | |
M._cbs[callback_number] = fn | |
return ("require'my.utils'._cbs[%d]()"):format(callback_number) | |
end | |
--- Saves a Lua function as a callback and returns a string that can be used to | |
--- run that function from Vim. | |
--- | |
---@param fn Callback | |
---@return string | |
function M.lua_callback_cmd(fn) | |
return "lua "..M.lua_callback(fn) | |
end | |
--- Wrapper around vim.api.nvim_set_map() that can take native Lua functions. | |
function M.map(mode, lhs, rhs, opts) | |
if type(rhs) == 'function' then | |
rhs = '<cmd>' .. M.lua_callback_cmd(rhs) .. '<cr>' | |
end | |
return api.set_keymap(mode, lhs, rhs, opts) | |
end | |
--- Wrapper around vim.api.nvim_buf_set_map() that can take native Lua functions. | |
function M.bmap(buffer, mode, lhs, rhs, opts) | |
if type(rhs) == 'function' then | |
rhs = '<cmd>' .. M.lua_callback_cmd(rhs) .. '<cr>' | |
end | |
api.buf_set_keymap(buffer, mode, lhs, rhs, opts) | |
end | |
return M |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment