To: vim_dev@googlegroups.com Subject: Patch 8.0.0836 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.0.0836 Problem: When a terminal buffer is changed it can still be accidentally abandoned. Solution: When making a change reset the 'buftype' option. Files: src/terminal.c, src/testdir/test_terminal.vim, src/option.c *** ../vim-8.0.0835/src/terminal.c 2017-08-01 18:34:54.901292108 +0200 --- src/terminal.c 2017-08-01 20:23:48.061935203 +0200 *************** *** 36,44 **** * that buffer, attributes come from the scrollback buffer tl_scrollback. * * TODO: ! * - Add StatusLineTerm highlighting * - in bash mouse clicks are inserting characters. * - mouse scroll: when over other window, scroll that window. * - For the scrollback buffer store lines in the buffer, only attributes in * tl_scrollback. * - When the job ends: --- 36,49 ---- * that buffer, attributes come from the scrollback buffer tl_scrollback. * * TODO: ! * - When closing a window with a terminal buffer where the job has ended, wipe ! * out the buffer. Like 'bufhidden' is "wipe". ! * - When a buffer with a terminal is wiped out, kill the job and close the ! * channel. * - in bash mouse clicks are inserting characters. * - mouse scroll: when over other window, scroll that window. + * - typing CTRL-C is not sent to the terminal. need to setup controlling tty? + * #1910 * - For the scrollback buffer store lines in the buffer, only attributes in * tl_scrollback. * - When the job ends: *************** *** 221,237 **** if (cmd == NULL || *cmd == NUL) cmd = p_sh; - if (buflist_findname(cmd) == NULL) - curbuf->b_ffname = vim_strsave(cmd); - else { int i; size_t len = STRLEN(cmd) + 10; char_u *p = alloc((int)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; --- 226,244 ---- if (cmd == NULL || *cmd == NUL) cmd = p_sh; { int i; size_t len = STRLEN(cmd) + 10; char_u *p = alloc((int)len); ! for (i = 0; p != NULL; ++i) { ! /* Prepend a ! to the command name to avoid the buffer name equals ! * the executable, otherwise ":w!" would overwrite it. */ ! if (i == 0) ! vim_snprintf((char *)p, len, "!%s", cmd); ! else ! vim_snprintf((char *)p, len, "!%s (%d)", cmd, i); if (buflist_findname(p) == NULL) { curbuf->b_ffname = p; *************** *** 241,248 **** } 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); --- 248,255 ---- } curbuf->b_fname = curbuf->b_ffname; ! /* Mark the buffer as not modifiable. It can only be made modifiable after ! * the job finished. */ curbuf->b_p_ma = FALSE; set_string_option_direct((char_u *)"buftype", -1, (char_u *)"terminal", OPT_FREE|OPT_LOCAL, 0); *************** *** 263,270 **** * free_terminal(). */ do_buffer(DOBUF_WIPE, DOBUF_CURRENT, FORWARD, 0, TRUE); } - - /* TODO: Setup pty, see mch_call_shell(). */ } /* --- 270,275 ---- *************** *** 1571,1576 **** --- 1576,1586 ---- { free_scrollback(term); redraw_buf_later(term->tl_buffer, NOT_VALID); + + /* The buffer is now like a normal buffer, it cannot be easily + * abandoned when changed. */ + set_string_option_direct((char_u *)"buftype", -1, + (char_u *)"", OPT_FREE|OPT_LOCAL, 0); } } *** ../vim-8.0.0835/src/testdir/test_terminal.vim 2017-08-01 18:41:16.490535281 +0200 --- src/testdir/test_terminal.vim 2017-08-01 20:02:49.559147053 +0200 *************** *** 6,12 **** source shared.vim ! func Test_terminal_basic() let buf = term_start(&shell) let termlist = term_list() --- 6,12 ---- source shared.vim ! func Run_shell_in_terminal() let buf = term_start(&shell) let termlist = term_list() *************** *** 20,25 **** --- 20,44 ---- call WaitFor('job_status(g:job) == "dead"') call assert_equal('dead', job_status(g:job)) + return buf + endfunc + + func Test_terminal_basic() + let buf = Run_shell_in_terminal() + + exe buf . 'bwipe' + unlet g:job + endfunc + + func Test_terminal_make_change() + let buf = Run_shell_in_terminal() + call term_wait(buf) + + setlocal modifiable + exe "normal Axxx\" + call assert_fails(buf . 'bwipe', 'E517') + undo + exe buf . 'bwipe' unlet g:job endfunc *** ../vim-8.0.0835/src/option.c 2017-07-31 22:29:29.792202736 +0200 --- src/option.c 2017-08-01 19:58:59.800816301 +0200 *************** *** 8228,8234 **** { # ifdef FEAT_TERMINAL /* Cannot set 'modifiable' when in Terminal mode. */ ! if (term_in_terminal_mode()) { curbuf->b_p_ma = FALSE; return (char_u *)N_("E946: Cannot make a terminal with running job modifiable"); --- 8228,8235 ---- { # ifdef FEAT_TERMINAL /* Cannot set 'modifiable' when in Terminal mode. */ ! if (term_in_terminal_mode() ! || (bt_terminal(curbuf) && !term_is_finished(curbuf))) { curbuf->b_p_ma = FALSE; return (char_u *)N_("E946: Cannot make a terminal with running job modifiable"); *** ../vim-8.0.0835/src/version.c 2017-08-01 18:52:50.729522700 +0200 --- src/version.c 2017-08-01 19:35:31.111048655 +0200 *************** *** 771,772 **** --- 771,774 ---- { /* Add new patch number below this line */ + /**/ + 836, /**/ -- ARTHUR: Will you ask your master if he wants to join my court at Camelot?! GUARD #1: But then of course African swallows are not migratory. GUARD #2: Oh, yeah... GUARD #1: So they couldn't bring a coconut back anyway... The Quest for the Holy Grail (Monty Python) /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///