autocmds: TermEnter, TermLeave #8550

fix #8428
This commit is contained in:
Usama Hameed 2019-09-15 03:54:19 +05:00 committed by Justin M. Keyes
parent 8c88d98df9
commit fc27dc98d7
5 changed files with 53 additions and 7 deletions

View File

@ -268,8 +268,10 @@ Name triggered by ~
|BufNew| just after creating a new buffer |BufNew| just after creating a new buffer
|SwapExists| detected an existing swap file |SwapExists| detected an existing swap file
|TermOpen| when a terminal job starts |TermOpen| starting a terminal job
|TermClose| when a terminal job ends |TermEnter| entering Terminal-mode
|TermLeave| leaving Terminal-mode
|TermClose| stopping a terminal job
|ChanOpen| after a channel opened |ChanOpen| after a channel opened
|ChanInfo| after a channel has its state changed |ChanInfo| after a channel has its state changed
@ -1049,11 +1051,17 @@ TabNewEntered After entering a new tab page. |tab-page|
*TabClosed* *TabClosed*
TabClosed After closing a tab page. <afile> can be used TabClosed After closing a tab page. <afile> can be used
for the tab page number. for the tab page number.
*TermClose*
TermClose When a |terminal| job ends.
*TermOpen* *TermOpen*
TermOpen When a |terminal| job is starting. Can be TermOpen When a |terminal| job is starting. Can be
used to configure the terminal buffer. used to configure the terminal buffer.
*TermEnter*
TermEnter After entering |Terminal-mode|.
After TermOpen.
*TermLeave*
TermLeave After leaving |Terminal-mode|.
After TermClose.
*TermClose*
TermClose When a |terminal| job ends.
*TermResponse* *TermResponse*
TermResponse After the response to t_RV is received from TermResponse After the response to t_RV is received from
the terminal. The value of |v:termresponse| the terminal. The value of |v:termresponse|

View File

@ -88,7 +88,7 @@ Mouse input has the following behavior:
Configuration *terminal-configuration* Configuration *terminal-configuration*
Options: 'modified', 'scrollback' Options: 'modified', 'scrollback'
Events: |TermOpen|, |TermClose| Events: |TermOpen|, |TermEnter|, |TermLeave|, |TermClose|
Highlight groups: |hl-TermCursor|, |hl-TermCursorNC| Highlight groups: |hl-TermCursor|, |hl-TermCursorNC|
Terminal sets local defaults for some options, which may differ from your Terminal sets local defaults for some options, which may differ from your

View File

@ -90,6 +90,8 @@ return {
'TabNewEntered', -- after entering a new tab 'TabNewEntered', -- after entering a new tab
'TermChanged', -- after changing 'term' 'TermChanged', -- after changing 'term'
'TermClose', -- after the process exits 'TermClose', -- after the process exits
'TermEnter', -- after entering Terminal mode
'TermLeave', -- after leaving Terminal mode
'TermOpen', -- after opening a terminal buffer 'TermOpen', -- after opening a terminal buffer
'TermResponse', -- after setting "v:termresponse" 'TermResponse', -- after setting "v:termresponse"
'TextChanged', -- text was modified 'TextChanged', -- text was modified

View File

@ -355,6 +355,7 @@ void terminal_enter(void)
showmode(); showmode();
curwin->w_redr_status = true; // For mode() in statusline. #8323 curwin->w_redr_status = true; // For mode() in statusline. #8323
ui_busy_start(); ui_busy_start();
apply_autocmds(EVENT_TERMENTER, NULL, NULL, false, curbuf);
s->state.execute = terminal_execute; s->state.execute = terminal_execute;
s->state.check = terminal_check; s->state.check = terminal_check;
@ -363,6 +364,8 @@ void terminal_enter(void)
restart_edit = 0; restart_edit = 0;
State = save_state; State = save_state;
RedrawingDisabled = s->save_rd; RedrawingDisabled = s->save_rd;
apply_autocmds(EVENT_TERMLEAVE, NULL, NULL, false, curbuf);
if (save_curwin == curwin) { // save_curwin may be invalid (window closed)! if (save_curwin == curwin) { // save_curwin may be invalid (window closed)!
curwin->w_p_cul = save_w_p_cul; curwin->w_p_cul = save_w_p_cul;
curwin->w_p_cuc = save_w_p_cuc; curwin->w_p_cuc = save_w_p_cuc;

View File

@ -9,8 +9,7 @@ local ok = helpers.ok
local feed = helpers.feed local feed = helpers.feed
local iswin = helpers.iswin local iswin = helpers.iswin
describe('autocmd TermClose', function()
describe('TermClose event', function()
before_each(function() before_each(function()
clear() clear()
nvim('set_option', 'shell', nvim_dir .. '/shell-test') nvim('set_option', 'shell', nvim_dir .. '/shell-test')
@ -92,3 +91,37 @@ describe('TermClose event', function()
feed('<c-c>:qa!<cr>') feed('<c-c>:qa!<cr>')
end) end)
end) end)
it('autocmd TermEnter, TermLeave', function()
clear()
command('let g:evs = []')
command('autocmd TermOpen * call add(g:evs, ["TermOpen", mode()])')
command('autocmd TermClose * call add(g:evs, ["TermClose", mode()])')
command('autocmd TermEnter * call add(g:evs, ["TermEnter", mode()])')
command('autocmd TermLeave * call add(g:evs, ["TermLeave", mode()])')
command('terminal')
feed('i')
eq({ {'TermOpen', 'n'}, {'TermEnter', 't'}, }, eval('g:evs'))
feed([[<C-\><C-n>]])
feed('A')
eq({ {'TermOpen', 'n'}, {'TermEnter', 't'}, {'TermLeave', 'n'}, {'TermEnter', 't'}, }, eval('g:evs'))
-- TermLeave is also triggered by :quit.
command('split foo')
command('wincmd w')
feed('i')
command('q!')
eq(
{
{'TermOpen', 'n'},
{'TermEnter', 't'},
{'TermLeave', 'n'},
{'TermEnter', 't'},
{'TermLeave', 'n'},
{'TermEnter', 't'},
{'TermClose', 't'},
{'TermLeave', 'n'},
},
eval('g:evs'))
end)