Problem: Filtering does not work when listing marks.
Solution: Implement filtering marks. (Marcin Szamotulski, closes #3895)
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.
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 */
{
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);
}
}
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
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 1221,
/**/
1220,
/**/