]> granicus.if.org Git - vim/commitdiff
patch 7.4.2236 v7.4.2236
authorBram Moolenaar <Bram@vim.org>
Sun, 21 Aug 2016 15:45:02 +0000 (17:45 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 21 Aug 2016 15:45:02 +0000 (17:45 +0200)
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.

runtime/defaults.vim
src/macros.h
src/option.c
src/option.h
src/testdir/test_mapping.vim
src/version.c

index 45a5393d3241dcee509264a0e180e48bb54557a7..023d64020846422eb5ff0ccd2cc0fdade86cfaa9 100644 (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
index 28f43a3627873ab0f4263636c065918b7c59a7f3..aec14255944ea34ce25e6de3a367d7762079967c 100644 (file)
     do { \
        if (*p_langmap \
                && (condition) \
-               && (!p_lnr || (p_lnr && typebuf_maplen() == 0)) \
+               && (p_lrm || (!p_lrm && KeyTyped)) \
                && !KeyStuffed \
                && (c) >= 0) \
        { \
     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]; \
index 1a5cd8e4fb9165a7b07d8bc348d45b4ee6b99f0c..9f1aaf1d152b8b9ddc46aa60ee6c637cd47d4f24 100644 (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)
index c86550fb11952fd1d7e9ab4c81ee7d30da95a96d..9a5570c2ad8d702a9f5d00c27882018b49929144 100644 (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' */
index a1281eb4d36ad87cecd146e64fd85ed30b6fecbc..66b81cecf87dc7ccca9739def8bf2c1216fb229d 100644 (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('$'))
-
-  " Insert-mode expr mapping with langmap
-  inoremap <expr> { "FAIL_iexplangmap"
+  set langmap=+{ langremap
   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
 
index 65eb6d7c0682dc0a4349a1d7f77bc210377bcd60..8b8653190db8e5a420f81e9d75552f65db523a79 100644 (file)
@@ -763,6 +763,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2236,
 /**/
     2235,
 /**/