Mercurial > vim
changeset 14422:06316dbd66bc v8.1.0225
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 <Bram@vim.org>
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)
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Sun, 29 Jul 2018 15:45:05 +0200 |
parents | 2f7e67dd088c |
children | cd3118af2cfc |
files | runtime/doc/eval.txt src/evalfunc.c src/testdir/test_functions.vim src/version.c |
diffstat | 4 files changed, 52 insertions(+), 27 deletions(-) [+] |
line wrap: on
line diff
--- 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()*
--- 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
--- 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\<C-O>:call Save_mode()\<Cr>\<Esc>" + call assert_equal("n-niI", g:current_modes) + + " R_CTRL-O + exe "normal R\<C-O>:call Save_mode()\<Cr>\<Esc>" + call assert_equal("n-niR", g:current_modes) + + " gR_CTRL-O + exe "normal gR\<C-O>:call Save_mode()\<Cr>\<Esc>" + call assert_equal("n-niV", g:current_modes) + " How to test operator-pending mode? call feedkeys("v", 'xt')