To: vim_dev@googlegroups.com Subject: Patch 8.0.1651 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.0.1651 Problem: Cannot filter :ls output for terminal buffers. Solution: Add flags for terminal buffers. (Marcin Szamotulski, closes #2751) Files: runtime/doc/windows.txt, src/buffer.c, src/testdir/test_terminal.vim *** ../vim-8.0.1650/runtime/doc/windows.txt 2018-02-12 22:07:45.593058158 +0100 --- runtime/doc/windows.txt 2018-03-29 16:21:35.150306274 +0200 *************** *** 1025,1030 **** --- 1029,1037 ---- displayed in a window |hidden-buffer| - a buffer with 'modifiable' off = a readonly buffer + R a terminal buffer with a running job + F a terminal buffer with a finished job + ? a terminal buffer without a job: `:terminal NONE` + a modified buffer x a buffer with read errors *************** *** 1039,1044 **** --- 1046,1054 ---- x buffers with a read error % current buffer # alternate buffer + R terminal buffers with a running job + F terminal buffers with a finished job + ? terminal buffers without a job: `:terminal NONE` Combining flags means they are "and"ed together, e.g.: h+ hidden buffers which are modified a+ active buffers which are modified *************** *** 1271,1276 **** --- 1281,1289 ---- and can't be changed. The 'buflisted' option will be reset for a help buffer. + terminal A terminal window buffer, see |terminal|. The contents cannot + be read or changed until the job ends. + directory Displays directory contents. Can be used by a file explorer plugin. The buffer is created with these settings: > :setlocal buftype=nowrite *** ../vim-8.0.1650/src/buffer.c 2018-03-29 16:03:46.616035925 +0200 --- src/buffer.c 2018-03-29 16:25:43.281022534 +0200 *************** *** 2930,2947 **** int i; int ro_char; int changed_char; for (buf = firstbuf; buf != NULL && !got_int; buf = buf->b_next) { /* skip unlisted buffers, unless ! was used */ if ((!buf->b_p_bl && !eap->forceit && !vim_strchr(eap->arg, 'u')) || (vim_strchr(eap->arg, 'u') && buf->b_p_bl) || (vim_strchr(eap->arg, '+') && ((buf->b_flags & BF_READERR) || !bufIsChanged(buf))) || (vim_strchr(eap->arg, 'a') ! && (buf->b_ml.ml_mfp == NULL || buf->b_nwindows == 0)) || (vim_strchr(eap->arg, 'h') ! && (buf->b_ml.ml_mfp == NULL || buf->b_nwindows != 0)) || (vim_strchr(eap->arg, '-') && buf->b_p_ma) || (vim_strchr(eap->arg, '=') && !buf->b_p_ro) || (vim_strchr(eap->arg, 'x') && !(buf->b_flags & BF_READERR)) --- 2930,2963 ---- int i; int ro_char; int changed_char; + #ifdef FEAT_TERMINAL + int job_running; + int job_none_open; + #endif for (buf = firstbuf; buf != NULL && !got_int; buf = buf->b_next) { + #ifdef FEAT_TERMINAL + job_running = term_job_running(buf->b_term); + job_none_open = job_running && term_none_open(buf->b_term); + #endif /* skip unlisted buffers, unless ! was used */ if ((!buf->b_p_bl && !eap->forceit && !vim_strchr(eap->arg, 'u')) || (vim_strchr(eap->arg, 'u') && buf->b_p_bl) || (vim_strchr(eap->arg, '+') && ((buf->b_flags & BF_READERR) || !bufIsChanged(buf))) || (vim_strchr(eap->arg, 'a') ! && (buf->b_ml.ml_mfp == NULL || buf->b_nwindows == 0)) || (vim_strchr(eap->arg, 'h') ! && (buf->b_ml.ml_mfp == NULL || buf->b_nwindows != 0)) ! #ifdef FEAT_TERMINAL ! || (vim_strchr(eap->arg, 'R') ! && (!job_running || (job_running && job_none_open))) ! || (vim_strchr(eap->arg, '?') ! && (!job_running || (job_running && !job_none_open))) ! || (vim_strchr(eap->arg, 'F') ! && (job_running || buf->b_term == NULL)) ! #endif || (vim_strchr(eap->arg, '-') && buf->b_p_ma) || (vim_strchr(eap->arg, '=') && !buf->b_p_ro) || (vim_strchr(eap->arg, 'x') && !(buf->b_flags & BF_READERR)) *** ../vim-8.0.1650/src/testdir/test_terminal.vim 2018-03-26 21:38:45.196332620 +0200 --- src/testdir/test_terminal.vim 2018-03-29 16:29:51.447744297 +0200 *************** *** 45,55 **** --- 45,61 ---- call assert_equal('t', mode()) call assert_equal('yes', b:done) call assert_match('%aR[^\n]*running]', execute('ls')) + call assert_match('%aR[^\n]*running]', execute('ls R')) + call assert_notmatch('%[^\n]*running]', execute('ls F')) + call assert_notmatch('%[^\n]*running]', execute('ls ?')) call Stop_shell_in_terminal(buf) call term_wait(buf) call assert_equal('n', mode()) call assert_match('%aF[^\n]*finished]', execute('ls')) + call assert_match('%aF[^\n]*finished]', execute('ls F')) + call assert_notmatch('%[^\n]*finished]', execute('ls R')) + call assert_notmatch('%[^\n]*finished]', execute('ls ?')) " closing window wipes out the terminal buffer a with finished job close *** ../vim-8.0.1650/src/version.c 2018-03-29 16:03:46.620035905 +0200 --- src/version.c 2018-03-29 16:22:54.369895621 +0200 *************** *** 764,765 **** --- 764,767 ---- { /* Add new patch number below this line */ + /**/ + 1651, /**/ -- From "know your smileys": ¯\_(ツ)_/¯ Shrug /// 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 ///