Skip to content

Commit

Permalink
patch 8.1.0225: mode() does not indicate using CTRL-O from Insert mode
Browse files Browse the repository at this point in the history
Problem:    Mode() does not indicate using CTRL-O from Insert mode.
Solution:   Add "niI", "niR" and "niV" to mode() result. (closes #3000)
  • Loading branch information
brammool committed Jul 29, 2018
1 parent 91f84f6 commit 612cc38
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 26 deletions.
52 changes: 29 additions & 23 deletions runtime/doc/eval.txt
Expand Up @@ -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()*
Expand Down
11 changes: 8 additions & 3 deletions src/evalfunc.c
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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
Expand Down
12 changes: 12 additions & 0 deletions src/testdir/test_functions.vim
Expand Up @@ -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')
Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Expand Up @@ -798,6 +798,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
225,
/**/
224,
/**/
Expand Down

0 comments on commit 612cc38

Please sign in to comment.