Merge remote-tracking branch 'vim/master'

This commit is contained in:
Kazuki Sakamoto
2018-05-11 20:48:49 -07:00
6 changed files with 121 additions and 48 deletions
+1
View File
@@ -9,6 +9,7 @@ void redraw_buf_and_status_later(buf_T *buf, int type);
int redraw_asap(int type);
void redraw_after_callback(int call_update_screen);
void redrawWinline(linenr_T lnum, int invalid);
void reset_updating_screen(int may_resize_shell);
void update_curbuf(int type);
int update_screen(int type_arg);
int conceal_cursor_line(win_T *wp);
+1
View File
@@ -20,6 +20,7 @@ void term_win_entered(void);
int terminal_loop(int blocking);
void term_job_ended(job_T *job);
void term_channel_closed(channel_T *ch);
void term_check_channel_closed_recently(void);
int term_do_update_window(win_T *wp);
void term_update_window(win_T *wp);
int term_is_finished(buf_T *buf);
+15 -7
View File
@@ -512,6 +512,19 @@ redrawWinline(
curwin->w_lines[i].wl_valid = FALSE;
}
#endif
}
void
reset_updating_screen(int may_resize_shell UNUSED)
{
updating_screen = FALSE;
#ifdef FEAT_GUI
if (may_resize_shell)
gui_may_resize_shell();
#endif
#ifdef FEAT_TERMINAL
term_check_channel_closed_recently();
#endif
}
/*
@@ -778,10 +791,7 @@ update_screen(int type_arg)
FOR_ALL_WINDOWS(wp)
wp->w_buffer->b_mod_set = FALSE;
updating_screen = FALSE;
#ifdef FEAT_GUI
gui_may_resize_shell();
#endif
reset_updating_screen(TRUE);
/* Clear or redraw the command line. Done last, because scrolling may
* mess up the command line. */
@@ -861,11 +871,9 @@ update_finish(void)
end_search_hl();
# endif
updating_screen = FALSE;
reset_updating_screen(TRUE);
# ifdef FEAT_GUI
gui_may_resize_shell();
/* Redraw the cursor and update the scrollbars when all screen updating is
* done. */
if (gui.in_use)
+96 -40
View File
@@ -38,6 +38,9 @@
* in tl_scrollback are no longer used.
*
* TODO:
* - Win32: Termdebug doesn't work, because gdb does not support mi2. This
* plugin: https://github.com/cpiger/NeoDebug runs gdb as a job, redirecting
* input and output. Command I/O is in gdb window.
* - Win32: Redirecting input does not work, half of Test_terminal_redir_file()
* is disabled.
* - Win32: Redirecting output works but includes escape sequences.
@@ -100,6 +103,8 @@ struct terminal_S {
int tl_normal_mode; /* TRUE: Terminal-Normal mode */
int tl_channel_closed;
int tl_channel_recently_closed; // still need to handle tl_finish
int tl_finish;
#define TL_FINISH_UNSET NUL
#define TL_FINISH_CLOSE 'c' /* ++close or :terminal without argument */
@@ -971,12 +976,10 @@ write_to_term(buf_T *buffer, char_u *msg, channel_T *channel)
if (buffer == curbuf)
{
update_screen(0);
update_cursor(term, TRUE);
#ifdef FEAT_GUI_MACVIM
/* Force a flush now for better experience of interactive shell. */
if (gui.in_use)
gui_macvim_force_flush();
#endif
/* update_screen() can be slow, check the terminal wasn't closed
* already */
if (buffer == curbuf && curbuf->b_term != NULL)
update_cursor(curbuf->b_term, TRUE);
}
else
redraw_after_callback(TRUE);
@@ -2105,6 +2108,10 @@ terminal_loop(int blocking)
while (must_redraw != 0)
if (update_screen(0) == FAIL)
break;
if (!term_use_loop_check(TRUE))
/* job finished while redrawing */
break;
update_cursor(curbuf->b_term, FALSE);
restore_cursor = TRUE;
@@ -2774,6 +2781,53 @@ static VTermScreenCallbacks screen_callbacks = {
NULL /* sb_popline */
};
/*
* Do the work after the channel of a terminal was closed.
* Must be called only when updating_screen is FALSE.
* Returns TRUE when a buffer was closed (list of terminals may have changed).
*/
static int
term_after_channel_closed(term_T *term)
{
/* Unless in Terminal-Normal mode: clear the vterm. */
if (!term->tl_normal_mode)
{
int fnum = term->tl_buffer->b_fnum;
cleanup_vterm(term);
if (term->tl_finish == TL_FINISH_CLOSE)
{
aco_save_T aco;
/* ++close or term_finish == "close" */
ch_log(NULL, "terminal job finished, closing window");
aucmd_prepbuf(&aco, term->tl_buffer);
do_bufdel(DOBUF_WIPE, (char_u *)"", 1, fnum, fnum, FALSE);
aucmd_restbuf(&aco);
return TRUE;
}
if (term->tl_finish == TL_FINISH_OPEN
&& term->tl_buffer->b_nwindows == 0)
{
char buf[50];
/* TODO: use term_opencmd */
ch_log(NULL, "terminal job finished, opening window");
vim_snprintf(buf, sizeof(buf),
term->tl_opencmd == NULL
? "botright sbuf %d"
: (char *)term->tl_opencmd, fnum);
do_cmdline_cmd((char_u *)buf);
}
else
ch_log(NULL, "terminal job finished");
}
redraw_buf_and_status_later(term->tl_buffer, NOT_VALID);
return FALSE;
}
/*
* Called when a channel has been closed.
* If this was a channel for a terminal window then finish it up.
@@ -2782,9 +2836,12 @@ static VTermScreenCallbacks screen_callbacks = {
term_channel_closed(channel_T *ch)
{
term_T *term;
term_T *next_term;
int did_one = FALSE;
for (term = first_term; term != NULL; term = term->tl_next)
for (term = first_term; term != NULL; term = next_term)
{
next_term = term->tl_next;
if (term->tl_job == ch->ch_job)
{
term->tl_channel_closed = TRUE;
@@ -2800,43 +2857,19 @@ term_channel_closed(channel_T *ch)
}
#endif
/* Unless in Terminal-Normal mode: clear the vterm. */
if (!term->tl_normal_mode)
if (updating_screen)
{
int fnum = term->tl_buffer->b_fnum;
cleanup_vterm(term);
if (term->tl_finish == TL_FINISH_CLOSE)
{
aco_save_T aco;
/* ++close or term_finish == "close" */
ch_log(NULL, "terminal job finished, closing window");
aucmd_prepbuf(&aco, term->tl_buffer);
do_bufdel(DOBUF_WIPE, (char_u *)"", 1, fnum, fnum, FALSE);
aucmd_restbuf(&aco);
break;
}
if (term->tl_finish == TL_FINISH_OPEN
&& term->tl_buffer->b_nwindows == 0)
{
char buf[50];
/* TODO: use term_opencmd */
ch_log(NULL, "terminal job finished, opening window");
vim_snprintf(buf, sizeof(buf),
term->tl_opencmd == NULL
? "botright sbuf %d"
: (char *)term->tl_opencmd, fnum);
do_cmdline_cmd((char_u *)buf);
}
else
ch_log(NULL, "terminal job finished");
/* Cannot open or close windows now. Can happen when
* 'lazyredraw' is set. */
term->tl_channel_recently_closed = TRUE;
continue;
}
redraw_buf_and_status_later(term->tl_buffer, NOT_VALID);
if (term_after_channel_closed(term))
next_term = first_term;
}
}
if (did_one)
{
redraw_statuslines();
@@ -2855,6 +2888,29 @@ term_channel_closed(channel_T *ch)
}
}
/*
* To be called after resetting updating_screen: handle any terminal where the
* channel was closed.
*/
void
term_check_channel_closed_recently()
{
term_T *term;
term_T *next_term;
for (term = first_term; term != NULL; term = next_term)
{
next_term = term->tl_next;
if (term->tl_channel_recently_closed)
{
term->tl_channel_recently_closed = FALSE;
if (term_after_channel_closed(term))
// start over, the list may have changed
next_term = first_term;
}
}
}
/*
* Fill one screen line from a line of the terminal.
* Advances "pos" to past the last column.
+4 -1
View File
@@ -431,7 +431,10 @@ ui_breakcheck_force(int force)
#endif
mch_breakcheck(force);
updating_screen = save_us;
if (save_us)
updating_screen = save_us;
else
reset_updating_screen(FALSE);
}
/*****************************************************************************
+4
View File
@@ -776,6 +776,10 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1815,
/**/
1814,
/**/
1813,
/**/