Skip to content

Commit

Permalink
patch 9.0.0756: no autocmd event for changing text in a terminal window
Browse files Browse the repository at this point in the history
Problem:    No autocmd event for changing text in a terminal window.
Solution:   Add TextChangedT. (Shougo Matsushita, closes #11366)
  • Loading branch information
Shougo authored and brammool committed Oct 15, 2022
1 parent d988ef3 commit 4ccaedf
Show file tree
Hide file tree
Showing 6 changed files with 70 additions and 0 deletions.
5 changes: 5 additions & 0 deletions runtime/doc/autocmd.txt
Original file line number Diff line number Diff line change
Expand Up @@ -409,6 +409,7 @@ Name triggered by ~
when popup menu is not visible
|TextChangedP| after a change was made to the text in Insert mode
when popup menu visible
|TextChangedT| after a change was made to the text in Terminal mode
|TextYankPost| after text has been yanked or deleted

|SafeState| nothing pending, going to wait for the user to type a
Expand Down Expand Up @@ -1237,6 +1238,10 @@ TextChangedP After a change was made to the text in the
current buffer in Insert mode, only when the
popup menu is visible. Otherwise the same as
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 After text has been yanked or deleted in the
current buffer. The following values of
Expand Down
1 change: 1 addition & 0 deletions src/autocmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,7 @@ static struct event_name
{"TextChanged", EVENT_TEXTCHANGED},
{"TextChangedI", EVENT_TEXTCHANGEDI},
{"TextChangedP", EVENT_TEXTCHANGEDP},
{"TextChangedT", EVENT_TEXTCHANGEDT},
{"User", EVENT_USER},
{"VimEnter", EVENT_VIMENTER},
{"VimLeave", EVENT_VIMLEAVE},
Expand Down
12 changes: 12 additions & 0 deletions src/terminal.c
Original file line number Diff line number Diff line change
Expand Up @@ -1222,6 +1222,8 @@ update_cursor(term_T *term, int redraw)
setcursor();
if (redraw)
{
aco_save_T aco;

if (term->tl_buffer == curbuf && term->tl_cursor_visible)
cursor_on();
out_flush();
Expand All @@ -1232,6 +1234,16 @@ update_cursor(term_T *term, int redraw)
gui_mch_flush();
}
#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;
}
}

Expand Down
49 changes: 49 additions & 0 deletions src/testdir/test_terminal.vim
Original file line number Diff line number Diff line change
Expand Up @@ -2321,5 +2321,54 @@ func Test_term_wait_in_close_cb()
bwipe!
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
2 changes: 2 additions & 0 deletions src/version.c
Original file line number Diff line number Diff line change
Expand Up @@ -695,6 +695,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
756,
/**/
755,
/**/
Expand Down
1 change: 1 addition & 0 deletions src/vim.h
Original file line number Diff line number Diff line change
Expand Up @@ -1394,6 +1394,7 @@ enum auto_event
EVENT_TEXTCHANGED, // text was modified not in Insert mode
EVENT_TEXTCHANGEDI, // text was modified in Insert mode
EVENT_TEXTCHANGEDP, // TextChangedI with popup menu visible
EVENT_TEXTCHANGEDT, // text was modified in Terminal mode
EVENT_TEXTYANKPOST, // after some text was yanked
EVENT_USER, // user defined autocommand
EVENT_VIMENTER, // after starting Vim
Expand Down

0 comments on commit 4ccaedf

Please sign in to comment.