forked from aniani/vim
patch 8.1.0495: :filter only supports some commands
Problem: :filter only supports some commands. Solution: Add :filter support for more commands. (Marcin Szamotulski, closes #2856)
This commit is contained in:
parent
babfcf54ae
commit
f86db78fed
@ -565,7 +565,18 @@ N *+X11* Unix only: can restore window title |X11|
|
||||
The pattern is matched against the relevant part of
|
||||
the output, not necessarily the whole line. Only some
|
||||
commands support filtering, try it out to check if it
|
||||
works.
|
||||
works. Some of the commands that support filtering:
|
||||
|:#| - filter whole line
|
||||
|:command| - filter by command name
|
||||
|:files| - filter by file name
|
||||
|:highlight| - filter by highlight group
|
||||
|:jumps| - filter by file name
|
||||
|:let| - filter by variable name
|
||||
|:list| - filter whole line
|
||||
|:llist| - filter by file name or module name
|
||||
|:oldfiles| - filter by file name
|
||||
|:clist| - filter by file name or module name
|
||||
|:set| - filter by variable name
|
||||
|
||||
Only normal messages are filtered, error messages are
|
||||
not.
|
||||
|
@ -1425,6 +1425,7 @@ list_hashtable_vars(
|
||||
hashitem_T *hi;
|
||||
dictitem_T *di;
|
||||
int todo;
|
||||
char_u buf[IOSIZE];
|
||||
|
||||
todo = (int)ht->ht_used;
|
||||
for (hi = ht->ht_array; todo > 0 && !got_int; ++hi)
|
||||
@ -1433,6 +1434,13 @@ list_hashtable_vars(
|
||||
{
|
||||
--todo;
|
||||
di = HI2DI(hi);
|
||||
|
||||
// apply :filter /pat/ to variable name
|
||||
vim_strncpy((char_u *) buf, prefix, IOSIZE - 1);
|
||||
vim_strcat((char_u *) buf, di->di_key, IOSIZE);
|
||||
if (message_filtered(buf))
|
||||
continue;
|
||||
|
||||
if (empty || di->di_tv.v_type != VAR_STRING
|
||||
|| di->di_tv.vval.v_string != NULL)
|
||||
list_one_var(di, prefix, first);
|
||||
|
@ -901,7 +901,9 @@ ex_jumps(exarg_T *eap UNUSED)
|
||||
if (curwin->w_jumplist[i].fmark.mark.lnum != 0)
|
||||
{
|
||||
name = fm_getname(&curwin->w_jumplist[i].fmark, 16);
|
||||
if (name == NULL) /* file name not available */
|
||||
|
||||
// apply :filter /pat/ or file name not available
|
||||
if (name == NULL || message_filtered(name))
|
||||
continue;
|
||||
|
||||
msg_putchar('\n');
|
||||
|
@ -10083,6 +10083,10 @@ showoptions(
|
||||
item_count = 0;
|
||||
for (p = &options[0]; p->fullname != NULL; p++)
|
||||
{
|
||||
// apply :filter /pat/
|
||||
if (message_filtered((char_u *) p->fullname))
|
||||
continue;
|
||||
|
||||
varp = NULL;
|
||||
isterm = istermoption(p);
|
||||
if (opt_flags != 0)
|
||||
|
@ -352,7 +352,7 @@ static reg_extmatch_T *next_match_extmatch = NULL;
|
||||
|
||||
/*
|
||||
* A state stack is an array of integers or stateitem_T, stored in a
|
||||
* garray_T. A state stack is invalid if it's itemsize entry is zero.
|
||||
* garray_T. A state stack is invalid if its itemsize entry is zero.
|
||||
*/
|
||||
#define INVALID_STATE(ssp) ((ssp)->ga_itemsize == 0)
|
||||
#define VALID_STATE(ssp) ((ssp)->ga_itemsize != 0)
|
||||
@ -9189,7 +9189,10 @@ highlight_list_one(int id)
|
||||
struct hl_group *sgp;
|
||||
int didh = FALSE;
|
||||
|
||||
sgp = &HL_TABLE()[id - 1]; /* index is ID minus one */
|
||||
sgp = &HL_TABLE()[id - 1]; // index is ID minus one
|
||||
|
||||
if (message_filtered(sgp->sg_name))
|
||||
return;
|
||||
|
||||
didh = highlight_list_arg(id, didh, LIST_ATTR,
|
||||
sgp->sg_term, NULL, "term");
|
||||
|
@ -87,3 +87,43 @@ func Test_filter_cmd_with_filter()
|
||||
call assert_equal('a|b', out)
|
||||
set shelltemp&
|
||||
endfunction
|
||||
|
||||
func Test_filter_commands()
|
||||
let g:test_filter_a = 1
|
||||
let b:test_filter_b = 2
|
||||
let test_filter_c = 3
|
||||
|
||||
" Test filtering :let command
|
||||
let res = split(execute("filter /^test_filter/ let"), "\n")
|
||||
call assert_equal(["test_filter_a #1"], res)
|
||||
|
||||
let res = split(execute("filter /\\v^(b:)?test_filter/ let"), "\n")
|
||||
call assert_equal(["test_filter_a #1", "b:test_filter_b #2"], res)
|
||||
|
||||
unlet g:test_filter_a
|
||||
unlet b:test_filter_b
|
||||
unlet test_filter_c
|
||||
|
||||
" Test filtering :set command
|
||||
let res = join(split(execute("filter /^help/ set"), "\n")[1:], " ")
|
||||
call assert_match('^\s*helplang=\w*$', res)
|
||||
|
||||
" Test filtering :llist command
|
||||
call setloclist(0, [{"filename": "/path/vim.c"}, {"filename": "/path/vim.h"}, {"module": "Main.Test"}])
|
||||
let res = split(execute("filter /\\.c$/ llist"), "\n")
|
||||
call assert_equal([" 1 /path/vim.c: "], res)
|
||||
|
||||
let res = split(execute("filter /\\.Test$/ llist"), "\n")
|
||||
call assert_equal([" 3 Main.Test: "], res)
|
||||
|
||||
" Test filtering :jump command
|
||||
e file.c
|
||||
e file.h
|
||||
e file.hs
|
||||
let res = split(execute("filter /\.c$/ jumps"), "\n")[1:]
|
||||
call assert_equal([" 2 1 0 file.c", ">"], res)
|
||||
|
||||
bwipe file.c
|
||||
bwipe file.h
|
||||
bwipe file.hs
|
||||
endfunc
|
||||
|
@ -1882,6 +1882,8 @@ ex_function(exarg_T *eap)
|
||||
{
|
||||
--todo;
|
||||
fp = HI2UF(hi);
|
||||
if (message_filtered(fp->uf_name))
|
||||
continue;
|
||||
if (!func_name_refcount(fp->uf_name))
|
||||
list_func_head(fp, FALSE);
|
||||
}
|
||||
|
@ -792,6 +792,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
495,
|
||||
/**/
|
||||
494,
|
||||
/**/
|
||||
|
Loading…
x
Reference in New Issue
Block a user