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:
parent
20d89e0ac6
commit
b53e13a91a
@ -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
|
||||||
|
@ -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},
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user