]> granicus.if.org Git - vim/commitdiff
patch 8.1.0165: :clist output can be very long v8.1.0165
authorBram Moolenaar <Bram@vim.org>
Sun, 8 Jul 2018 14:01:08 +0000 (16:01 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 8 Jul 2018 14:01:08 +0000 (16:01 +0200)
Problem:    :clist output can be very long.
Solution:   Support filtering :clist entries. (Yegappan Lakshmanan)

src/quickfix.c
src/testdir/test_quickfix.vim
src/version.c

index ad2529780456cef80e5fff52105d8710b31da834..ddb9230a6db198e5232c22dc883042d092e7746a 100644 (file)
@@ -3051,6 +3051,7 @@ qf_list(exarg_T *eap)
     int                qfFileAttr;
     int                qfSepAttr;
     int                qfLineAttr;
+    int                filter_entry;
     int                all = eap->forceit;     /* if not :cl!, only show
                                                   recognised errors */
     qf_info_T  *qi = &ql_info;
@@ -3120,7 +3121,6 @@ qf_list(exarg_T *eap)
     {
        if ((qfp->qf_valid || all) && idx1 <= i && i <= idx2)
        {
-           msg_putchar('\n');
            if (got_int)
                break;
 
@@ -3141,6 +3141,20 @@ qf_list(exarg_T *eap)
                    vim_snprintf((char *)IObuff, IOSIZE, "%2d %s",
                                                                i, (char *)fname);
            }
+
+           // Support for filtering entries using :filter /pat/ clist
+           filter_entry = 1;
+           if (qfp->qf_module != NULL && *qfp->qf_module != NUL)
+               filter_entry &= message_filtered(qfp->qf_module);
+           if (fname != NULL)
+               filter_entry &= message_filtered(fname);
+           if (qfp->qf_pattern != NULL)
+               filter_entry &= message_filtered(qfp->qf_pattern);
+           filter_entry &= message_filtered(qfp->qf_text);
+           if (filter_entry)
+               goto next_entry;
+
+           msg_putchar('\n');
            msg_outtrans_attr(IObuff, i == qi->qf_lists[qi->qf_curlist].qf_index
                                           ? HL_ATTR(HLF_QFL) : qfFileAttr);
 
@@ -3175,6 +3189,7 @@ qf_list(exarg_T *eap)
            out_flush();                /* show one line at a time */
        }
 
+next_entry:
        qfp = qfp->qf_next;
        if (qfp == NULL)
            break;
@@ -4186,6 +4201,7 @@ ex_make(exarg_T *eap)
     }
     if (res >= 0)
        qf_list_changed(qi, qi->qf_curlist);
+
     // Remember the current quickfix list identifier, so that we can
     // check for autocommands changing the current quickfix list.
     save_qfid = qi->qf_lists[qi->qf_curlist].qf_id;
index a4006b07d1cab61001b755abfabf22a9bb30897c..c8f0984b0a10ff8ff0c778fbd6a6ed7b94c64583 100644 (file)
@@ -3487,3 +3487,20 @@ func Test_autocmd_changelist()
   call Xautocmd_changelist('c')
   call Xautocmd_changelist('l')
 endfunc
+
+" Tests for the ':filter /pat/ clist' command
+func Test_filter_clist()
+  cexpr ['Xfile1:10:10:Line 10', 'Xfile2:15:15:Line 15']
+  call assert_equal([' 2 Xfile2:15 col 15: Line 15'],
+                       \ split(execute('filter /Line 15/ clist'), "\n"))
+  call assert_equal([' 1 Xfile1:10 col 10: Line 10'],
+                       \ split(execute('filter /Xfile1/ clist'), "\n"))
+  call assert_equal([], split(execute('filter /abc/ clist'), "\n"))
+
+  call setqflist([{'module' : 'abc', 'pattern' : 'pat1'},
+                       \ {'module' : 'pqr', 'pattern' : 'pat2'}], ' ')
+  call assert_equal([' 2 pqr:pat2:  '],
+                       \ split(execute('filter /pqr/ clist'), "\n"))
+  call assert_equal([' 1 abc:pat1:  '],
+                       \ split(execute('filter /pat1/ clist'), "\n"))
+endfunc
index 4338a64d6d452d078ccd363da9cd6046d995ac56..24de53fdc1c15a4c4ffed30dd2056d8571e1eda6 100644 (file)
@@ -789,6 +789,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    165,
 /**/
     164,
 /**/