0
0
mirror of https://github.com/vim/vim.git synced 2025-09-27 04:14:06 -04:00

patch 9.0.0756: no autocmd event for changing text in a terminal window

Problem:    No autocmd event for changing text in a terminal window.
Solution:   Add TextChangedT. (Shougo Matsushita, closes #11366)
This commit is contained in:
Shougo Matsushita
2022-10-15 11:48:00 +01:00
committed by Bram Moolenaar
parent d988ef3a55
commit 4ccaedfcd7
6 changed files with 70 additions and 0 deletions

View File

@@ -409,6 +409,7 @@ Name triggered by ~
when popup menu is not visible when popup menu is not visible
|TextChangedP| after a change was made to the text in Insert mode |TextChangedP| after a change was made to the text in Insert mode
when popup menu visible when popup menu visible
|TextChangedT| after a change was made to the text in Terminal mode
|TextYankPost| after text has been yanked or deleted |TextYankPost| after text has been yanked or deleted
|SafeState| nothing pending, going to wait for the user to type a |SafeState| nothing pending, going to wait for the user to type a
@@ -1237,6 +1238,10 @@ TextChangedP After a change was made to the text in the
current buffer in Insert mode, only when the current buffer in Insert mode, only when the
popup menu is visible. Otherwise the same as popup menu is visible. Otherwise the same as
TextChanged. TextChanged.
*TextChangedT*
TextChangedT After a change was made to the text in the
current buffer in Terminal mode.
Otherwise the same as TextChanged.
*TextYankPost* *TextYankPost*
TextYankPost After text has been yanked or deleted in the TextYankPost After text has been yanked or deleted in the
current buffer. The following values of current buffer. The following values of

View File

@@ -182,6 +182,7 @@ static struct event_name
{"TextChanged", EVENT_TEXTCHANGED}, {"TextChanged", EVENT_TEXTCHANGED},
{"TextChangedI", EVENT_TEXTCHANGEDI}, {"TextChangedI", EVENT_TEXTCHANGEDI},
{"TextChangedP", EVENT_TEXTCHANGEDP}, {"TextChangedP", EVENT_TEXTCHANGEDP},
{"TextChangedT", EVENT_TEXTCHANGEDT},
{"User", EVENT_USER}, {"User", EVENT_USER},
{"VimEnter", EVENT_VIMENTER}, {"VimEnter", EVENT_VIMENTER},
{"VimLeave", EVENT_VIMLEAVE}, {"VimLeave", EVENT_VIMLEAVE},

View File

@@ -1222,6 +1222,8 @@ update_cursor(term_T *term, int redraw)
setcursor(); setcursor();
if (redraw) if (redraw)
{ {
aco_save_T aco;
if (term->tl_buffer == curbuf && term->tl_cursor_visible) if (term->tl_buffer == curbuf && term->tl_cursor_visible)
cursor_on(); cursor_on();
out_flush(); out_flush();
@@ -1232,6 +1234,16 @@ update_cursor(term_T *term, int redraw)
gui_mch_flush(); gui_mch_flush();
} }
#endif #endif
// Make sure an invoked autocmd doesn't delete the buffer (and the
// terminal) under our fingers.
++term->tl_buffer->b_locked;
// save and restore curwin and curbuf, in case the autocmd changes them
aucmd_prepbuf(&aco, curbuf);
apply_autocmds(EVENT_TEXTCHANGEDT, NULL, NULL, FALSE, term->tl_buffer);
aucmd_restbuf(&aco);
--term->tl_buffer->b_locked;
} }
} }

View File

@@ -2321,5 +2321,54 @@ func Test_term_wait_in_close_cb()
bwipe! bwipe!
endfunc endfunc
func Test_term_TextChangedT()
augroup TermTest
autocmd TextChangedT * ++once
\ execute expand('<abuf>') . 'buffer' |
\ let b:called = 1 |
\ split |
\ enew
augroup END
terminal
let term_buf = bufnr()
let b:called = 0
call term_sendkeys(term_buf, "aaabbc\r")
call TermWait(term_buf)
call assert_equal(1, getbufvar(term_buf, 'called'))
" Current buffer will be restored
call assert_equal(bufnr(), term_buf)
bwipe!
augroup TermTest
au!
augroup END
endfunc
func Test_term_TextChangedT_close()
augroup TermTest
autocmd TextChangedT * ++once split | enew | 1close!
augroup END
terminal
let term_buf = bufnr()
call term_sendkeys(term_buf, "aaabbc\r")
call TermWait(term_buf)
" Current buffer will be restored
call assert_equal(bufnr(), term_buf)
bwipe!
augroup TermTest
au!
augroup END
endfunc
" vim: shiftwidth=2 sts=2 expandtab " vim: shiftwidth=2 sts=2 expandtab

View File

@@ -695,6 +695,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 */
/**/
756,
/**/ /**/
755, 755,
/**/ /**/

View File

@@ -1394,6 +1394,7 @@ enum auto_event
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
EVENT_TEXTCHANGEDP, // TextChangedI with popup menu visible EVENT_TEXTCHANGEDP, // TextChangedI with popup menu visible
EVENT_TEXTCHANGEDT, // text was modified in Terminal mode
EVENT_TEXTYANKPOST, // after some text was yanked EVENT_TEXTYANKPOST, // after some text was yanked
EVENT_USER, // user defined autocommand EVENT_USER, // user defined autocommand
EVENT_VIMENTER, // after starting Vim EVENT_VIMENTER, // after starting Vim