Skip to content
Permalink
Browse files

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)
  • Loading branch information...
brammool committed Oct 25, 2018
1 parent babfcf5 commit f86db78fed78541cefdb706e4779ce5ae9ca7820
Showing with 76 additions and 4 deletions.
  1. +12 −1 runtime/doc/various.txt
  2. +8 −0 src/eval.c
  3. +3 −1 src/mark.c
  4. +4 −0 src/option.c
  5. +5 −2 src/syntax.c
  6. +40 −0 src/testdir/test_filter_cmd.vim
  7. +2 −0 src/userfunc.c
  8. +2 −0 src/version.c
@@ -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,
/**/

0 comments on commit f86db78

Please sign in to comment.
You can’t perform that action at this time.