# HG changeset patch # User Christian Brabandt # Date 1532871905 -7200 # Node ID 06316dbd66bc283b357d4b484c202b07bfa7de9f # Parent 2f7e67dd088c6b4651a8784a26a97093231e60ef patch 8.1.0225: mode() does not indicate using CTRL-O from Insert mode commit https://github.com/vim/vim/commit/612cc3888b136e80485132d9f997ed457dbc5501 Author: Bram Moolenaar Date: Sun Jul 29 15:34:26 2018 +0200 patch 8.1.0225: mode() does not indicate using CTRL-O from Insert mode Problem: Mode() does not indicate using CTRL-O from Insert mode. Solution: Add "niI", "niR" and "niV" to mode() result. (closes https://github.com/vim/vim/issues/3000) diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -6224,32 +6224,38 @@ mode([expr]) Return a string that indica a non-empty String (|non-zero-arg|), then the full mode is returned, otherwise only the first letter is returned. - n Normal, Terminal-Normal - no Operator-pending - v Visual by character - V Visual by line - CTRL-V Visual blockwise - s Select by character - 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| - 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 - rm The -- more -- prompt - r? A |:confirm| query of some sort - ! Shell or external command is executing - t Terminal-Job mode: keys go to the job + n Normal, Terminal-Normal + no Operator-pending + niI Normal using |i_CTRL-O| in |Insert-mode| + niR Normal using |i_CTRL-O| in |Replace-mode| + niV Normal using |i_CTRL-O| in |Virtual-Replace-mode| + v Visual by character + V Visual by line + CTRL-V Visual blockwise + s Select by character + 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| + 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 + rm The -- more -- prompt + r? A |:confirm| query of some sort + ! Shell or external command is executing + t Terminal-Job mode: keys go to the job This is useful in the 'statusline' option or when used with |remote_expr()| In most other places it always returns "c" or "n". + Note that in the future more modes and more specific modes may + be added. It's better not to compare the whole string but only + the leading character(s). Also see |visualmode()|. mzeval({expr}) *mzeval()* diff --git a/src/evalfunc.c b/src/evalfunc.c --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -8366,10 +8366,9 @@ f_mkdir(typval_T *argvars, typval_T *ret static void f_mode(typval_T *argvars, typval_T *rettv) { - char_u buf[3]; - - buf[1] = NUL; - buf[2] = NUL; + char_u buf[4]; + + vim_memset(buf, 0, sizeof(buf)); if (time_for_testing == 93784) { @@ -8435,6 +8434,12 @@ f_mode(typval_T *argvars, typval_T *rett buf[0] = 'n'; if (finish_op) buf[1] = 'o'; + else if (restart_edit == 'I' || restart_edit == 'R' + || restart_edit == 'V') + { + buf[1] = 'i'; + buf[2] = restart_edit; + } } /* Clear out the minor mode when the argument is not a non-zero number or diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim --- a/src/testdir/test_functions.vim +++ b/src/testdir/test_functions.vim @@ -464,6 +464,18 @@ func Test_mode() call assert_equal('n', mode(0)) call assert_equal('n', mode(1)) + " i_CTRL-O + exe "normal i\:call Save_mode()\\" + call assert_equal("n-niI", g:current_modes) + + " R_CTRL-O + exe "normal R\:call Save_mode()\\" + call assert_equal("n-niR", g:current_modes) + + " gR_CTRL-O + exe "normal gR\:call Save_mode()\\" + call assert_equal("n-niV", g:current_modes) + " How to test operator-pending mode? call feedkeys("v", 'xt') diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -799,6 +799,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 225, +/**/ 224, /**/ 223,