summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2018-07-29 15:34:26 +0200
committerBram Moolenaar <Bram@vim.org>2018-07-29 15:34:26 +0200
commit612cc3888b136e80485132d9f997ed457dbc5501 (patch)
treed200810f73b2c0c5626b249c8dbf0384448e19c8
parent91f84f6e11cd879d43d651c0903d85bff95f0716 (diff)
patch 8.1.0225: mode() does not indicate using CTRL-O from Insert modev8.1.0225
Problem: Mode() does not indicate using CTRL-O from Insert mode. Solution: Add "niI", "niR" and "niV" to mode() result. (closes #3000)
-rw-r--r--runtime/doc/eval.txt52
-rw-r--r--src/evalfunc.c11
-rw-r--r--src/testdir/test_functions.vim12
-rw-r--r--src/version.c2
4 files changed, 51 insertions, 26 deletions
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
index 964eab125f..2c9c114396 100644
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -6224,32 +6224,38 @@ mode([expr]) Return a string that indicates the current mode.
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
index 12eac8d548..40fbf373a4 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -8366,10 +8366,9 @@ f_mkdir(typval_T *argvars, typval_T *rettv)
static void
f_mode(typval_T *argvars, typval_T *rettv)
{
- char_u buf[3];
+ char_u buf[4];
- buf[1] = NUL;
- buf[2] = NUL;
+ vim_memset(buf, 0, sizeof(buf));
if (time_for_testing == 93784)
{
@@ -8435,6 +8434,12 @@ f_mode(typval_T *argvars, typval_T *rettv)
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
index 14181fb0a4..41996bd451 100644
--- 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')
diff --git a/src/version.c b/src/version.c
index ab58a5c179..1aa6448fbb 100644
--- 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,