summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-04-27 22:40:08 +0200
committerBram Moolenaar <Bram@vim.org>2019-04-27 22:40:08 +0200
commitad6dc49a7564a99fca36c1928e3865787d3bd5b2 (patch)
tree11ada58be7c19a0e612e899fc22b3526371aca68
parent0ee1bdff7d34df5fb764a2af15594f9da34a47cc (diff)
downloadvim-git-ad6dc49a7564a99fca36c1928e3865787d3bd5b2.tar.gz
patch 8.1.1221: filtering does not work when listing marksv8.1.1221
Problem: Filtering does not work when listing marks. Solution: Implement filtering marks. (Marcin Szamotulski, closes #3895)
-rw-r--r--runtime/doc/various.txt24
-rw-r--r--src/mark.c40
-rw-r--r--src/testdir/test_filter_cmd.vim21
-rw-r--r--src/version.c2
4 files changed, 55 insertions, 32 deletions
diff --git a/runtime/doc/various.txt b/runtime/doc/various.txt
index 923ac240f..8b4f988ee 100644
--- a/runtime/doc/various.txt
+++ b/runtime/doc/various.txt
@@ -571,17 +571,19 @@ N *+X11* Unix only: can restore window title |X11|
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
index 6a7ab00d8..1b34c2089 100644
--- 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
index 6f40a902e..0c45db049 100644
--- 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
index 9fe5d2daf..c65c541ac 100644
--- 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,