mirror of
https://github.com/neovim/neovim.git
synced 2024-12-20 11:15:14 -07:00
parent
49019da86e
commit
42bbc4fabc
@ -1486,7 +1486,9 @@ nvim_set_keymap({mode}, {lhs}, {rhs}, {*opts}) *nvim_set_keymap()*
|
|||||||
|
|
||||||
Parameters: ~
|
Parameters: ~
|
||||||
• {mode} Mode short-name (map command prefix: "n", "i", "v", "x", …) or
|
• {mode} Mode short-name (map command prefix: "n", "i", "v", "x", …) or
|
||||||
"!" for |:map!|, or empty string for |:map|.
|
"!" for |:map!|, or empty string for |:map|. "ia", "ca" or
|
||||||
|
"!a" for abbreviation in insert mode, cmdline mode, or both,
|
||||||
|
respectively
|
||||||
• {lhs} Left-hand-side |{lhs}| of the mapping.
|
• {lhs} Left-hand-side |{lhs}| of the mapping.
|
||||||
• {rhs} Right-hand-side |{rhs}| of the mapping.
|
• {rhs} Right-hand-side |{rhs}| of the mapping.
|
||||||
• {opts} Optional parameters map: Accepts all |:map-arguments| as keys
|
• {opts} Optional parameters map: Accepts all |:map-arguments| as keys
|
||||||
|
@ -82,6 +82,8 @@ The following new APIs or features were added.
|
|||||||
|
|
||||||
• |vim.system()| for running system commands.
|
• |vim.system()| for running system commands.
|
||||||
|
|
||||||
|
• |nvim_set_keymap()| now supports abbreviations.
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
CHANGED FEATURES *news-changed*
|
CHANGED FEATURES *news-changed*
|
||||||
|
|
||||||
|
@ -1420,6 +1420,7 @@ ArrayOf(Dictionary) nvim_get_keymap(String mode)
|
|||||||
/// @param channel_id
|
/// @param channel_id
|
||||||
/// @param mode Mode short-name (map command prefix: "n", "i", "v", "x", …)
|
/// @param mode Mode short-name (map command prefix: "n", "i", "v", "x", …)
|
||||||
/// or "!" for |:map!|, or empty string for |:map|.
|
/// or "!" for |:map!|, or empty string for |:map|.
|
||||||
|
/// "ia", "ca" or "!a" for abbreviation in insert mode, cmdline mode, or both, respectively
|
||||||
/// @param lhs Left-hand-side |{lhs}| of the mapping.
|
/// @param lhs Left-hand-side |{lhs}| of the mapping.
|
||||||
/// @param rhs Right-hand-side |{rhs}| of the mapping.
|
/// @param rhs Right-hand-side |{rhs}| of the mapping.
|
||||||
/// @param opts Optional parameters map: Accepts all |:map-arguments| as keys except |<buffer>|,
|
/// @param opts Optional parameters map: Accepts all |:map-arguments| as keys except |<buffer>|,
|
||||||
|
@ -2603,13 +2603,21 @@ void modify_keymap(uint64_t channel_id, Buffer buffer, bool is_unmap, String mod
|
|||||||
goto fail_and_free;
|
goto fail_and_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mode.size > 1) {
|
bool is_abbrev = false;
|
||||||
|
if (mode.size > 2) {
|
||||||
|
api_set_error(err, kErrorTypeValidation, "Shortname is too long: %s", mode.data);
|
||||||
|
goto fail_and_free;
|
||||||
|
} else if (mode.size == 2) {
|
||||||
|
if ((mode.data[0] != '!' && mode.data[0] != 'i' && mode.data[0] != 'c')
|
||||||
|
|| mode.data[1] != 'a') {
|
||||||
api_set_error(err, kErrorTypeValidation, "Shortname is too long: %s", mode.data);
|
api_set_error(err, kErrorTypeValidation, "Shortname is too long: %s", mode.data);
|
||||||
goto fail_and_free;
|
goto fail_and_free;
|
||||||
}
|
}
|
||||||
|
is_abbrev = true;
|
||||||
|
}
|
||||||
int mode_val; // integer value of the mapping mode, to be passed to do_map()
|
int mode_val; // integer value of the mapping mode, to be passed to do_map()
|
||||||
char *p = (mode.size) ? mode.data : "m";
|
char *p = (mode.size) ? mode.data : "m";
|
||||||
if (strncmp(p, "!", 2) == 0) {
|
if (*p == '!') {
|
||||||
mode_val = get_map_mode(&p, true); // mapmode-ic
|
mode_val = get_map_mode(&p, true); // mapmode-ic
|
||||||
} else {
|
} else {
|
||||||
mode_val = get_map_mode(&p, false);
|
mode_val = get_map_mode(&p, false);
|
||||||
@ -2654,7 +2662,7 @@ void modify_keymap(uint64_t channel_id, Buffer buffer, bool is_unmap, String mod
|
|||||||
maptype_val = MAPTYPE_NOREMAP;
|
maptype_val = MAPTYPE_NOREMAP;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (buf_do_map(maptype_val, &parsed_args, mode_val, 0, target_buf)) {
|
switch (buf_do_map(maptype_val, &parsed_args, mode_val, is_abbrev, target_buf)) {
|
||||||
case 0:
|
case 0:
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
|
@ -988,6 +988,54 @@ describe('nvim_set_keymap, nvim_del_keymap', function()
|
|||||||
eq("\nn lhs rhs\n map description",
|
eq("\nn lhs rhs\n map description",
|
||||||
helpers.exec_capture("nmap lhs"))
|
helpers.exec_capture("nmap lhs"))
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it('can define !-mode abbreviations with lua callbacks', function()
|
||||||
|
exec_lua [[
|
||||||
|
GlobalCount = 0
|
||||||
|
vim.api.nvim_set_keymap('!a', 'foo', '', {expr = true, callback = function()
|
||||||
|
GlobalCount = GlobalCount + 1
|
||||||
|
return tostring(GlobalCount)
|
||||||
|
end})
|
||||||
|
]]
|
||||||
|
|
||||||
|
feed 'iThe foo and the bar and the foo again<esc>'
|
||||||
|
eq('The 1 and the bar and the 2 again', meths.get_current_line())
|
||||||
|
|
||||||
|
feed ':let x = "The foo is the one"<cr>'
|
||||||
|
eq('The 3 is the one', meths.eval'x')
|
||||||
|
end)
|
||||||
|
|
||||||
|
it('can define insert mode abbreviations with lua callbacks', function()
|
||||||
|
exec_lua [[
|
||||||
|
GlobalCount = 0
|
||||||
|
vim.api.nvim_set_keymap('ia', 'foo', '', {expr = true, callback = function()
|
||||||
|
GlobalCount = GlobalCount + 1
|
||||||
|
return tostring(GlobalCount)
|
||||||
|
end})
|
||||||
|
]]
|
||||||
|
|
||||||
|
feed 'iThe foo and the bar and the foo again<esc>'
|
||||||
|
eq('The 1 and the bar and the 2 again', meths.get_current_line())
|
||||||
|
|
||||||
|
feed ':let x = "The foo is the one"<cr>'
|
||||||
|
eq('The foo is the one', meths.eval'x')
|
||||||
|
end)
|
||||||
|
|
||||||
|
it('can define cmdline mode abbreviations with lua callbacks', function()
|
||||||
|
exec_lua [[
|
||||||
|
GlobalCount = 0
|
||||||
|
vim.api.nvim_set_keymap('ca', 'foo', '', {expr = true, callback = function()
|
||||||
|
GlobalCount = GlobalCount + 1
|
||||||
|
return tostring(GlobalCount)
|
||||||
|
end})
|
||||||
|
]]
|
||||||
|
|
||||||
|
feed 'iThe foo and the bar and the foo again<esc>'
|
||||||
|
eq('The foo and the bar and the foo again', meths.get_current_line())
|
||||||
|
|
||||||
|
feed ':let x = "The foo is the one"<cr>'
|
||||||
|
eq('The 1 is the one', meths.eval'x')
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
describe('nvim_buf_set_keymap, nvim_buf_del_keymap', function()
|
describe('nvim_buf_set_keymap, nvim_buf_del_keymap', function()
|
||||||
|
Loading…
Reference in New Issue
Block a user