mirror of
https://github.com/neovim/neovim.git
synced 2025-09-13 14:58:18 +00:00
vim-patch:8.0.1651: cannot filter :ls output for terminal buffers
Problem: Cannot filter :ls output for terminal buffers.
Solution: Add flags for terminal buffers. (Marcin Szamotulski, closes vim/vim#2751)
0751f51a5b
This commit is contained in:
@@ -1021,6 +1021,8 @@ list of buffers. |unlisted-buffer|
|
|||||||
x buffers with a read error
|
x buffers with a read error
|
||||||
% current buffer
|
% current buffer
|
||||||
# alternate buffer
|
# alternate buffer
|
||||||
|
R terminal buffers with a running job
|
||||||
|
F terminal buffers with a finished job
|
||||||
Combining flags means they are "and"ed together, e.g.:
|
Combining flags means they are "and"ed together, e.g.:
|
||||||
h+ hidden buffers which are modified
|
h+ hidden buffers which are modified
|
||||||
a+ active buffers which are modified
|
a+ active buffers which are modified
|
||||||
|
@@ -2600,6 +2600,9 @@ void buflist_list(exarg_T *eap)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (buf = firstbuf; buf != NULL && !got_int; buf = buf->b_next) {
|
for (buf = firstbuf; buf != NULL && !got_int; buf = buf->b_next) {
|
||||||
|
const bool is_terminal = buf->terminal;
|
||||||
|
const bool job_running = buf->terminal && terminal_running(buf->terminal);
|
||||||
|
|
||||||
// skip unspecified buffers
|
// skip unspecified buffers
|
||||||
if ((!buf->b_p_bl && !eap->forceit && !strchr((char *)eap->arg, 'u'))
|
if ((!buf->b_p_bl && !eap->forceit && !strchr((char *)eap->arg, 'u'))
|
||||||
|| (strchr((char *)eap->arg, 'u') && buf->b_p_bl)
|
|| (strchr((char *)eap->arg, 'u') && buf->b_p_bl)
|
||||||
@@ -2609,6 +2612,8 @@ void buflist_list(exarg_T *eap)
|
|||||||
&& (buf->b_ml.ml_mfp == NULL || buf->b_nwindows == 0))
|
&& (buf->b_ml.ml_mfp == NULL || buf->b_nwindows == 0))
|
||||||
|| (strchr((char *)eap->arg, 'h')
|
|| (strchr((char *)eap->arg, 'h')
|
||||||
&& (buf->b_ml.ml_mfp == NULL || buf->b_nwindows != 0))
|
&& (buf->b_ml.ml_mfp == NULL || buf->b_nwindows != 0))
|
||||||
|
|| (strchr((char *)eap->arg, 'R') && (!is_terminal || !job_running))
|
||||||
|
|| (strchr((char *)eap->arg, 'F') && (!is_terminal || job_running))
|
||||||
|| (strchr((char *)eap->arg, '-') && buf->b_p_ma)
|
|| (strchr((char *)eap->arg, '-') && buf->b_p_ma)
|
||||||
|| (strchr((char *)eap->arg, '=') && !buf->b_p_ro)
|
|| (strchr((char *)eap->arg, '=') && !buf->b_p_ro)
|
||||||
|| (strchr((char *)eap->arg, 'x') && !(buf->b_flags & BF_READERR))
|
|| (strchr((char *)eap->arg, 'x') && !(buf->b_flags & BF_READERR))
|
||||||
|
@@ -650,6 +650,11 @@ Buffer terminal_buf(const Terminal *term)
|
|||||||
return term->buf_handle;
|
return term->buf_handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool terminal_running(const Terminal *term)
|
||||||
|
{
|
||||||
|
return !term->closed;
|
||||||
|
}
|
||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
// libvterm callbacks {{{
|
// libvterm callbacks {{{
|
||||||
|
|
||||||
|
@@ -31,6 +31,18 @@ describe(':ls', function()
|
|||||||
-- Terminal buffer [F]inished.
|
-- Terminal buffer [F]inished.
|
||||||
eq('\n 3 %aF', string.match(ls_output, '\n *3....'))
|
eq('\n 3 %aF', string.match(ls_output, '\n *3....'))
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
retry(nil, 5000, function()
|
||||||
|
local ls_output = eval('execute("ls R")')
|
||||||
|
-- Just the [R]unning terminal buffer.
|
||||||
|
eq('\n 2 #aR ', string.match(ls_output, '^\n *2 ... '))
|
||||||
|
end)
|
||||||
|
|
||||||
|
retry(nil, 5000, function()
|
||||||
|
local ls_output = eval('execute("ls F")')
|
||||||
|
-- Just the [F]inished terminal buffer.
|
||||||
|
eq('\n 3 %aF ', string.match(ls_output, '^\n *3 ... '))
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
end)
|
end)
|
||||||
|
Reference in New Issue
Block a user