mirror of
https://github.com/neovim/neovim.git
synced 2026-02-20 01:09:56 +10:00
feat(edit): insert an unsimplified key using CTRL-SHIFT-V
This marks the following Vim patches as ported: vim-patch:8.1.2333: with modifyOtherKeys CTRL-^ doesn't work Problem: With modifyOtherKeys CTRL-^ doesn't work. Solution: Handle the exception.828ffd5963vim-patch:8.1.2350: other text for CTRL-V in Insert mode with modifyOtherKeys Problem: Other text for CTRL-V in Insert mode with modifyOtherKeys. Solution: Convert the Escape sequence back to key as if modifyOtherKeys is not set, and use CTRL-SHIFT-V to get the Escape sequence itself. (closes vim/vim#5254)fc4ea2a72dvim-patch:8.2.2084: CTRL-V U doesn't work to enter a Unicode character Problem: CTRL-V U doesn't work to enter a Unicode character when modifyOtherKeys is effective. (Ken Takata) Solution: Add a flag to get_literal() for the shift key. (closes vim/vim#7413)0684e36a7eOmit getcmdkeycmd() change as it depends on Vim patch 8.2.2062, which may introduce a potential breakage.
This commit is contained in:
@@ -1587,7 +1587,8 @@ static void ins_ctrl_v(void)
|
||||
|
||||
add_to_showcmd_c(Ctrl_V);
|
||||
|
||||
c = get_literal();
|
||||
// Do not include modifiers into the key for CTRL-SHIFT-V.
|
||||
c = get_literal(mod_mask & MOD_MASK_SHIFT);
|
||||
if (did_putchar) {
|
||||
// when the line fits in 'columns' the '^' is at the start of the next
|
||||
// line and will not removed by the redraw
|
||||
@@ -5612,13 +5613,13 @@ static unsigned quote_meta(char_u *dest, char_u *src, int len)
|
||||
return m;
|
||||
}
|
||||
|
||||
/*
|
||||
* Next character is interpreted literally.
|
||||
* A one, two or three digit decimal number is interpreted as its byte value.
|
||||
* If one or two digits are entered, the next character is given to vungetc().
|
||||
* For Unicode a character > 255 may be returned.
|
||||
*/
|
||||
int get_literal(void)
|
||||
/// Next character is interpreted literally.
|
||||
/// A one, two or three digit decimal number is interpreted as its byte value.
|
||||
/// If one or two digits are entered, the next character is given to vungetc().
|
||||
/// For Unicode a character > 255 may be returned.
|
||||
///
|
||||
/// @param no_simplify do not include modifiers into the key
|
||||
int get_literal(bool no_simplify)
|
||||
{
|
||||
int cc;
|
||||
int nc;
|
||||
@@ -5636,6 +5637,9 @@ int get_literal(void)
|
||||
i = 0;
|
||||
for (;;) {
|
||||
nc = plain_vgetc();
|
||||
if (!no_simplify) {
|
||||
nc = merge_modifiers(nc);
|
||||
}
|
||||
if ((mod_mask & ~MOD_MASK_SHIFT) != 0) {
|
||||
// A character with non-Shift modifiers should not be a valid
|
||||
// character for i_CTRL-V_digit.
|
||||
|
||||
@@ -2208,7 +2208,11 @@ static int command_line_handle_key(CommandLineState *s)
|
||||
case Ctrl_Q:
|
||||
s->ignore_drag_release = true;
|
||||
putcmdline('^', true);
|
||||
s->c = get_literal(); // get next (two) character(s)
|
||||
|
||||
// Get next (two) characters.
|
||||
// Do not include modifiers into the key for CTRL-SHIFT-V.
|
||||
s->c = get_literal(mod_mask & MOD_MASK_SHIFT);
|
||||
|
||||
s->do_abbr = false; // don't do abbreviation now
|
||||
ccline.special_char = NUL;
|
||||
// may need to remove ^ when composing char was typed
|
||||
|
||||
@@ -1442,6 +1442,27 @@ static void updatescript(int c)
|
||||
}
|
||||
}
|
||||
|
||||
/// Merge "mod_mask" into "c_arg"
|
||||
int merge_modifiers(int c_arg)
|
||||
{
|
||||
int c = c_arg;
|
||||
|
||||
if (mod_mask & MOD_MASK_CTRL) {
|
||||
if ((c >= '`' && c <= 0x7f) || (c >= '@' && c <= '_')) {
|
||||
c &= 0x1f;
|
||||
mod_mask &= ~MOD_MASK_CTRL;
|
||||
if (c == 0) {
|
||||
c = K_ZERO;
|
||||
}
|
||||
} else if (c == '6') {
|
||||
// CTRL-6 is equivalent to CTRL-^
|
||||
c = 0x1e;
|
||||
mod_mask &= ~MOD_MASK_CTRL;
|
||||
}
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
/// Get the next input character.
|
||||
/// Can return a special key or a multi-byte character.
|
||||
/// Can return NUL when called recursively, use safe_vgetc() if that's not
|
||||
@@ -1603,19 +1624,7 @@ int vgetc(void)
|
||||
|
||||
// A modifier was not used for a mapping, apply it to ASCII
|
||||
// keys. Shift would already have been applied.
|
||||
if (mod_mask & MOD_MASK_CTRL) {
|
||||
if ((c >= '`' && c <= 0x7f) || (c >= '@' && c <= '_')) {
|
||||
c &= 0x1f;
|
||||
mod_mask &= ~MOD_MASK_CTRL;
|
||||
if (c == 0) {
|
||||
c = K_ZERO;
|
||||
}
|
||||
} else if (c == '6') {
|
||||
// CTRL-6 is equivalent to CTRL-^
|
||||
c = 0x1e;
|
||||
mod_mask &= ~MOD_MASK_CTRL;
|
||||
}
|
||||
}
|
||||
c = merge_modifiers(c);
|
||||
|
||||
// If mappings are enabled (i.e., not Ctrl-v) and the user directly typed
|
||||
// something with a meta- or alt- modifier that was not mapped, interpret
|
||||
|
||||
@@ -5154,7 +5154,7 @@ static void nv_replace(cmdarg_T *cap)
|
||||
// get another character
|
||||
if (cap->nchar == Ctrl_V) {
|
||||
had_ctrl_v = Ctrl_V;
|
||||
cap->nchar = get_literal();
|
||||
cap->nchar = get_literal(false);
|
||||
// Don't redo a multibyte character with CTRL-V.
|
||||
if (cap->nchar > DEL) {
|
||||
had_ctrl_v = NUL;
|
||||
@@ -5369,7 +5369,7 @@ static void nv_vreplace(cmdarg_T *cap)
|
||||
emsg(_(e_modifiable));
|
||||
} else {
|
||||
if (cap->extra_char == Ctrl_V) { // get another character
|
||||
cap->extra_char = get_literal();
|
||||
cap->extra_char = get_literal(false);
|
||||
}
|
||||
stuffcharReadbuff(cap->extra_char);
|
||||
stuffcharReadbuff(ESC);
|
||||
|
||||
Reference in New Issue
Block a user