mirror of
https://github.com/neovim/neovim.git
synced 2025-09-23 11:38:31 +00:00
feat(api): add support for lua function & description in keymap
Behavioral changes: 1. Added support for lua function in keymaps in -------------------------------------------- - nvim_set_keymap Can set lua function as keymap rhs like following: ```lua vim.api.nvim_{buf_}set_keymap('n', '<leader>lr', '', {callback = vim.lsp.buf.references}) ``` Note: lua function can only be set from lua . If api function being called from viml or over rpc this option isn't available. - nvim_{buf_}get_keymap When called from lua, lua function is returned is `callback` key . But in other cases callback contains number of the function ref. - :umap, nvim_del_keymap & nvim_buf_del_keymap clears lua keymaps correctly. - :map commands for displaing rhs . For lua keymaps rhs is displayed as <Lua function ref_no> Note: lua keymap cannot be set through viml command / functions. - mapargs() When dict is false it returns string in `<Lua function ref_no>` format (same format as :map commands). When dict is true it returns ref_no number in `callback` key. - mapcheck() returns string in `<Lua function ref_no>` format (same format as :map commands). 2. Added support for keymap description --------------------------------------- - nvim_{buf_}set_keymap: added `desc` option in opts table . ```lua vim.api.nvim_set_keymap('n', '<leader>w', '<cmd>w<cr>', {desc='Save current file'}) ``` - nvim_{buf_}get_keymap: contains `desc` in returned list. - commands like `:nmap <leader>w` will show description in a new line below rhs. - `maparg()` return dict contains `desc`.
This commit is contained in:
@@ -334,6 +334,7 @@ static const struct nv_cmd {
|
||||
{ K_SELECT, nv_select, 0, 0 },
|
||||
{ K_EVENT, nv_event, NV_KEEPREG, 0 },
|
||||
{ K_COMMAND, nv_colon, 0, 0 },
|
||||
{ K_LUA, nv_colon, 0, 0 },
|
||||
};
|
||||
|
||||
// Number of commands in nv_cmds[].
|
||||
@@ -4043,21 +4044,22 @@ static void nv_regreplay(cmdarg_T *cap)
|
||||
}
|
||||
}
|
||||
|
||||
/// Handle a ":" command and <Cmd>.
|
||||
/// Handle a ":" command and <Cmd> or Lua keymaps.
|
||||
static void nv_colon(cmdarg_T *cap)
|
||||
{
|
||||
int old_p_im;
|
||||
bool cmd_result;
|
||||
bool is_cmdkey = cap->cmdchar == K_COMMAND;
|
||||
bool is_lua = cap->cmdchar == K_LUA;
|
||||
|
||||
if (VIsual_active && !is_cmdkey) {
|
||||
if (VIsual_active && !is_cmdkey && !is_lua) {
|
||||
nv_operator(cap);
|
||||
} else {
|
||||
if (cap->oap->op_type != OP_NOP) {
|
||||
// Using ":" as a movement is charwise exclusive.
|
||||
cap->oap->motion_type = kMTCharWise;
|
||||
cap->oap->inclusive = false;
|
||||
} else if (cap->count0 && !is_cmdkey) {
|
||||
} else if (cap->count0 && !is_cmdkey && !is_lua) {
|
||||
// translate "count:" into ":.,.+(count - 1)"
|
||||
stuffcharReadbuff('.');
|
||||
if (cap->count0 > 1) {
|
||||
@@ -4073,9 +4075,13 @@ static void nv_colon(cmdarg_T *cap)
|
||||
|
||||
old_p_im = p_im;
|
||||
|
||||
if (is_lua) {
|
||||
cmd_result = map_execute_lua();
|
||||
} else {
|
||||
// get a command line and execute it
|
||||
cmd_result = do_cmdline(NULL, is_cmdkey ? getcmdkeycmd : getexline, NULL,
|
||||
cap->oap->op_type != OP_NOP ? DOCMD_KEEPLINE : 0);
|
||||
cmd_result = do_cmdline(NULL, is_cmdkey ? getcmdkeycmd : getexline, NULL,
|
||||
cap->oap->op_type != OP_NOP ? DOCMD_KEEPLINE : 0);
|
||||
}
|
||||
|
||||
// If 'insertmode' changed, enter or exit Insert mode
|
||||
if (p_im != old_p_im) {
|
||||
|
Reference in New Issue
Block a user