refactor!: delete insertmode (#18547)

Neovim already removed `evim` (or any similar flags). The 'insertmode'
option is a weird remnant, so get rid of it.

The 'insertmode' option is replaced with a script that closely emulates
the option. This script is documented at :help 'insertmode'
This commit is contained in:
Gregory Anders 2022-05-22 21:20:18 -06:00 committed by GitHub
parent a7e0a02031
commit 9e1ee9fb1d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
29 changed files with 62 additions and 270 deletions

View File

@ -1065,8 +1065,7 @@ line contains the command as typed so far. The left column will show a
character that indicates the type of command-line being edited, see
|cmdwin-char|.
Vim will be in Normal mode when the editor is opened, except when 'insertmode'
is set.
Vim will be in Normal mode when the editor is opened.
The height of the window is specified with 'cmdwinheight' (or smaller if there
is no room). The window is always full width and is positioned just above the

View File

@ -1366,7 +1366,7 @@ option *expr-option* *E112* *E113*
Examples: >
echo "tabstop is " .. &tabstop
if &insertmode
if &expandtab
Any option name can be used here. See |options|. When using the local value
and there is no buffer-local or window-local value, the global value is used

View File

@ -224,9 +224,6 @@ some modes:
Cmdline <C-C> <C-\><C-G>
Op-pending <C-C> <C-\><C-G>
Appending CTRL-\ CTRL-G is for going back to insert mode when 'insertmode' is
set. |CTRL-\_CTRL-G|
Example: >
:amenu File.Next :next^M

View File

@ -26,7 +26,7 @@ tag char action in Insert mode ~
insert
|i_CTRL-A| CTRL-A insert previously inserted text
|i_CTRL-C| CTRL-C quit insert mode, without checking for
abbreviation, unless 'insertmode' set.
abbreviation
|i_CTRL-D| CTRL-D delete one shiftwidth of indent in the current
line
|i_CTRL-E| CTRL-E insert the character which is below the cursor
@ -50,7 +50,6 @@ tag char action in Insert mode ~
|i_CTRL-J| CTRL-J same as <CR>
|i_CTRL-K| CTRL-K {char1} {char2}
enter digraph
|i_CTRL-L| CTRL-L when 'insertmode' set: Leave Insert mode
|i_<CR>| <CR> begin new line
|i_CTRL-M| CTRL-M same as <CR>
|i_CTRL-N| CTRL-N find next match for keyword in front of the
@ -86,11 +85,10 @@ tag char action in Insert mode ~
|i_CTRL-W| CTRL-W delete word before the cursor
|i_CTRL-X| CTRL-X {mode} enter CTRL-X sub mode, see |i_CTRL-X_index|
|i_CTRL-Y| CTRL-Y insert the character which is above the cursor
|i_CTRL-Z| CTRL-Z when 'insertmode' set: suspend Vim
|i_<Esc>| <Esc> end insert mode (unless 'insertmode' set)
|i_<Esc>| <Esc> end insert mode
|i_CTRL-[| CTRL-[ same as <Esc>
|i_CTRL-\_CTRL-N| CTRL-\ CTRL-N go to Normal mode
|i_CTRL-\_CTRL-G| CTRL-\ CTRL-G go to mode specified with 'insertmode'
|i_CTRL-\_CTRL-G| CTRL-\ CTRL-G go to Normal mode
CTRL-\ a - z reserved for extensions
CTRL-\ others not used
|i_CTRL-]| CTRL-] trigger abbreviation
@ -221,7 +219,7 @@ tag char note action in Normal mode ~
|CTRL-Z| CTRL-Z suspend program (or start new shell)
CTRL-[ <Esc> not used
|CTRL-\_CTRL-N| CTRL-\ CTRL-N go to Normal mode (no-op)
|CTRL-\_CTRL-G| CTRL-\ CTRL-G go to mode specified with 'insertmode'
|CTRL-\_CTRL-G| CTRL-\ CTRL-G go to Normal mode (no-op)
CTRL-\ a - z reserved for extensions
CTRL-\ others not used
|CTRL-]| CTRL-] :ta to ident under cursor
@ -892,7 +890,7 @@ here are those that are different.
tag command note action in Visual mode ~
------------------------------------------------------------------------------
|v_CTRL-\_CTRL-N| CTRL-\ CTRL-N stop Visual mode
|v_CTRL-\_CTRL-G| CTRL-\ CTRL-G go to mode specified with 'insertmode'
|v_CTRL-\_CTRL-G| CTRL-\ CTRL-G go to Normal mode
|v_CTRL-A| CTRL-A 2 add N to number in highlighted text
|v_CTRL-C| CTRL-C stop Visual mode
|v_CTRL-G| CTRL-G toggle between Visual mode and Select mode
@ -1068,8 +1066,7 @@ tag command action in Command-line editing mode ~
|c_<Esc>| <Esc> abandon command-line without executing it
|c_CTRL-[| CTRL-[ same as <Esc>
|c_CTRL-\_CTRL-N| CTRL-\ CTRL-N go to Normal mode, abandon command-line
|c_CTRL-\_CTRL-G| CTRL-\ CTRL-G go to mode specified with 'insertmode',
abandon command-line
|c_CTRL-\_CTRL-G| CTRL-\ CTRL-G go to Normal mode, abandon command-line
CTRL-\ a - d reserved for extensions
|c_CTRL-\_e| CTRL-\ e {expr} replace the command line with the result of
{expr}

View File

@ -32,9 +32,6 @@ If you are working in a special language mode when inserting text, see the
'langmap' option, |'langmap'|, on how to avoid switching this mode on and off
all the time.
If you have 'insertmode' set, <Esc> and a few other keys get another meaning.
See |'insertmode'|.
char action ~
-----------------------------------------------------------------------
*i_CTRL-[* *i_<Esc>*
@ -335,9 +332,8 @@ that key is interpreted as in Insert mode.
The following keys are special. They stop the current insert, do something,
and then restart insertion. This means you can do something without getting
out of Insert mode. This is very handy if you prefer to use the Insert mode
all the time, just like editors that don't have a separate Normal mode. You
may also want to set the 'insertmode' option. You can use CTRL-O if you want
to map a function key to a command.
all the time, just like editors that don't have a separate Normal mode. You
can use CTRL-O if you want to map a function key to a command.
The changes (inserted or deleted characters) before and after these keys can
be undone separately. Only the last change can be redone and always behaves
@ -378,7 +374,6 @@ CTRL-G CTRL-J cursor one line down, insert start column *i_CTRL-G_CTRL-J*
<S-ScrollWheelRight> move window one page right *i_<S-ScrollWheelRight>*
CTRL-O execute one command, return to Insert mode *i_CTRL-O*
CTRL-\ CTRL-O like CTRL-O but don't move the cursor *i_CTRL-\_CTRL-O*
CTRL-L when 'insertmode' is set: go to Normal mode *i_CTRL-L*
CTRL-G u break undo sequence, start new change *i_CTRL-G_u*
CTRL-G U don't break undo with next left/right cursor *i_CTRL-G_U*
movement, if the cursor stays within the

View File

@ -424,8 +424,7 @@ Vim has seven BASIC modes:
*Normal* *Normal-mode* *command-mode*
Normal mode In Normal mode you can enter all the normal editor
commands. If you start the editor you are in this
mode (unless you have set the 'insertmode' option,
see below). This is also known as command mode.
mode. This is also known as command mode.
Visual mode This is like Normal mode, but the movement commands
extend a highlighted area. When a non-movement
@ -551,8 +550,6 @@ Ex :vi -- -- -- -- --
*6 Go from Select mode to Insert mode by typing a printable character. The
selection is deleted and the character is inserted.
If the 'insertmode' option is on, editing a file will start in Insert mode.
*CTRL-\_CTRL-N* *i_CTRL-\_CTRL-N* *c_CTRL-\_CTRL-N* *v_CTRL-\_CTRL-N*
Additionally the command CTRL-\ CTRL-N or <C-\><C-N> can be used to go to
Normal mode from any other mode. This can be used to make sure Vim is in
@ -561,10 +558,7 @@ work in Ex mode. When used after a command that takes an argument, such as
|f| or |m|, the timeout set with 'ttimeoutlen' applies.
*CTRL-\_CTRL-G* *i_CTRL-\_CTRL-G* *c_CTRL-\_CTRL-G* *v_CTRL-\_CTRL-G*
The command CTRL-\ CTRL-G or <C-\><C-G> can be used to go to Insert mode when
'insertmode' is set. Otherwise it goes to Normal mode. This can be used to
make sure Vim is in the mode indicated by 'insertmode', without knowing in
what mode Vim currently is.
CTRL-\ CTRL-G works the same as |CTRL-\_CTRL-N| for backward compatibility.
*gQ* *mode-Ex* *Ex-mode* *Ex* *EX* *E501*
gQ Switch to Ex mode. This is like typing ":" commands

View File

@ -959,7 +959,6 @@ A jump table for the options with a short description can be found at |Q_op|.
(mostly used in |Normal-mode| or |Cmdline-mode|).
esc hitting <Esc> in |Normal-mode|.
hangul Ignored.
insertmode Pressing <Esc> in 'insertmode'.
lang Calling the beep module for Lua/Mzscheme/TCL.
mess No output available for |g<|.
showmatch Error occurred for 'showmatch' function.
@ -3412,31 +3411,6 @@ A jump table for the options with a short description can be found at |Q_op|.
and there is a letter before it, the completed part is made uppercase.
With 'noinfercase' the match is used as-is.
*'insertmode'* *'im'* *'noinsertmode'* *'noim'*
'insertmode' 'im' boolean (default off)
global
Makes Vim work in a way that Insert mode is the default mode. Useful
if you want to use Vim as a modeless editor.
These Insert mode commands will be useful:
- Use the cursor keys to move around.
- Use CTRL-O to execute one Normal mode command |i_CTRL-O|. When
this is a mapping, it is executed as if 'insertmode' was off.
Normal mode remains active until the mapping is finished.
- Use CTRL-L to execute a number of Normal mode commands, then use
<Esc> to get back to Insert mode. Note that CTRL-L moves the cursor
left, like <Esc> does when 'insertmode' isn't set. |i_CTRL-L|
These items change when 'insertmode' is set:
- when starting to edit of a file, Vim goes to Insert mode.
- <Esc> in Insert mode is a no-op and beeps.
- <Esc> in Normal mode makes Vim go to Insert mode.
- CTRL-L in Insert mode is a command, it is not inserted.
- CTRL-Z in Insert mode suspends Vim, see |CTRL-Z|. *i_CTRL-Z*
However, when <Esc> is used inside a mapping, it behaves like
'insertmode' was not set. This was done to be able to use the same
mappings with 'insertmode' set or not set.
When executing commands with |:normal| 'insertmode' is not used.
*'isfname'* *'isf'*
'isfname' 'isf' string (default for Windows:
"@,48-57,/,\,.,-,_,+,,,#,$,%,{,},[,],:,@-@,!,~,="

View File

@ -741,7 +741,6 @@ Short explanation of each option: *option-list*
'indentexpr' 'inde' expression used to obtain the indent of a line
'indentkeys' 'indk' keys that trigger indenting with 'indentexpr'
'infercase' 'inf' adjust case of match for keyword completion
'insertmode' 'im' start the edit of a file in Insert mode
'isfname' 'isf' characters included in file names and pathnames
'isident' 'isi' characters included in identifiers
'iskeyword' 'isk' characters included in keywords

View File

@ -527,7 +527,6 @@ accordingly, proceeding as follows:
16. Execute startup commands
If a |-t| flag was given, the tag is jumped to.
Commands given with |-c| and |+cmd| are executed.
If the 'insertmode' option is set, Insert mode is entered.
The starting flag is reset, has("vim_starting") will now return zero.
The |v:vim_did_enter| variable is set to 1.
The |VimEnter| autocommands are executed.

View File

@ -208,8 +208,6 @@ g8 Print the hex values of the bytes used in the
{commands} cannot start with a space. Put a count of
1 (one) before it, "1 " is one space.
The 'insertmode' option is ignored for {commands}.
This command cannot be followed by another command,
since any '|' is considered part of the command.

View File

@ -543,6 +543,13 @@ Options:
*'imactivatefunc'* *'imaf'*
*'imactivatekey'* *'imak'*
*'imstatusfunc'* *'imsf'*
*'insertmode'* *'im'* Use the following script to emulate 'insertmode':
>
autocmd VimEnter,CmdlineLeave,WinEnter,WinScrolled,BufEnter * silent! if &modifiable | startinsert | endif
inoremap <Esc> <Nop>
inoremap <C-L> <Esc>
nnoremap <Esc> i
<
*'macatsui'*
'maxmem' Nvim delegates memory-management to the OS.
'maxmemtot' Nvim delegates memory-management to the OS.

View File

@ -229,8 +229,6 @@ call append("$", "compatible\tbehave very Vi compatible (not advisable)")
call <SID>BinOptionG("cp", &cp)
call append("$", "cpoptions\tlist of flags to specify Vi compatibility")
call <SID>OptionG("cpo", &cpo)
call append("$", "insertmode\tuse Insert mode as the default mode")
call <SID>BinOptionG("im", &im)
call append("$", "paste\tpaste mode, insert typed text literally")
call <SID>BinOptionG("paste", &paste)
call append("$", "pastetoggle\tkey sequence to toggle paste mode")

View File

@ -459,9 +459,8 @@ static void insert_enter(InsertState *s)
where_paste_started.lnum = 0;
can_cindent = true;
// The cursor line is not in a closed fold, unless 'insertmode' is set or
// restarting.
if (!p_im && did_restart_edit == 0) {
// The cursor line is not in a closed fold, unless restarting.
if (did_restart_edit == 0) {
foldOpenCursor();
}
@ -473,7 +472,7 @@ static void insert_enter(InsertState *s)
s->i = showmode();
}
if (!p_im && did_restart_edit == 0) {
if (did_restart_edit == 0) {
change_warning(curbuf, s->i == 0 ? 0 : s->i + 1);
}
@ -554,7 +553,7 @@ static int insert_check(VimState *state)
}
if (stop_insert_mode && !compl_started) {
// ":stopinsert" used or 'insertmode' reset
// ":stopinsert" used
s->count = 0;
return 0; // exit insert mode
}
@ -756,7 +755,6 @@ static int insert_execute(VimState *state, int key)
}
// CTRL-\ CTRL-N goes to Normal mode,
// CTRL-\ CTRL-G goes to mode selected with 'insertmode',
// CTRL-\ CTRL-O is like CTRL-O but without moving the cursor
if (s->c == Ctrl_BSL) {
// may need to redraw when no more chars available now
@ -770,8 +768,6 @@ static int insert_execute(VimState *state, int key)
// it's something else
vungetc(s->c);
s->c = Ctrl_BSL;
} else if (s->c == Ctrl_G && p_im) {
return 1; // continue
} else {
if (s->c == Ctrl_O) {
ins_ctrl_o();
@ -843,16 +839,6 @@ static int insert_execute(VimState *state, int key)
}
/// Return true when need to go to Insert mode because of 'insertmode'.
///
/// Don't do this when still processing a command or a mapping.
/// Don't do this when inside a ":normal" command.
bool goto_im(void)
FUNC_ATTR_PURE
{
return p_im && stuff_empty() && typebuf_typed();
}
static int insert_handle_key(InsertState *s)
{
// The big switch to handle a character in insert mode.
@ -884,26 +870,10 @@ static int insert_handle_key(InsertState *s)
}
}
// when 'insertmode' set, and not halfway through a mapping, don't leave
// Insert mode
if (goto_im()) {
if (got_int) {
(void)vgetc(); // flush all buffers
got_int = false;
} else {
vim_beep(BO_IM);
}
break;
}
return 0; // exit insert mode
case Ctrl_Z: // suspend when 'insertmode' set
if (!p_im) {
goto normalchar; // insert CTRL-Z as normal char
}
do_cmdline_cmd("stop");
ui_cursor_shape(); // may need to update cursor shape
break;
case Ctrl_Z:
goto normalchar; // insert CTRL-Z as normal char
case Ctrl_O: // execute one command
if (ctrl_x_mode == CTRL_X_OMNI) {
@ -939,9 +909,6 @@ static int insert_handle_key(InsertState *s)
case K_F1:
case K_XF1:
stuffcharReadbuff(K_HELP);
if (p_im) {
need_start_insertmode = true;
}
return 0; // exit insert mode
@ -956,7 +923,7 @@ static int insert_handle_key(InsertState *s)
// For ^@ the trailing ESC will end the insert, unless there is an
// error.
if (stuff_inserted(NUL, 1L, (s->c == Ctrl_A)) == FAIL
&& s->c != Ctrl_A && !p_im) {
&& s->c != Ctrl_A) {
return 0; // exit insert mode
}
s->inserted_space = false;
@ -1236,7 +1203,7 @@ check_pum:
}
break;
}
if (!ins_eol(s->c) && !p_im) {
if (!ins_eol(s->c)) {
return 0; // out of memory
}
auto_format(false, false);
@ -1288,13 +1255,6 @@ check_pum:
case Ctrl_L: // Whole line completion after ^X
if (ctrl_x_mode != CTRL_X_WHOLE_LINE) {
// CTRL-L with 'insertmode' set: Leave Insert mode
if (p_im) {
if (echeck_abbr(Ctrl_L + ABBR_OFF)) {
break;
}
return 0; // exit insert mode
}
goto normalchar;
}
FALLTHROUGH;
@ -7964,10 +7924,8 @@ static bool ins_esc(long *count, int cmdchar, bool nomove)
}
if (!arrow_used) {
// Don't append the ESC for "r<CR>" and "grx".
// When 'insertmode' is set only CTRL-L stops Insert mode. Needed for
// when "count" is non-zero.
if (cmdchar != 'r' && cmdchar != 'v') {
AppendToRedobuff(p_im ? "\014" : ESC_STR);
AppendToRedobuff(ESC_STR);
}
/*

View File

@ -2880,10 +2880,6 @@ int do_ecmd(int fnum, char *ffname, char *sfname, exarg_T *eap, linenr_T newlnum
redraw_curbuf_later(NOT_VALID); // redraw this buffer later
}
if (p_im && (State & MODE_INSERT) == 0) {
need_start_insertmode = true;
}
// Change directories when the 'acd' option is set.
do_autochdir();
@ -4909,9 +4905,8 @@ void ex_help(exarg_T *eap)
}
}
if (!p_im) {
restart_edit = 0; // don't want insert mode in help file
}
restart_edit = 0; // don't want insert mode in help file
// Restore KeyTyped, setting 'filetype=help' may reset it.
// It is needed for do_tag top open folds under the cursor.
KeyTyped = old_KeyTyped;

View File

@ -8979,7 +8979,6 @@ bool save_current_state(save_state_T *sst)
sst->save_restart_edit = restart_edit;
sst->save_msg_didout = msg_didout;
sst->save_State = State;
sst->save_insertmode = p_im;
sst->save_finish_op = finish_op;
sst->save_opcount = opcount;
sst->save_reg_executing = reg_executing;
@ -8987,7 +8986,6 @@ bool save_current_state(save_state_T *sst)
msg_scroll = false; // no msg scrolling in Normal mode
restart_edit = 0; // don't go to Insert mode
p_im = false; // don't use 'insertmode
// Save the current typeahead. This is required to allow using ":normal"
// from an event handler and makes sure we don't hang when the argument
@ -9010,7 +9008,6 @@ void restore_current_state(save_state_T *sst)
// override the value of restart_edit anyway.
restart_edit = sst->save_restart_edit;
}
p_im = sst->save_insertmode;
finish_op = sst->save_finish_op;
opcount = sst->save_opcount;
reg_executing = sst->save_reg_executing;

View File

@ -25,7 +25,6 @@ typedef struct {
int save_restart_edit;
bool save_msg_didout;
int save_State;
int save_insertmode;
bool save_finish_op;
long save_opcount;
int save_reg_executing;

View File

@ -1336,8 +1336,7 @@ static int command_line_execute(VimState *state, int key)
}
}
// CTRL-\ CTRL-N goes to Normal mode, CTRL-\ CTRL-G goes to Insert
// mode when 'insertmode' is set, CTRL-\ e prompts for an expression.
// CTRL-\ CTRL-N goes to Normal mode, CTRL-\ e prompts for an expression.
if (s->c == Ctrl_BSL) {
no_mapping++;
allow_keys++;
@ -1399,9 +1398,6 @@ static int command_line_execute(VimState *state, int key)
redrawcmd();
return command_line_not_changed(s);
} else {
if (s->c == Ctrl_G && p_im && restart_edit == 0) {
restart_edit = 'a';
}
s->gotesc = true; // will free ccline.cmdbuff after putting it
// in history
return 0; // back to Normal mode

View File

@ -1352,14 +1352,12 @@ void openscript(char_u *name, bool directly)
int oldcurscript;
int save_State = State;
int save_restart_edit = restart_edit;
int save_insertmode = p_im;
int save_finish_op = finish_op;
int save_msg_scroll = msg_scroll;
State = MODE_NORMAL;
msg_scroll = false; // no msg scrolling in Normal mode
restart_edit = 0; // don't go to Insert mode
p_im = false; // don't use 'insertmode'
clear_oparg(&oa);
finish_op = false;
@ -1373,7 +1371,6 @@ void openscript(char_u *name, bool directly)
State = save_State;
msg_scroll = save_msg_scroll;
restart_edit = save_restart_edit;
p_im = save_insertmode;
finish_op = save_finish_op;
}
}
@ -2513,16 +2510,12 @@ static int vgetorpeek(bool advance)
timedout = true;
continue;
}
// When 'insertmode' is set, ESC just beeps in Insert
// mode. Use CTRL-L to make edit() return.
// In Ex-mode \n is compatible with original Vim behaviour.
// For the command line only CTRL-C always breaks it.
// For the cmdline window: Alternate between ESC and
// CTRL-C: ESC for most situations and CTRL-C to close the
// cmdline window.
if (p_im && (State & MODE_INSERT)) {
c = Ctrl_L;
} else if ((State & MODE_CMDLINE) || (cmdwin_type > 0 && tc == ESC)) {
if ((State & MODE_CMDLINE) || (cmdwin_type > 0 && tc == ESC)) {
c = Ctrl_C;
} else {
c = ESC;

View File

@ -530,11 +530,6 @@ int main(int argc, char **argv)
// 'autochdir' has been postponed.
do_autochdir();
// start in insert mode
if (p_im) {
need_start_insertmode = true;
}
set_vim_var_nr(VV_VIM_DID_ENTER, 1L);
apply_autocmds(EVENT_VIMENTER, NULL, NULL, false, curbuf);
TIME_MSG("VimEnter autocommands");

View File

@ -1126,9 +1126,6 @@ static int normal_execute(VimState *state, int key)
if (s->ca.nchar == ESC) {
clearop(&s->oa);
if (restart_edit == 0 && goto_im()) {
restart_edit = 'a';
}
s->command_finished = true;
goto finish;
}
@ -1178,14 +1175,6 @@ static void normal_check_stuff_buffer(NormalState *s)
// if wait_return still needed call it now
wait_return(false);
}
if (need_start_insertmode && goto_im() && !VIsual_active) {
need_start_insertmode = false;
stuffReadbuff("i"); // start insert mode next
// skip the fileinfo message now, because it would be shown
// after insert mode finishes!
need_fileinfo = false;
}
}
}
@ -3904,7 +3893,6 @@ static void nv_regreplay(cmdarg_T *cap)
/// Handle a ":" command and <Cmd> or Lua keymaps.
static void nv_colon(cmdarg_T *cap)
{
int old_p_im;
bool cmd_result;
bool is_cmdkey = cap->cmdchar == K_COMMAND;
bool is_lua = cap->cmdchar == K_LUA;
@ -3930,8 +3918,6 @@ static void nv_colon(cmdarg_T *cap)
compute_cmdrow();
}
old_p_im = p_im;
if (is_lua) {
cmd_result = map_execute_lua();
} else {
@ -3940,15 +3926,6 @@ static void nv_colon(cmdarg_T *cap)
cap->oap->op_type != OP_NOP ? DOCMD_KEEPLINE : 0);
}
// If 'insertmode' changed, enter or exit Insert mode
if (p_im != old_p_im) {
if (p_im) {
restart_edit = 'i';
} else {
restart_edit = 0;
}
}
if (cmd_result == false) {
// The Ex command failed, do not execute the operator.
clearop(cap->oap);
@ -6735,10 +6712,6 @@ static void nv_normal(cmdarg_T *cap)
end_visual_mode(); // stop Visual
redraw_curbuf_later(INVERTED);
}
// CTRL-\ CTRL-G restarts Insert mode when 'insertmode' is set.
if (cap->nchar == Ctrl_G && p_im) {
restart_edit = 'a';
}
} else {
clearopbeep(cap->oap);
}
@ -6753,8 +6726,7 @@ static void nv_esc(cmdarg_T *cap)
no_reason = (cap->oap->op_type == OP_NOP
&& cap->opcount == 0
&& cap->count0 == 0
&& cap->oap->regname == 0
&& !p_im);
&& cap->oap->regname == 0);
if (cap->arg) { // true for CTRL-C
if (restart_edit == 0
@ -6771,9 +6743,8 @@ static void nv_esc(cmdarg_T *cap)
// Don't reset "restart_edit" when 'insertmode' is set, it won't be
// set again below when halfway through a mapping.
if (!p_im) {
restart_edit = 0;
}
restart_edit = 0;
if (cmdwin_type != 0) {
cmdwin_result = K_IGNORE;
got_int = false; // don't stop executing autocommands et al.
@ -6796,13 +6767,6 @@ static void nv_esc(cmdarg_T *cap)
vim_beep(BO_ESC);
}
clearop(cap->oap);
// A CTRL-C is often used at the start of a menu. When 'insertmode' is
// set return to Insert mode afterwards.
if (restart_edit == 0 && goto_im()
&& ex_normal_busy == 0) {
restart_edit = 'a';
}
}
// Move the cursor for the "A" command.
@ -6837,8 +6801,7 @@ static void nv_edit(cmdarg_T *cap)
} else if ((cap->cmdchar == 'a' || cap->cmdchar == 'i')
&& (cap->oap->op_type != OP_NOP || VIsual_active)) {
nv_object(cap);
} else if (!curbuf->b_p_ma && !p_im && !curbuf->terminal) {
// Only give this error when 'insertmode' is off.
} else if (!curbuf->b_p_ma && !curbuf->terminal) {
emsg(_(e_modifiable));
clearop(cap->oap);
} else if (!checkclearopq(cap->oap)) {

View File

@ -6719,7 +6719,7 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank)
// remember it to make 'insertmode' work with mappings for
// Visual mode. But do this only once and not when typed and
// 'insertmode' isn't set.
if (p_im || !KeyTyped) {
if (!KeyTyped) {
restart_edit_save = restart_edit;
} else {
restart_edit_save = 0;

View File

@ -4052,21 +4052,6 @@ static char *set_bool_option(const int opt_idx, char_u *const varp, const int va
} else if ((int *)varp == &p_paste) {
// when 'paste' is set or reset also change other options
paste_option_changed();
} else if ((int *)varp == &p_im) {
// when 'insertmode' is set from an autocommand need to do work here
if (p_im) {
if ((State & MODE_INSERT) == 0) {
need_start_insertmode = true;
}
stop_insert_mode = false;
} else if (old_value) { // only reset if it was set previously
need_start_insertmode = false;
stop_insert_mode = true;
if (restart_edit != 0 && mode_displayed) {
clear_cmdline = true; // remove "(insert)"
}
restart_edit = 0;
}
} else if ((int *)varp == &p_ic && p_hls) {
// when 'ignorecase' is set or reset and 'hlsearch' is set, redraw
redraw_all_later(SOME_VALID);

View File

@ -334,9 +334,9 @@ EXTERN unsigned bo_flags;
#ifdef IN_OPTION_C
static char *(p_bo_values[]) = { "all", "backspace", "cursor", "complete",
"copy", "ctrlg", "error", "esc", "ex",
"hangul", "insertmode", "lang", "mess",
"showmatch", "operator", "register", "shell",
"spell", "wildmode", NULL };
"hangul", "lang", "mess", "showmatch",
"operator", "register", "shell", "spell",
"wildmode", NULL };
#endif
// values for the 'belloff' option
@ -485,7 +485,6 @@ EXTERN char_u *p_iconstring; // 'iconstring'
EXTERN int p_ic; // 'ignorecase'
EXTERN int p_is; // 'incsearch'
EXTERN char_u *p_icm; // 'inccommand'
EXTERN int p_im; // 'insertmode'
EXTERN char_u *p_isf; // 'isfname'
EXTERN char_u *p_isi; // 'isident'
EXTERN char_u *p_isp; // 'isprint'

View File

@ -1250,9 +1250,9 @@ return {
},
{
full_name='insertmode', abbreviation='im',
short_desc=N_("start the edit of a file in Insert mode"),
short_desc=N_("No description"),
type='bool', scope={'global'},
varname='p_im',
varname='p_force_off',
defaults={if_true=false}
},
{

View File

@ -2540,9 +2540,7 @@ static int jump_to_help_window(qf_info_T *qi, bool newwin, int *opened_window)
}
}
if (!p_im) {
restart_edit = 0; // don't want insert mode in help file
}
restart_edit = 0; // don't want insert mode in help file
return OK;
}

View File

@ -16,8 +16,9 @@ func Test_edit_00b()
call setline(1, ['abc '])
inoreabbr <buffer> h here some more
call cursor(1, 4)
" <c-l> expands the abbreviation and ends insertmode
call feedkeys(":set im\<cr> h\<c-l>:set noim\<cr>", 'tix')
" <esc> expands the abbreviation and ends insert mode
" call feedkeys(":set im\<cr> h\<c-l>:set noim\<cr>", 'tix')
call feedkeys("i h\<esc>", 'tix')
call assert_equal(['abc here some more '], getline(1,'$'))
iunabbr <buffer> h
bw!
@ -234,15 +235,18 @@ func Test_edit_09()
call setline(1, ['abc', 'def', 'ghi'])
call cursor(1, 1)
" 1) CTRL-\ CTLR-N
call feedkeys(":set im\<cr>\<c-\>\<c-n>ccABC\<c-l>", 'txin')
" call feedkeys(":set im\<cr>\<c-\>\<c-n>ccABC\<c-l>", 'txin')
call feedkeys("i\<c-\>\<c-n>ccABC\<esc>", 'txin')
call assert_equal(['ABC', 'def', 'ghi'], getline(1,'$'))
call setline(1, ['ABC', 'def', 'ghi'])
" 2) CTRL-\ CTLR-G
call feedkeys("j0\<c-\>\<c-g>ZZZ\<cr>\<c-l>", 'txin')
call assert_equal(['ABC', 'ZZZ', 'def', 'ghi'], getline(1,'$'))
call feedkeys("I\<c-\>\<c-g>YYY\<c-l>", 'txin')
call assert_equal(['ABC', 'ZZZ', 'YYYdef', 'ghi'], getline(1,'$'))
set noinsertmode
" CTRL-\ CTRL-G goes to Insert mode when 'insertmode' is set, but
" 'insertmode' is now removed so skip this test
" call feedkeys("j0\<c-\>\<c-g>ZZZ\<cr>\<esc>", 'txin')
" call assert_equal(['ABC', 'ZZZ', 'def', 'ghi'], getline(1,'$'))
" call feedkeys("I\<c-\>\<c-g>YYY\<c-l>", 'txin')
" call assert_equal(['ABC', 'ZZZ', 'YYYdef', 'ghi'], getline(1,'$'))
" set noinsertmode
" 3) CTRL-\ CTRL-O
call setline(1, ['ABC', 'ZZZ', 'def', 'ghi'])
call cursor(1, 1)
@ -1043,7 +1047,8 @@ endfunc
func Test_edit_F1()
" Pressing <f1>
new
call feedkeys(":set im\<cr>\<f1>\<c-l>", 'tnix')
" call feedkeys(":set im\<cr>\<f1>\<c-l>", 'tnix')
call feedkeys("i\<f1>\<esc>", 'tnix')
set noinsertmode
call assert_equal('help', &buftype)
bw

View File

@ -133,7 +133,8 @@ func Test_normal02_selectmode2()
" some basic select mode tests
call Setup_NewWindow()
50
call feedkeys(":set im\n\<c-o>gHc\<c-o>:set noim\n", 'tx')
" call feedkeys(":set im\n\<c-o>gHc\<c-o>:set noim\n", 'tx')
call feedkeys("i\<c-o>gHc\<esc>", 'tx')
call assert_equal('c51', getline('.'))
" clean up
bw!
@ -2113,11 +2114,11 @@ fun! Test_normal40_ctrl_bsl()
call assert_equal('n', mode())
call assert_equal(1, col('.'))
"imap <buffer> , <c-\><c-n>
set im
" set im
exe ":norm! \<c-\>\<c-n>dw"
set noim
" set noim
call assert_equal('are some words', getline(1))
call assert_false(&insertmode)
" call assert_false(&insertmode)
" clean up
bw!

View File

@ -6,8 +6,6 @@ local expect = helpers.expect
local command = helpers.command
local eq = helpers.eq
local eval = helpers.eval
local meths = helpers.meths
local poke_eventloop = helpers.poke_eventloop
describe('insert-mode', function()
before_each(function()
@ -135,26 +133,4 @@ describe('insert-mode', function()
feed('i<C-S-V><C-J><C-S-V><C-@><C-S-V><C-[><C-S-V><C-S-M><C-S-V><M-C-I><C-S-V><C-D-J><Esc>')
expect('<C-J><C-@><C-[><C-S-M><M-C-I><C-D-J>')
end)
describe([[With 'insertmode', Insert mode is not re-entered immediately after <C-L>]], function()
before_each(function()
command('set insertmode')
poke_eventloop()
eq({mode = 'i', blocking = false}, meths.get_mode())
end)
it('after calling :edit from <Cmd> mapping', function()
command('inoremap <C-B> <Cmd>edit Xfoo<CR>')
feed('<C-B><C-L>')
poke_eventloop()
eq({mode = 'n', blocking = false}, meths.get_mode())
end)
it('after calling :edit from RPC #16823', function()
command('edit Xfoo')
feed('<C-L>')
poke_eventloop()
eq({mode = 'n', blocking = false}, meths.get_mode())
end)
end)
end)

View File

@ -1,25 +0,0 @@
-- Test for edit functions
-- See also: src/nvim/testdir/test_edit.vim
local helpers = require('test.functional.helpers')(after_each)
local source = helpers.source
local eq, eval = helpers.eq, helpers.eval
local funcs = helpers.funcs
local clear = helpers.clear
describe('edit', function()
before_each(clear)
it('reset insertmode from i_ctrl-r_=', function()
source([=[
call setline(1, ['abc'])
call cursor(1, 4)
call feedkeys(":set im\<cr>ZZZ\<c-r>=setbufvar(1,'&im', 0)\<cr>",'tnix')
]=])
eq({'abZZZc'}, funcs.getline(1,'$'))
eq({0, 1, 1, 0}, funcs.getpos('.'))
eq(0, eval('&im'))
end)
end)