]> granicus.if.org Git - vim/commitdiff
patch 8.0.0283: mode() does not indicate Insert mode completion v8.0.0283
authorBram Moolenaar <Bram@vim.org>
Wed, 1 Feb 2017 16:24:34 +0000 (17:24 +0100)
committerBram Moolenaar <Bram@vim.org>
Wed, 1 Feb 2017 16:24:34 +0000 (17:24 +0100)
Problem:    The return value of mode() does not indicate that completion is
            active in Replace and Insert mode. (Zhen-Huan (Kenny) Hu)
Solution:   Add "c" or "x" for two kinds of completion. (Yegappan Lakshmanan,
            closes #1397)  Test some more modes.

runtime/doc/eval.txt
src/evalfunc.c
src/testdir/test_functions.vim
src/testdir/test_mapping.vim
src/version.c

index 58a61f20736b56c44dde4a8e0ec2e876c27f2c2d..1b3f1128f04c2ad2c15236b59fb0ce12bd27798e 100644 (file)
@@ -5848,9 +5848,13 @@ mode([expr])     Return a string that indicates the current mode.
                        S       Select by line
                        CTRL-S  Select blockwise
                        i       Insert
+                       ic      Insert mode completion |compl-generic|
+                       ix      Insert mode |i_CTRL-X| completion
                        R       Replace |R|
+                       Rc      Replace mode completion |compl-generic|
                        Rv      Virtual Replace |gR|
-                       c       Command-line
+                       Rx      Replace mode |i_CTRL-X| completion
+                       c       Command-line editing
                        cv      Vim Ex mode |gQ|
                        ce      Normal Ex mode |Q|
                        r       Hit-enter prompt
index 7f433a5a6fe47a0180a5244c8894c5b137073985..5671cf061995c3c3b3c101292e2ca150736a9e26 100644 (file)
@@ -7783,21 +7783,26 @@ f_mode(typval_T *argvars, typval_T *rettv)
        }
        else
 #endif
-       if (State & REPLACE_FLAG)
-           buf[0] = 'R';
-       else
-           buf[0] = 'i';
+       {
+           if (State & REPLACE_FLAG)
+               buf[0] = 'R';
+           else
+               buf[0] = 'i';
+#ifdef FEAT_INS_EXPAND
+           if (ins_compl_active())
+               buf[1] = 'c';
+           else if (ctrl_x_mode == 1)
+               buf[1] = 'x';
+#endif
+       }
     }
