0
0
mirror of https://github.com/vim/vim.git synced 2025-09-29 04:34:16 -04:00

patch 8.0.0761: options not set properly for a terminal buffer

Problem:    Options of a buffer for a terminal window are not set properly.
Solution:   Add "terminal" value for 'buftype'.  Make 'buftype' and
            'bufhidden' not depend on the quickfix feature.
            Also set the buffer name and show "running" or "finished" in the
            window title.
This commit is contained in:
Bram Moolenaar
2017-07-23 19:51:01 +02:00
parent 065f41c814
commit 1f2903c431
12 changed files with 184 additions and 133 deletions

View File

@@ -33,9 +33,8 @@
* while, if the terminal window is visible, the screen contents is drawn.
*
* TODO:
* - cursor flickers when moving the cursor
* - set buffer options to be scratch, hidden, nomodifiable, etc.
* - set buffer name to command, add (1) to avoid duplicates.
* - do not store terminal buffer in viminfo
* - put terminal title in the statusline
* - Add a scrollback buffer (contains lines to scroll off the top).
* Can use the buf_T lines, store attributes somewhere else?
* - When the job ends:
@@ -53,7 +52,6 @@
* - support minimal size when 'termsize' is empty?
* - implement "term" for job_start(): more job options when starting a
* terminal.
* - implement ":buf {term-buf-name}"
* - implement term_list() list of buffers with a terminal
* - implement term_getsize(buf)
* - implement term_setsize(buf)
@@ -192,7 +190,31 @@ ex_terminal(exarg_T *eap)
term->tl_next = first_term;
first_term = term;
/* TODO: set buffer type, hidden, etc. */
if (buflist_findname(cmd) == NULL)
curbuf->b_ffname = vim_strsave(cmd);
else
{
int i;
size_t len = STRLEN(cmd) + 10;
char_u *p = alloc(len);
for (i = 1; p != NULL; ++i)
{
vim_snprintf((char *)p, len, "%s (%d)", cmd, i);
if (buflist_findname(p) == NULL)
{
curbuf->b_ffname = p;
break;
}
}
}
curbuf->b_fname = curbuf->b_ffname;
/* Mark the buffer as changed, so that it's not easy to abandon the job. */
curbuf->b_changed = TRUE;
curbuf->b_p_ma = FALSE;
set_string_option_direct((char_u *)"buftype", -1,
(char_u *)"terminal", OPT_FREE|OPT_LOCAL, 0);
set_term_and_win_size(term);
@@ -490,6 +512,26 @@ terminal_loop(void)
}
}
/*
* Called when a job has finished.
*/
void
term_job_ended(job_T *job)
{
if (curbuf->b_term != NULL && curbuf->b_term->tl_job == job)
maketitle();
}
/*
* Return TRUE if the job for "buf" is still running.
*/
int
term_job_running(buf_T *buf)
{
return buf->b_term != NULL && buf->b_term->tl_job != NULL
&& buf->b_term->tl_job->jv_status == JOB_STARTED;
}
static void
position_cursor(win_T *wp, VTermPos *pos)
{
@@ -850,13 +892,20 @@ setup_job_options(jobopt_T *opt, int rows, int cols)
opt->jo_out_mode = MODE_RAW;
opt->jo_err_mode = MODE_RAW;
opt->jo_set = JO_MODE | JO_OUT_MODE | JO_ERR_MODE;
opt->jo_io[PART_OUT] = JIO_BUFFER;
opt->jo_io[PART_ERR] = JIO_BUFFER;
opt->jo_set |= JO_OUT_IO + (JO_OUT_IO << (PART_ERR - PART_OUT));
opt->jo_set |= JO_OUT_IO + JO_ERR_IO;
opt->jo_modifiable[PART_OUT] = 0;
opt->jo_modifiable[PART_ERR] = 0;
opt->jo_set |= JO_OUT_MODIFIABLE + JO_ERR_MODIFIABLE;
opt->jo_io_buf[PART_OUT] = curbuf->b_fnum;
opt->jo_io_buf[PART_ERR] = curbuf->b_fnum;
opt->jo_pty = TRUE;
opt->jo_set |= JO_OUT_BUF + (JO_OUT_BUF << (PART_ERR - PART_OUT));
opt->jo_set |= JO_OUT_BUF + JO_ERR_BUF;
opt->jo_term_rows = rows;
opt->jo_term_cols = cols;
}