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:
committed by
Bram Moolenaar
parent
d988ef3a55
commit
4ccaedfcd7
@@ -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
|
||||||
|
@@ -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},
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user