]> granicus.if.org Git - vim/commitdiff
patch 8.1.0495: :filter only supports some commands v8.1.0495
authorBram Moolenaar <Bram@vim.org>
Thu, 25 Oct 2018 11:31:37 +0000 (13:31 +0200)
committerBram Moolenaar <Bram@vim.org>
Thu, 25 Oct 2018 11:31:37 +0000 (13:31 +0200)
Problem:    :filter only supports some commands.
Solution:   Add :filter support for more commands. (Marcin Szamotulski,
            closes #2856)

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

index fce8ba1ecee9a786b9d49afbc752570c0ba094de..af49c3e8664c6d5de03327023595d923b38a0e68 100644 (file)
@@ -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.
index e70bfd8ab31511321cf34bbeafc8e70dccb63507..4a3cf9912423bed8f3c4bd4e81e38cfde42105bb 100644 (file)
@@ -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);
index c7395f3a0e4137ad8e982e15e925342640c81330..f9e3ce3cf4606dc0de963b8bf327b4e747a25d7e 100644 (file)
@@ -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');
index d1f1d1382e1f01135570f23bc3ad6907c12189b9..f238abe84fcfe7e3aaf762414759a9759b19e04d 100644 (file)
@@ -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)
index e00746ec0427c9e7412000d0708ae12dc1b82776..5b9aec446ea320ed23956dd9f00c4284de6a4437 100644 (file)
@@ -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");
index 86347ab77f0753be2a043227868c4ffb36514622..3d802f95300b1be4c073e7cb54aa99c03dd21d27 100644 (file)
@@ -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
index ec239c7710d756b79b75587952ab8f65845da8cc..7c3b7f673ac5de6614e2ab43c04b42721889ca92 100644 (file)
@@ -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);
                }
index 7297ad59a9aea8f9147466302ad7a4f8567ae190..30c50ab55b2b0361543abd90d95a468257d6c687 100644 (file)
@@ -792,6 +792,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    495,
 /**/
     494,
 /**/