-    else if (State & CMDLINE)
+    else if ((State & CMDLINE) || exmode_active)
     {
        buf[0] = 'c';
-       if (exmode_active)
+       if (exmode_active == EXMODE_VIM)
            buf[1] = 'v';
-    }
-    else if (exmode_active)
-    {
-       buf[0] = 'c';
-       buf[1] = 'e';
+       else if (exmode_active == EXMODE_NORMAL)
+           buf[1] = 'e';
     }
     else
     {
index 38f772378f705f574aa0a94882c4b3622982ece2..e2dcb4fb7627a132fa3e1c97bffe21df5ca9ad4f 100644 (file)
@@ -304,4 +304,89 @@ func Test_toupper()
   call assert_equal("Ⱥ Ⱦ", toupper("ⱥ ⱦ"))
 endfunc
 
+" Tests for the mode() function
+let current_modes = ''
+func! Save_mode()
+  let g:current_modes = mode(0) . '-' . mode(1)
+  return ''
+endfunc
 
+func! Test_mode()
+  new
+  call append(0, ["Blue Ball Black", "Brown Band Bowl", ""])
+
+  inoremap <F2> <C-R>=Save_mode()<CR>
+
+  normal! 3G
+  exe "normal i\<F2>\<Esc>"
+  call assert_equal('i-i', g:current_modes)
+  exe "normal i\<C-G>uBa\<C-P>\<F2>\<Esc>u"
+  call assert_equal('i-ic', g:current_modes)
+  exe "normal iBro\<C-P>\<F2>\<Esc>u"
+  call assert_equal('i-ic', g:current_modes)
+  exe "normal iBa\<C-X>\<F2>\<Esc>u"
+  call assert_equal('i-ix', g:current_modes)
+  exe "normal iBa\<C-X>\<C-P>\<F2>\<Esc>u"
+  call assert_equal('i-ic', g:current_modes)
+  exe "normal iBro\<C-X>\<C-P>\<F2>\<Esc>u"
+  call assert_equal('i-ic', g:current_modes)
+  exe "normal iBro\<C-X>\<C-P>\<C-P>\<F2>\<Esc>u"
+  call assert_equal('i-ic', g:current_modes)
+  exe "normal iCom\<C-P>\<F2>\<Esc>u"
+  call assert_equal('i-ic', g:current_modes)
+  exe "normal iCom\<C-X>\<C-P>\<F2>\<Esc>u"
+  call assert_equal('i-ic', g:current_modes)
+
+  exe "normal RBa\<C-P>\<F2>\<Esc>u"
+  call assert_equal('R-Rc', g:current_modes)
+  exe "normal RBro\<C-P>\<F2>\<Esc>u"
+  call assert_equal('R-Rc', g:current_modes)
+  exe "normal RBa\<C-X>\<F2>\<Esc>u"
+  call assert_equal('R-Rx', g:current_modes)
+  exe "normal RBa\<C-X>\<C-P>\<F2>\<Esc>u"
+  call assert_equal('R-Rc', g:current_modes)
+  exe "normal RBro\<C-X>\<C-P>\<F2>\<Esc>u"
+  call assert_equal('R-Rc', g:current_modes)
+  exe "normal RBro\<C-X>\<C-P>\<C-P>\<F2>\<Esc>u"
+  call assert_equal('R-Rc', g:current_modes)
+  exe "normal RCom\<C-P>\<F2>\<Esc>u"
+  call assert_equal('R-Rc', g:current_modes)
+  exe "normal RCom\<C-X>\<C-P>\<F2>\<Esc>u"
+  call assert_equal('R-Rc', g:current_modes)
+
+  call assert_equal('n', mode(0))
+  call assert_equal('n', mode(1))
+
+  " How to test operator-pending mode?
+
+  call feedkeys("v", 'xt')
+  call assert_equal('v', mode())
+  call assert_equal('v', mode(1))
+  call feedkeys("\<Esc>V", 'xt')
+  call assert_equal('V', mode())
+  call assert_equal('V', mode(1))
+  call feedkeys("\<Esc>\<C-V>", 'xt')
+  call assert_equal("\<C-V>", mode())
+  call assert_equal("\<C-V>", mode(1))
+  call feedkeys("\<Esc>", 'xt')
+
+  call feedkeys("gh", 'xt')
+  call assert_equal('s', mode())
+  call assert_equal('s', mode(1))
+  call feedkeys("\<Esc>gH", 'xt')
+  call assert_equal('S', mode())
+  call assert_equal('S', mode(1))
+  call feedkeys("\<Esc>g\<C-H>", 'xt')
+  call assert_equal("\<C-S>", mode())
+  call assert_equal("\<C-S>", mode(1))
+  call feedkeys("\<Esc>", 'xt')
+
+  call feedkeys(":echo \<C-R>=Save_mode()\<C-U>\<CR>", 'xt')
+  call assert_equal('c-c', g:current_modes)
+  call feedkeys("gQecho \<C-R>=Save_mode()\<CR>\<CR>vi\<CR>", 'xt')
+  call assert_equal('c-cv', g:current_modes)
+  " How to test Ex mode?
+
+  bwipe!
+  iunmap <F2>
+endfunc
index 306eb2faea78f4885697e7622806cc6536ce3568..fa8012ad417b5e785bed655b68fd1c11786e079a 100644 (file)
@@ -110,6 +110,8 @@ func Test_map_langmap()
   call feedkeys(":call append(line('$'), '+')\<CR>", "xt")
   call assert_equal('+', getline('$'))
 
+  iunmap a
+  iunmap c
   set nomodified
 endfunc
 
@@ -120,7 +122,7 @@ func Test_map_feedkeys()
   $-1
   call feedkeys("0qqdw.ifoo\<Esc>qj0@q\<Esc>", "xt")
   call assert_equal(['fooc d', 'fooc d'], getline(line('$') - 1, line('$')))
-  unmap .
+  nunmap .
   set nomodified
 endfunc
 
index daa911c43081a571691705290950fe01ef99c31e..ef5ddaee2fe97fe227dc0ad57c0a8072032218b6 100644 (file)
@@ -764,6 +764,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    283,
 /**/
     282,
 /**/