# HG changeset patch # User Bram Moolenaar # Date 1556397905 -7200 # Node ID 9c206a78ec04e9e89a4edf56a32d01c32e0fef91 # Parent ea9308b99fef372037d22fc0515a8a394c7faeff patch 8.1.1221: filtering does not work when listing marks commit https://github.com/vim/vim/commit/ad6dc49a7564a99fca36c1928e3865787d3bd5b2 Author: Bram Moolenaar Date: Sat Apr 27 22:40:08 2019 +0200 patch 8.1.1221: filtering does not work when listing marks Problem: Filtering does not work when listing marks. Solution: Implement filtering marks. (Marcin Szamotulski, closes https://github.com/vim/vim/issues/3895) diff --git a/runtime/doc/various.txt b/runtime/doc/various.txt --- a/runtime/doc/various.txt +++ b/runtime/doc/various.txt @@ -571,17 +571,19 @@ N *+X11* Unix only: can restore window the output, not necessarily the whole line. Only some commands support filtering, try it out to check if it 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 + |:#| - filter whole line + |:clist| - filter by file name or module name + |: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 + |:marks| - filter by text in the current file, + or file name for other files + |:oldfiles| - filter by file name + |:set| - filter by variable name Only normal messages are filtered, error messages are not. diff --git a/src/mark.c b/src/mark.c --- a/src/mark.c +++ b/src/mark.c @@ -744,11 +744,12 @@ show_one_mark( int c, char_u *arg, pos_T *p, - char_u *name, + char_u *name_arg, int current) /* in current file */ { static int did_title = FALSE; int mustfree = FALSE; + char_u *name = name_arg; if (c == -1) /* finish up */ { @@ -762,35 +763,38 @@ show_one_mark( semsg(_("E283: No marks matching \"%s\""), arg); } } - /* don't output anything if 'q' typed at --more-- prompt */ + // don't output anything if 'q' typed at --more-- prompt else if (!got_int && (arg == NULL || vim_strchr(arg, c) != NULL) && p->lnum != 0) { - if (!did_title) + if (name == NULL && current) { - /* Highlight title */ - msg_puts_title(_("\nmark line col file/text")); - did_title = TRUE; + name = mark_line(p, 15); + mustfree = TRUE; } - msg_putchar('\n'); - if (!got_int) + if (!message_filtered(name)) { - sprintf((char *)IObuff, " %c %6ld %4d ", c, p->lnum, p->col); - msg_outtrans(IObuff); - if (name == NULL && current) + if (!did_title) { - name = mark_line(p, 15); - mustfree = TRUE; + // Highlight title + msg_puts_title(_("\nmark line col file/text")); + did_title = TRUE; } - if (name != NULL) + msg_putchar('\n'); + if (!got_int) { - msg_outtrans_attr(name, current ? HL_ATTR(HLF_D) : 0); - if (mustfree) - vim_free(name); + sprintf((char *)IObuff, " %c %6ld %4d ", c, p->lnum, p->col); + msg_outtrans(IObuff); + if (name != NULL) + { + msg_outtrans_attr(name, current ? HL_ATTR(HLF_D) : 0); + } } + out_flush(); // show one line at a time } - out_flush(); /* show one line at a time */ + if (mustfree) + vim_free(name); } } diff --git a/src/testdir/test_filter_cmd.vim b/src/testdir/test_filter_cmd.vim --- a/src/testdir/test_filter_cmd.vim +++ b/src/testdir/test_filter_cmd.vim @@ -126,7 +126,22 @@ func Test_filter_commands() 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 + " Test filtering :marks command + b file.c + mark A + b file.h + mark B + let res = split(execute("filter /\.c$/ marks"), "\n")[1:] + call assert_equal([" A 1 0 file.c"], res) + + call setline(1, ['one', 'two', 'three']) + 1mark a + 2mark b + 3mark c + let res = split(execute("filter /two/ marks abc"), "\n")[1:] + call assert_equal([" b 2 0 two"], res) + + bwipe! file.c + bwipe! file.h + bwipe! file.hs endfunc diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -768,6 +768,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1221, +/**/ 1220, /**/ 1219,