patch 7.4.2236

Problem:    The 'langnoremap' option leads to double negatives.  And it does
            not work for the last character of a mapping.
Solution:   Add 'langremap' with the opposite value.  Keep 'langnoremap' for
            backwards compatibility.  Make it work for the last character of a
            mapping.  Make the test work.
This commit is contained in:
Bram Moolenaar
2016-08-21 17:45:02 +02:00
parent 989f592f7f
commit 920694c1b6
6 changed files with 86 additions and 23 deletions

View File

@ -1,7 +1,7 @@
" The default vimrc file.
"
" Maintainer: Bram Moolenaar <Bram@vim.org>
" Last change: 2016 Aug 20
" Last change: 2016 Aug 21
"
" This is loaded if no vimrc file was found.
" Except when Vim is run with "-u NONE" or "-C".
@ -107,9 +107,9 @@ if !exists(":DiffOrig")
\ | wincmd p | diffthis
endif
if has('langmap') && exists('+langnoremap')
if has('langmap') && exists('+langremap')
" Prevent that the langmap option applies to characters that result from a
" mapping. If unset (default), this may break plugins (but it's backward
" mapping. If set (default), this may break plugins (but it's backward
" compatible).
set langnoremap
set nolangremap
endif

View File

@ -135,7 +135,7 @@
do { \
if (*p_langmap \
&& (condition) \
&& (!p_lnr || (p_lnr && typebuf_maplen() == 0)) \
&& (p_lrm || (!p_lrm && KeyTyped)) \
&& !KeyStuffed \
&& (c) >= 0) \
{ \
@ -150,7 +150,7 @@
do { \
if (*p_langmap \
&& (condition) \
&& (!p_lnr || (p_lnr && typebuf_maplen() == 0)) \
&& (p_lrm || (!p_lrm && KeyTyped)) \
&& !KeyStuffed \
&& (c) >= 0 && (c) < 256) \
c = langmap_mapchar[c]; \

View File

@ -1703,6 +1703,13 @@ static struct vimoption options[] =
(char_u *)&p_lnr, PV_NONE,
#else
(char_u *)NULL, PV_NONE,
#endif
{(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
{"langremap", "lrm", P_BOOL|P_VI_DEF,
#ifdef FEAT_LANGMAP
(char_u *)&p_lrm, PV_NONE,
#else
(char_u *)NULL, PV_NONE,
#endif
{(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
{"laststatus", "ls", P_NUM|P_VI_DEF|P_RALL,
@ -7894,6 +7901,15 @@ set_bool_option(
compatible_set();
}
#ifdef FEAT_LANGMAP
if ((int *)varp == &p_lrm)
/* 'langremap' -> !'langnoremap' */
p_lnr = !p_lrm;
else if ((int *)varp == &p_lnr)
/* 'langnoremap' -> !'langremap' */
p_lrm = !p_lnr;
#endif
#ifdef FEAT_PERSISTENT_UNDO
/* 'undofile' */
else if ((int *)varp == &curbuf->b_p_udf || (int *)varp == &p_udf)

View File

@ -604,6 +604,7 @@ EXTERN char_u *p_km; /* 'keymodel' */
#ifdef FEAT_LANGMAP
EXTERN char_u *p_langmap; /* 'langmap'*/
EXTERN int p_lnr; /* 'langnoremap' */
EXTERN int p_lrm; /* 'langremap' */
#endif
#if defined(FEAT_MENU) && defined(FEAT_MULTI_LANG)
EXTERN char_u *p_lm; /* 'langmenu' */

View File

@ -35,29 +35,73 @@ func Test_map_ctrl_c_visual()
endfunc
func Test_map_langmap()
" langmap should not get remapped in insert mode
inoremap { FAIL_ilangmap
set langmap=+{ langnoremap
if !has('langmap')
return
endif
" check langmap applies in normal mode
set langmap=+- nolangremap
new
call setline(1, ['a', 'b', 'c'])
2
call assert_equal('b', getline('.'))
call feedkeys("+", "xt")
call assert_equal('a', getline('.'))
" check no remapping
map x +
2
call feedkeys("x", "xt")
call assert_equal('c', getline('.'))
" check with remapping
set langremap
2
call feedkeys("x", "xt")
call assert_equal('a', getline('.'))
unmap x
bwipe!
" 'langnoremap' follows 'langremap' and vise versa
set langremap
set langnoremap
call assert_equal(0, &langremap)
set langremap
call assert_equal(0, &langnoremap)
set nolangremap
call assert_equal(1, &langnoremap)
" langmap should not apply in insert mode, 'langremap' doesn't matter
set langmap=+{ nolangremap
call feedkeys("Go+\<Esc>", "xt")
call assert_equal('+', getline('$'))
set langmap=+{ langremap
call feedkeys("Go+\<Esc>", "xt")
call assert_equal('+', getline('$'))
" Insert-mode expr mapping with langmap
inoremap <expr> { "FAIL_iexplangmap"
call feedkeys("Go+\<Esc>", "xt")
call assert_equal('+', getline('$'))
iunmap <expr> {
" langmap should not get remapped in Command-line mode
cnoremap { FAIL_clangmap
" langmap used for register name in insert mode.
call setreg('a', 'aaaa')
call setreg('b', 'bbbb')
call setreg('c', 'cccc')
set langmap=ab langremap
call feedkeys("Go\<C-R>a\<Esc>", "xt")
call assert_equal('bbbb', getline('$'))
call feedkeys("Go\<C-R>\<C-R>a\<Esc>", "xt")
call assert_equal('bbbb', getline('$'))
" mapping does not apply
imap c a
call feedkeys("Go\<C-R>c\<Esc>", "xt")
call assert_equal('cccc', getline('$'))
imap a c
call feedkeys("Go\<C-R>a\<Esc>", "xt")
call assert_equal('bbbb', getline('$'))
" langmap should not apply in Command-line mode
set langmap=+{ nolangremap
call feedkeys(":call append(line('$'), '+')\<CR>", "xt")
call assert_equal('+', getline('$'))
cunmap {
" Command-line mode expr mapping with langmap
cnoremap <expr> { "FAIL_cexplangmap"
call feedkeys(":call append(line('$'), '+')\<CR>", "xt")
call assert_equal('+', getline('$'))
cunmap {
set nomodified
endfunc

View File

@ -763,6 +763,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
2236,
/**/
2235,
/**/