1
0
forked from aniani/vim

patch 8.2.1874: can't do something just before leaving Insert mode

Problem:    Can't do something just before leaving Insert mode.
Solution:   Add the InsertLeavePre autocommand event. (closes #7177)
This commit is contained in:
Bram Moolenaar 2020-10-21 12:19:53 +02:00
parent 20d89e0ac6
commit b53e13a91a
6 changed files with 27 additions and 5 deletions

View File

@ -881,9 +881,14 @@ InsertEnter Just before starting Insert mode. Also for
The cursor is restored afterwards. If you do The cursor is restored afterwards. If you do
not want that set |v:char| to a non-empty not want that set |v:char| to a non-empty
string. string.
*InsertLeavePre*
InsertLeavePre Just before leaving Insert mode. Also when
using CTRL-O |i_CTRL-O|. Be caseful not to
change mode or use `:normal`, it will likely
cause trouble.
*InsertLeave* *InsertLeave*
InsertLeave When leaving Insert mode. Also when using InsertLeave Just after leaving Insert mode. Also when
CTRL-O |i_CTRL-O|. But not for |i_CTRL-C|. using CTRL-O |i_CTRL-O|. But not for |i_CTRL-C|.
*MenuPopup* *MenuPopup*
MenuPopup Just before showing the popup menu (under the MenuPopup Just before showing the popup menu (under the
right mouse button). Useful for adjusting the right mouse button). Useful for adjusting the

View File

@ -149,6 +149,7 @@ static struct event_name
{"InsertChange", EVENT_INSERTCHANGE}, {"InsertChange", EVENT_INSERTCHANGE},
{"InsertEnter", EVENT_INSERTENTER}, {"InsertEnter", EVENT_INSERTENTER},
{"InsertLeave", EVENT_INSERTLEAVE}, {"InsertLeave", EVENT_INSERTLEAVE},
{"InsertLeavePre", EVENT_INSERTLEAVEPRE},
{"InsertCharPre", EVENT_INSERTCHARPRE}, {"InsertCharPre", EVENT_INSERTCHARPRE},
{"MenuPopup", EVENT_MENUPOPUP}, {"MenuPopup", EVENT_MENUPOPUP},
{"OptionSet", EVENT_OPTIONSET}, {"OptionSet", EVENT_OPTIONSET},

View File

@ -3607,6 +3607,9 @@ ins_esc(
undisplay_dollar(); undisplay_dollar();
} }
if (cmdchar != 'r' && cmdchar != 'v')
ins_apply_autocmds(EVENT_INSERTLEAVEPRE);
// When an autoindent was removed, curswant stays after the // When an autoindent was removed, curswant stays after the
// indent // indent
if (restart_edit == NUL && (colnr_T)temp == curwin->w_cursor.col) if (restart_edit == NUL && (colnr_T)temp == curwin->w_cursor.col)

View File

@ -1446,31 +1446,40 @@ endfunc
func Test_edit_InsertLeave() func Test_edit_InsertLeave()
new new
au InsertLeavePre * let g:did_au_pre = 1
au InsertLeave * let g:did_au = 1 au InsertLeave * let g:did_au = 1
let g:did_au_pre = 0
let g:did_au = 0 let g:did_au = 0
call feedkeys("afoo\<Esc>", 'tx') call feedkeys("afoo\<Esc>", 'tx')
call assert_equal(1, g:did_au_pre)
call assert_equal(1, g:did_au) call assert_equal(1, g:did_au)
call assert_equal('foo', getline(1)) call assert_equal('foo', getline(1))
let g:did_au_pre = 0
let g:did_au = 0 let g:did_au = 0
call feedkeys("Sbar\<C-C>", 'tx') call feedkeys("Sbar\<C-C>", 'tx')
call assert_equal(1, g:did_au_pre)
call assert_equal(0, g:did_au) call assert_equal(0, g:did_au)
call assert_equal('bar', getline(1)) call assert_equal('bar', getline(1))
inoremap x xx<Esc> inoremap x xx<Esc>
let g:did_au_pre = 0
let g:did_au = 0 let g:did_au = 0
call feedkeys("Saax", 'tx') call feedkeys("Saax", 'tx')
call assert_equal(1, g:did_au_pre)
call assert_equal(1, g:did_au) call assert_equal(1, g:did_au)
call assert_equal('aaxx', getline(1)) call assert_equal('aaxx', getline(1))
inoremap x xx<C-C> inoremap x xx<C-C>
let g:did_au_pre = 0
let g:did_au = 0 let g:did_au = 0
call feedkeys("Sbbx", 'tx') call feedkeys("Sbbx", 'tx')
call assert_equal(1, g:did_au_pre)
call assert_equal(0, g:did_au) call assert_equal(0, g:did_au)
call assert_equal('bbxx', getline(1)) call assert_equal('bbxx', getline(1))
bwipe! bwipe!
au! InsertLeave au! InsertLeave InsertLeavePre
iunmap x iunmap x
endfunc endfunc

View File

@ -750,6 +750,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1874,
/**/ /**/
1873, 1873,
/**/ /**/

View File

@ -1298,7 +1298,8 @@ enum auto_event
EVENT_INSERTCHANGE, // when changing Insert/Replace mode EVENT_INSERTCHANGE, // when changing Insert/Replace mode
EVENT_INSERTCHARPRE, // before inserting a char EVENT_INSERTCHARPRE, // before inserting a char
EVENT_INSERTENTER, // when entering Insert mode EVENT_INSERTENTER, // when entering Insert mode
EVENT_INSERTLEAVE, // when leaving Insert mode EVENT_INSERTLEAVEPRE, // just before leaving Insert mode
EVENT_INSERTLEAVE, // just after leaving Insert mode
EVENT_MENUPOPUP, // just before popup menu is displayed EVENT_MENUPOPUP, // just before popup menu is displayed
EVENT_OPTIONSET, // option was set EVENT_OPTIONSET, // option was set
EVENT_QUICKFIXCMDPOST, // after :make, :grep etc. EVENT_QUICKFIXCMDPOST, // after :make, :grep etc.
@ -1325,7 +1326,8 @@ enum auto_event
EVENT_TABNEW, // when entering a new tab page EVENT_TABNEW, // when entering a new tab page
EVENT_TERMCHANGED, // after changing 'term' EVENT_TERMCHANGED, // after changing 'term'
EVENT_TERMINALOPEN, // after a terminal buffer was created EVENT_TERMINALOPEN, // after a terminal buffer was created
EVENT_TERMINALWINOPEN, // after a terminal buffer was created and entering its window EVENT_TERMINALWINOPEN, // after a terminal buffer was created and
// entering its window
EVENT_TERMRESPONSE, // after setting "v:termresponse" EVENT_TERMRESPONSE, // after setting "v:termresponse"
EVENT_TEXTCHANGED, // text was modified not in Insert mode EVENT_TEXTCHANGED, // text was modified not in Insert mode
EVENT_TEXTCHANGEDI, // text was modified in Insert mode EVENT_TEXTCHANGEDI, // text was modified in Insert mode