Patch 8.2.2084
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 #7413)
Files: src/edit.c, src/proto/edit.pro, src/ex_getln.c, src/getchar.c,
src/normal.c, src/testdir/test_termcodes.vim
*** ../vim-8.2.2083/src/edit.c 2020-11-14 21:34:12.249496540 +0100
--- src/edit.c 2020-12-03 19:46:29.311493614 +0100
***************
*** 1534,1540 ****
{
int c;
int did_putchar = FALSE;
- int prev_mod_mask = mod_mask;
// may need to redraw when no more chars available now
ins_redraw(FALSE);
--- 1534,1539 ----
***************
*** 1550,1556 ****
add_to_showcmd_c(Ctrl_V);
#endif
! c = get_literal();
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
--- 1549,1557 ----
add_to_showcmd_c(Ctrl_V);
#endif
! // Do not change any modifyOtherKeys ESC sequence to a normal 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
***************
*** 1559,1569 ****
clear_showcmd();
#endif
- if ((c == ESC || c == CSI) && !(prev_mod_mask & MOD_MASK_SHIFT))
- // Using CTRL-V: Change any modifyOtherKeys ESC sequence to a normal
- // key. Don't do this for CTRL-SHIFT-V.
- c = decodeModifyOtherKeys(c);
-
insert_special(c, FALSE, TRUE);
#ifdef FEAT_RIGHTLEFT
revins_chars++;
--- 1560,1565 ----
***************
*** 1845,1853 ****
* 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)
{
int cc;
int nc;
--- 1841,1851 ----
* 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.
+ * If "noReduceKeys" is TRUE do not change any modifyOtherKeys ESC sequence
+ * into a normal key, return ESC.
*/
int
! get_literal(int noReduceKeys)
{
int cc;
int nc;
***************
*** 1878,1883 ****
--- 1876,1884 ----
for (;;)
{
nc = plain_vgetc();
+ if ((nc == ESC || nc == CSI) && !noReduceKeys)
+ nc = decodeModifyOtherKeys(nc);
+
#ifdef FEAT_CMDL_INFO
if (!(State & CMDLINE) && MB_BYTE2LEN_CHECK(nc) == 1)
add_to_showcmd(nc);
***************
*** 3812,3819 ****
{
if (State & VREPLACE_FLAG)
restart_edit = 'V';
! else
! if (State & REPLACE_FLAG)
restart_edit = 'R';
else
restart_edit = 'I';
--- 3813,3819 ----
{
if (State & VREPLACE_FLAG)
restart_edit = 'V';
! else if (State & REPLACE_FLAG)
restart_edit = 'R';
else
restart_edit = 'I';
*** ../vim-8.2.2083/src/proto/edit.pro 2020-09-05 15:48:32.469546692 +0200
--- src/proto/edit.pro 2020-12-03 19:34:12.849669769 +0100
***************
*** 10,16 ****
void undisplay_dollar(void);
void truncate_spaces(char_u *line);
void backspace_until_column(int col);
! int get_literal(void);
void insertchar(int c, int flags, int second_indent);
void start_arrow(pos_T *end_insert_pos);
int stop_arrow(void);
--- 10,16 ----
void undisplay_dollar(void);
void truncate_spaces(char_u *line);
void backspace_until_column(int col);
! int get_literal(int noReduceKeys);
void insertchar(int c, int flags, int second_indent);
void start_arrow(pos_T *end_insert_pos);
int stop_arrow(void);
*** ../vim-8.2.2083/src/ex_getln.c 2020-11-14 14:21:59.518406461 +0100
--- src/ex_getln.c 2020-12-03 19:46:58.567401250 +0100
***************
*** 2206,2218 ****
case Ctrl_V:
case Ctrl_Q:
{
- int prev_mod_mask = mod_mask;
-
ignore_drag_release = TRUE;
putcmdline('^', TRUE);
! no_reduce_keys = TRUE; // don't merge modifyOtherKeys
! c = get_literal(); // get next (two) character(s)
! no_reduce_keys = FALSE;
do_abbr = FALSE; // don't do abbreviation now
extra_char = NUL;
// may need to remove ^ when composing char was typed
--- 2206,2219 ----
case Ctrl_V:
case Ctrl_Q:
{
ignore_drag_release = TRUE;
putcmdline('^', TRUE);
!
! // Get next (two) character(s). Do not change any
! // modifyOtherKeys ESC sequence to a normal key for
! // CTRL-SHIFT-V.
! c = get_literal(mod_mask & MOD_MASK_SHIFT);
!
do_abbr = FALSE; // don't do abbreviation now
extra_char = NUL;
// may need to remove ^ when composing char was typed
***************
*** 2223,2235 ****
msg_putchar(' ');
cursorcmd();
}
-
- if ((c == ESC || c == CSI)
- && !(prev_mod_mask & MOD_MASK_SHIFT))
- // Using CTRL-V: Change any modifyOtherKeys ESC
- // sequence to a normal key. Don't do this for
- // CTRL-SHIFT-V.
- c = decodeModifyOtherKeys(c);
}
break;
--- 2224,2229 ----
*** ../vim-8.2.2083/src/getchar.c 2020-11-28 14:43:23.950237798 +0100
--- src/getchar.c 2020-12-03 19:40:42.084564340 +0100
***************
*** 2580,2590 ****
typebuf.tb_off] == RM_YES))
&& !*timedout)
{
! keylen = check_termcode(max_mlen + 1,
! NULL, 0, NULL);
! // If no termcode matched but 'pastetoggle' matched partially it's
! // like an incomplete key sequence.
if (keylen == 0 && save_keylen == KEYLEN_PART_KEY)
keylen = KEYLEN_PART_KEY;
--- 2580,2589 ----
typebuf.tb_off] == RM_YES))
&& !*timedout)
{
! keylen = check_termcode(max_mlen + 1, NULL, 0, NULL);
! // If no termcode matched but 'pastetoggle' matched partially
! // it's like an incomplete key sequence.
if (keylen == 0 && save_keylen == KEYLEN_PART_KEY)
keylen = KEYLEN_PART_KEY;
***************
*** 3680,3686 ****
// CTRL-V is followed by octal, hex or other characters, reverses
// what AppendToRedobuffLit() does.
no_reduce_keys = TRUE; // don't merge modifyOtherKeys
! c1 = get_literal();
no_reduce_keys = FALSE;
}
--- 3679,3685 ----
// CTRL-V is followed by octal, hex or other characters, reverses
// what AppendToRedobuffLit() does.
no_reduce_keys = TRUE; // don't merge modifyOtherKeys
! c1 = get_literal(TRUE);
no_reduce_keys = FALSE;
}
*** ../vim-8.2.2083/src/normal.c 2020-11-26 20:33:56.856583887 +0100
--- src/normal.c 2020-12-03 19:30:08.474267692 +0100
***************
*** 4927,4933 ****
if (cap->nchar == Ctrl_V)
{
had_ctrl_v = Ctrl_V;
! cap->nchar = get_literal();
// Don't redo a multibyte character with CTRL-V.
if (cap->nchar > DEL)
had_ctrl_v = NUL;
--- 4927,4933 ----
if (cap->nchar == Ctrl_V)
{
had_ctrl_v = Ctrl_V;
! cap->nchar = get_literal(FALSE);
// Don't redo a multibyte character with CTRL-V.
if (cap->nchar > DEL)
had_ctrl_v = NUL;
***************
*** 5208,5214 ****
else
{
if (cap->extra_char == Ctrl_V) // get another character
! cap->extra_char = get_literal();
stuffcharReadbuff(cap->extra_char);
stuffcharReadbuff(ESC);
if (virtual_active())
--- 5208,5214 ----
else
{
if (cap->extra_char == Ctrl_V) // get another character
! cap->extra_char = get_literal(FALSE);
stuffcharReadbuff(cap->extra_char);
stuffcharReadbuff(ESC);
if (virtual_active())
*** ../vim-8.2.2083/src/testdir/test_termcodes.vim 2020-11-27
20:54:56.609430538 +0100
--- src/testdir/test_termcodes.vim 2020-12-03 19:44:39.199838712 +0100
***************
*** 1966,1971 ****
--- 1966,1981 ----
bwipe aaa
bwipe bbb
+ " Ctrl-V X 33 is 3
+ call setline(1, '')
+ call feedkeys("a\<C-V>" .. a:func('X', 2) .. "33\<Esc>", 'Lx!')
+ call assert_equal("3", getline(1))
+
+ " Ctrl-V U 12345 is Unicode 12345
+ call setline(1, '')
+ call feedkeys("a\<C-V>" .. a:func('U', 2) .. "12345\<Esc>", 'Lx!')
+ call assert_equal("\U12345", getline(1))
+
bwipe!
set timeoutlen&
endfunc
*** ../vim-8.2.2083/src/version.c 2020-12-02 20:51:17.944731846 +0100
--- src/version.c 2020-12-03 19:33:41.653751348 +0100
***************
*** 752,753 ****
--- 752,755 ----
{ /* Add new patch number below this line */
+ /**/
+ 2084,
/**/
--
TALL KNIGHT: When you have found the shrubbery, then you must cut down the
mightiest tree in the forest ... with a herring.
"Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/vim_dev/202012031855.0B3Itlvp280986%40masaka.moolenaar.net.