Mercurial > vim
changeset 35683:a38e3fe52565 v9.1.0580
patch 9.1.0580: :lmap mapping for keypad key not applied when typed in Select mode
Commit: https://github.com/vim/vim/commit/90a800274ded86d5d79dbea7ba647cd69b029b4e
Author: zeertzjq <zeertzjq@outlook.com>
Date: Sat Jul 13 19:06:44 2024 +0200
patch 9.1.0580: :lmap mapping for keypad key not applied when typed in Select mode
Problem: An :lmap mapping for a printable keypad key is not applied
when typing it in Select mode.
Solution: Change keypad key to ASCII after setting vgetc_char.
(zeertzjq)
closes: #15245
Signed-off-by: zeertzjq <zeertzjq@outlook.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Wed, 17 Jul 2024 08:13:30 +0200 |
parents | acacdaa8c205 |
children | f47f1e3cb9ea |
files | src/getchar.c src/testdir/test_selectmode.vim src/version.c |
diffstat | 3 files changed, 55 insertions(+), 37 deletions(-) [+] |
line wrap: on
line diff
--- a/src/getchar.c +++ b/src/getchar.c @@ -1999,6 +1999,43 @@ vgetc(void) #endif } + // For a multi-byte character get all the bytes and return the + // converted character. + // Note: This will loop until enough bytes are received! + if (has_mbyte && (n = MB_BYTE2LEN_CHECK(c)) > 1) + { + ++no_mapping; + buf[0] = c; + for (i = 1; i < n; ++i) + { + buf[i] = vgetorpeek(TRUE); + if (buf[i] == K_SPECIAL +#ifdef FEAT_GUI + || (buf[i] == CSI) +#endif + ) + { + // Must be a K_SPECIAL - KS_SPECIAL - KE_FILLER + // sequence, which represents a K_SPECIAL (0x80), + // or a CSI - KS_EXTRA - KE_CSI sequence, which + // represents a CSI (0x9B), + // or a K_SPECIAL - KS_EXTRA - KE_CSI, which is CSI + // too. + c = vgetorpeek(TRUE); + if (vgetorpeek(TRUE) == KE_CSI && c == KS_EXTRA) + buf[i] = CSI; + } + } + --no_mapping; + c = (*mb_ptr2char)(buf); + } + + if (vgetc_char == 0) + { + vgetc_mod_mask = mod_mask; + vgetc_char = c; + } + // a keypad or special function key was not mapped, use it like // its ASCII equivalent switch (c) @@ -2062,43 +2099,6 @@ vgetc(void) case K_XRIGHT: c = K_RIGHT; break; } - // For a multi-byte character get all the bytes and return the - // converted character. - // Note: This will loop until enough bytes are received! - if (has_mbyte && (n = MB_BYTE2LEN_CHECK(c)) > 1) - { - ++no_mapping; - buf[0] = c; - for (i = 1; i < n; ++i) - { - buf[i] = vgetorpeek(TRUE); - if (buf[i] == K_SPECIAL -#ifdef FEAT_GUI - || (buf[i] == CSI) -#endif - ) - { - // Must be a K_SPECIAL - KS_SPECIAL - KE_FILLER - // sequence, which represents a K_SPECIAL (0x80), - // or a CSI - KS_EXTRA - KE_CSI sequence, which - // represents a CSI (0x9B), - // or a K_SPECIAL - KS_EXTRA - KE_CSI, which is CSI - // too. - c = vgetorpeek(TRUE); - if (vgetorpeek(TRUE) == KE_CSI && c == KS_EXTRA) - buf[i] = CSI; - } - } - --no_mapping; - c = (*mb_ptr2char)(buf); - } - - if (vgetc_char == 0) - { - vgetc_mod_mask = mod_mask; - vgetc_char = c; - } - break; }
--- a/src/testdir/test_selectmode.vim +++ b/src/testdir/test_selectmode.vim @@ -321,4 +321,20 @@ func Test_ins_ctrl_o_in_insert_mode_rese bwipe! endfunc +" Test that an :lmap mapping for a printable keypad key is applied when typing +" it in Select mode. +func Test_selectmode_keypad_lmap() + new + lnoremap <buffer> <kPoint> ??? + lnoremap <buffer> <kEnter> !!! + setlocal iminsert=1 + call setline(1, 'abcdef') + call feedkeys("gH\<kPoint>\<Esc>", 'tx') + call assert_equal(['???'], getline(1, '$')) + call feedkeys("gH\<kEnter>\<Esc>", 'tx') + call assert_equal(['!!!'], getline(1, '$')) + + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab