Mercurial > vim
changeset 14968:c5ec5ddbe814 v8.1.0495
patch 8.1.0495: :filter only supports some commands
commit https://github.com/vim/vim/commit/f86db78fed78541cefdb706e4779ce5ae9ca7820
Author: Bram Moolenaar <Bram@vim.org>
Date: Thu Oct 25 13:31:37 2018 +0200
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)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Thu, 25 Oct 2018 13:45:05 +0200 |
parents | 5acaac1226fd |
children | 26730430401e |
files | runtime/doc/various.txt src/eval.c src/mark.c src/option.c src/syntax.c src/testdir/test_filter_cmd.vim src/userfunc.c src/version.c |
diffstat | 8 files changed, 76 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/runtime/doc/various.txt +++ b/runtime/doc/various.txt @@ -565,7 +565,18 @@ N *+X11* Unix only: can restore window 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.
--- a/src/eval.c +++ b/src/eval.c @@ -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);
--- a/src/mark.c +++ b/src/mark.c @@ -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');
--- a/src/option.c +++ b/src/option.c @@ -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)
--- a/src/syntax.c +++ b/src/syntax.c @@ -352,7 +352,7 @@ static reg_extmatch_T *next_match_extmat /* * 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");
--- a/src/testdir/test_filter_cmd.vim +++ b/src/testdir/test_filter_cmd.vim @@ -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