changeset 16433:9c206a78ec04 v8.1.1221

patch 8.1.1221: filtering does not work when listing marks commit https://github.com/vim/vim/commit/ad6dc49a7564a99fca36c1928e3865787d3bd5b2 Author: Bram Moolenaar <Bram@vim.org> 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)
author Bram Moolenaar <Bram@vim.org>
date Sat, 27 Apr 2019 22:45:05 +0200
parents ea9308b99fef
children dfbf27ca3129
files runtime/doc/various.txt src/mark.c src/testdir/test_filter_cmd.vim src/version.c
diffstat 4 files changed, 55 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- 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.
--- 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);
     }
 }
 
--- 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
--- 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,