changeset 18454:b912277e3877 v8.1.2221

patch 8.1.2221: cannot filter :disp output Commit: https://github.com/vim/vim/commit/8fc42964363087025a27e8c80276c706536fc4e3 Author: Bram Moolenaar <Bram@vim.org> 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)
author Bram Moolenaar <Bram@vim.org>
date Sat, 26 Oct 2019 17:45:03 +0200
parents 043c07d16d60
children 3c98dfd2380c
files runtime/doc/various.txt src/register.c src/testdir/test_filter_cmd.vim src/version.c
diffstat 4 files changed, 77 insertions(+), 33 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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);
--- 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:'\<CR>", '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
--- 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,