aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUsama Hameed <usama54321@gmail.com>2019-09-15 03:54:19 +0500
committerJustin M. Keyes <justinkz@gmail.com>2019-09-14 15:54:19 -0700
commitfc27dc98d74f0e25bf1dc2cb8ff399b05ccd6f2c (patch)
tree65bc3f2ad808f50247ce923861db0dad20fe644b
parent8c88d98df955ebf2fb93506c19ce2af82e24a2df (diff)
downloadrneovim-fc27dc98d74f0e25bf1dc2cb8ff399b05ccd6f2c.tar.gz
rneovim-fc27dc98d74f0e25bf1dc2cb8ff399b05ccd6f2c.tar.bz2
rneovim-fc27dc98d74f0e25bf1dc2cb8ff399b05ccd6f2c.zip
autocmds: TermEnter, TermLeave #8550
fix #8428
-rw-r--r--runtime/doc/autocmd.txt16
-rw-r--r--runtime/doc/nvim_terminal_emulator.txt2
-rw-r--r--src/nvim/auevents.lua2
-rw-r--r--src/nvim/terminal.c3
-rw-r--r--test/functional/autocmd/termxx_spec.lua (renamed from test/functional/autocmd/termclose_spec.lua)37
5 files changed, 53 insertions, 7 deletions
diff --git a/runtime/doc/autocmd.txt b/runtime/doc/autocmd.txt
index 05a4167b48..34ea083f96 100644
--- a/runtime/doc/autocmd.txt
+++ b/runtime/doc/autocmd.txt
@@ -268,8 +268,10 @@ Name triggered by ~
|BufNew| just after creating a new buffer
|SwapExists| detected an existing swap file
-|TermOpen| when a terminal job starts
-|TermClose| when a terminal job ends
+|TermOpen| starting a terminal job
+|TermEnter| entering Terminal-mode
+|TermLeave| leaving Terminal-mode
+|TermClose| stopping a terminal job
|ChanOpen| after a channel opened
|ChanInfo| after a channel has its state changed
@@ -1049,11 +1051,17 @@ TabNewEntered After entering a new tab page. |tab-page|
*TabClosed*
TabClosed After closing a tab page. <afile> can be used
for the tab page number.
- *TermClose*
-TermClose When a |terminal| job ends.
*TermOpen*
TermOpen When a |terminal| job is starting. Can be
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 After the response to t_RV is received from
the terminal. The value of |v:termresponse|
diff --git a/runtime/doc/nvim_terminal_emulator.txt b/runtime/doc/nvim_terminal_emulator.txt
index d1831a8de6..1a5e6421e7 100644
--- a/runtime/doc/nvim_terminal_emulator.txt
+++ b/runtime/doc/nvim_terminal_emulator.txt
@@ -88,7 +88,7 @@ Mouse input has the following behavior:
Configuration *terminal-configuration*
Options: 'modified', 'scrollback'
-Events: |TermOpen|, |TermClose|
+Events: |TermOpen|, |TermEnter|, |TermLeave|, |TermClose|
Highlight groups: |hl-TermCursor|, |hl-TermCursorNC|
Terminal sets local defaults for some options, which may differ from your
diff --git a/src/nvim/auevents.lua b/src/nvim/auevents.lua
index c808af37b1..c223679596 100644
--- a/src/nvim/auevents.lua
+++ b/src/nvim/auevents.lua
@@ -90,6 +90,8 @@ return {
'TabNewEntered', -- after entering a new tab
'TermChanged', -- after changing 'term'
'TermClose', -- after the process exits
+ 'TermEnter', -- after entering Terminal mode
+ 'TermLeave', -- after leaving Terminal mode
'TermOpen', -- after opening a terminal buffer
'TermResponse', -- after setting "v:termresponse"
'TextChanged', -- text was modified
diff --git a/src/nvim/terminal.c b/src/nvim/terminal.c
index b1ce0e6592..8fcc8bf0a5 100644
--- a/src/nvim/terminal.c
+++ b/src/nvim/terminal.c
@@ -355,6 +355,7 @@ void terminal_enter(void)
showmode();
curwin->w_redr_status = true; // For mode() in statusline. #8323
ui_busy_start();
+ apply_autocmds(EVENT_TERMENTER, NULL, NULL, false, curbuf);
s->state.execute = terminal_execute;
s->state.check = terminal_check;
@@ -363,6 +364,8 @@ void terminal_enter(void)
restart_edit = 0;
State = save_state;
RedrawingDisabled = s->save_rd;
+ apply_autocmds(EVENT_TERMLEAVE, NULL, NULL, false, curbuf);
+
if (save_curwin == curwin) { // save_curwin may be invalid (window closed)!
curwin->w_p_cul = save_w_p_cul;
curwin->w_p_cuc = save_w_p_cuc;
diff --git a/test/functional/autocmd/termclose_spec.lua b/test/functional/autocmd/termxx_spec.lua
index 50bcf1af5a..b12c24b58d 100644
--- a/test/functional/autocmd/termclose_spec.lua
+++ b/test/functional/autocmd/termxx_spec.lua
@@ -9,8 +9,7 @@ local ok = helpers.ok
local feed = helpers.feed
local iswin = helpers.iswin
-
-describe('TermClose event', function()
+describe('autocmd TermClose', function()
before_each(function()
clear()
nvim('set_option', 'shell', nvim_dir .. '/shell-test')
@@ -92,3 +91,37 @@ describe('TermClose event', function()
feed('<c-c>:qa!<cr>')
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)