# HG changeset patch # User Bram Moolenaar # Date 1572104703 -7200 # Node ID b912277e3877f68720509c69e30e7b271b5f6976 # Parent 043c07d16d6064857b2c9da864198121fde8bc88 patch 8.1.2221: cannot filter :disp output Commit: https://github.com/vim/vim/commit/8fc42964363087025a27e8c80276c706536fc4e3 Author: Bram Moolenaar Date: Sat Oct 26 17:33:13 2019 +0200 patch 8.1.2221: cannot filter :disp output Problem: Cannot filter :disp output. Solution: Support filtereing :disp output. (Andi Massimino, closes https://github.com/vim/vim/issues/5117) diff --git a/runtime/doc/various.txt b/runtime/doc/various.txt --- a/runtime/doc/various.txt +++ b/runtime/doc/various.txt @@ -575,6 +575,8 @@ N *+X11* Unix only: can restore window |:marks| - filter by text in the current file, or file name for other files |:oldfiles| - filter by file name + |:registers| - filter by register contents + (does not work multi-line) |:set| - filter by variable name Only normal messages are filtered, error messages are diff --git a/src/register.c b/src/register.c --- a/src/register.c +++ b/src/register.c @@ -2161,7 +2161,7 @@ ex_display(exarg_T *eap) int attr; char_u *arg = eap->arg; int clen; - char_u type[2]; + int type; if (arg != NULL && *arg == NUL) arg = NULL; @@ -2174,9 +2174,9 @@ ex_display(exarg_T *eap) name = get_register_name(i); switch (get_reg_type(name, NULL)) { - case MLINE: type[0] = 'l'; break; - case MCHAR: type[0] = 'c'; break; - default: type[0] = 'b'; break; + case MLINE: type = 'l'; break; + case MCHAR: type = 'c'; break; + default: type = 'b'; break; } if (arg != NULL && vim_strchr(arg, name) == NULL #ifdef ONE_CLIPBOARD @@ -2213,39 +2213,49 @@ ex_display(exarg_T *eap) if (yb->y_array != NULL) { - msg_putchar('\n'); - msg_puts(" "); - msg_putchar(type[0]); - msg_puts(" "); - msg_putchar('"'); - msg_putchar(name); - msg_puts(" "); + int do_show = FALSE; + + for (j = 0; !do_show && j < yb->y_size; ++j) + do_show = !message_filtered(yb->y_array[j]); + + if (do_show || yb->y_size == 0) + { + msg_putchar('\n'); + msg_puts(" "); + msg_putchar(type); + msg_puts(" "); + msg_putchar('"'); + msg_putchar(name); + msg_puts(" "); - n = (int)Columns - 11; - for (j = 0; j < yb->y_size && n > 1; ++j) - { - if (j) + n = (int)Columns - 11; + for (j = 0; j < yb->y_size && n > 1; ++j) { + if (j) + { + msg_puts_attr("^J", attr); + n -= 2; + } + for (p = yb->y_array[j]; *p && (n -= ptr2cells(p)) >= 0; + ++p) + { + clen = (*mb_ptr2len)(p); + msg_outtrans_len(p, clen); + p += clen - 1; + } + } + if (n > 1 && yb->y_type == MLINE) msg_puts_attr("^J", attr); - n -= 2; - } - for (p = yb->y_array[j]; *p && (n -= ptr2cells(p)) >= 0; ++p) - { - clen = (*mb_ptr2len)(p); - msg_outtrans_len(p, clen); - p += clen - 1; - } + out_flush(); // show one line at a time } - if (n > 1 && yb->y_type == MLINE) - msg_puts_attr("^J", attr); - out_flush(); // show one line at a time + ui_breakcheck(); } - ui_breakcheck(); } // display last inserted text if ((p = get_last_insert()) != NULL - && (arg == NULL || vim_strchr(arg, '.') != NULL) && !got_int) + && (arg == NULL || vim_strchr(arg, '.') != NULL) && !got_int + && !message_filtered(p)) { msg_puts("\n c \". "); dis_msg(p, TRUE); @@ -2253,7 +2263,7 @@ ex_display(exarg_T *eap) // display last command line if (last_cmdline != NULL && (arg == NULL || vim_strchr(arg, ':') != NULL) - && !got_int) + && !got_int && !message_filtered(last_cmdline)) { msg_puts("\n c \": "); dis_msg(last_cmdline, FALSE); @@ -2261,7 +2271,8 @@ ex_display(exarg_T *eap) // display current file name if (curbuf->b_fname != NULL - && (arg == NULL || vim_strchr(arg, '%') != NULL) && !got_int) + && (arg == NULL || vim_strchr(arg, '%') != NULL) && !got_int + && !message_filtered(curbuf->b_fname)) { msg_puts("\n c \"% "); dis_msg(curbuf->b_fname, FALSE); @@ -2273,7 +2284,8 @@ ex_display(exarg_T *eap) char_u *fname; linenr_T dummy; - if (buflist_name_nr(0, &fname, &dummy) != FAIL) + if (buflist_name_nr(0, &fname, &dummy) != FAIL + && !message_filtered(fname)) { msg_puts("\n c \"# "); dis_msg(fname, FALSE); @@ -2282,7 +2294,8 @@ ex_display(exarg_T *eap) // display last search pattern if (last_search_pat() != NULL - && (arg == NULL || vim_strchr(arg, '/') != NULL) && !got_int) + && (arg == NULL || vim_strchr(arg, '/') != NULL) && !got_int + && !message_filtered(last_search_pat())) { msg_puts("\n c \"/ "); dis_msg(last_search_pat(), FALSE); @@ -2291,7 +2304,7 @@ ex_display(exarg_T *eap) #ifdef FEAT_EVAL // display last used expression if (expr_line != NULL && (arg == NULL || vim_strchr(arg, '=') != NULL) - && !got_int) + && !got_int && !message_filtered(expr_line)) { msg_puts("\n c \"= "); dis_msg(expr_line, FALSE); 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 @@ -145,3 +145,30 @@ func Test_filter_commands() bwipe! file.h bwipe! file.hs endfunc + +func Test_filter_display() + edit Xdoesnotmatch + let @a = '!!willmatch' + let @b = '!!doesnotmatch' + let @c = "oneline\ntwoline\nwillmatch\n" + let @/ = '!!doesnotmatch' + call feedkeys(":echo '!!doesnotmatch:'\", 'ntx') + let lines = map(split(execute('filter /willmatch/ display'), "\n"), 'v:val[5:6]') + + call assert_true(index(lines, '"a') >= 0) + call assert_false(index(lines, '"b') >= 0) + call assert_true(index(lines, '"c') >= 0) + call assert_false(index(lines, '"/') >= 0) + call assert_false(index(lines, '":') >= 0) + call assert_false(index(lines, '"%') >= 0) + + let lines = map(split(execute('filter /doesnotmatch/ display'), "\n"), 'v:val[5:6]') + call assert_true(index(lines, '"a') < 0) + call assert_false(index(lines, '"b') < 0) + call assert_true(index(lines, '"c') < 0) + call assert_false(index(lines, '"/') < 0) + call assert_false(index(lines, '":') < 0) + call assert_false(index(lines, '"%') < 0) + + bwipe! +endfunc diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -742,6 +742,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2221, +/**/ 2220, /**/ 2219,