vim-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 vim/vim#3895)
ad6dc49a75
This commit is contained in:
Jan Edmund Lazo
2019-07-01 14:28:37 -04:00
parent 5d933310c8
commit d27175aa28
3 changed files with 67 additions and 47 deletions

View File

@@ -360,6 +360,7 @@ g8 Print the hex values of the bytes used in the
commands support filtering, try it out to check if it
works. Some of the commands that support filtering:
|:#| - 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
@@ -367,8 +368,9 @@ g8 Print the hex values of the bytes used in the
|: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
|:clist| - filter by file name or module name
|:set| - filter by variable name
Only normal messages are filtered, error messages are

View File

@@ -656,50 +656,53 @@ show_one_mark(
int c,
char_u *arg,
pos_T *p,
char_u *name,
int current /* in current file */
char_u *name_arg,
int current // in current file
)
{
static int did_title = FALSE;
int mustfree = FALSE;
static bool did_title = false;
bool mustfree = false;
char_u *name = name_arg;
if (c == -1) { /* finish up */
if (did_title)
did_title = FALSE;
else {
if (arg == NULL)
if (c == -1) { // finish up
if (did_title) {
did_title = false;
} else {
if (arg == NULL) {
MSG(_("No marks set"));
else
} else {
EMSG2(_("E283: No marks matching \"%s\""), arg);
}
}
/* don't output anything if 'q' typed at --more-- prompt */
else if (!got_int
} else if (!got_int
&& (arg == NULL || vim_strchr(arg, c) != NULL)
&& p->lnum != 0) {
// don't output anything if 'q' typed at --more-- prompt
if (name == NULL && current) {
name = mark_line(p, 15);
mustfree = true;
}
if (!message_filtered(name)) {
if (!did_title) {
/* Highlight title */
MSG_PUTS_TITLE(_("\nmark line col file/text"));
did_title = TRUE;
// Highlight title
msg_puts_title(_("\nmark line col file/text"));
did_title = true;
}
msg_putchar('\n');
if (!got_int) {
sprintf((char *)IObuff, " %c %6ld %4d ", c, p->lnum, p->col);
snprintf((char *)IObuff, IOSIZE, " %c %6ld %4d ", c, p->lnum, p->col);
msg_outtrans(IObuff);
if (name == NULL && current) {
name = mark_line(p, 15);
mustfree = TRUE;
}
if (name != NULL) {
msg_outtrans_attr(name, current ? HL_ATTR(HLF_D) : 0);
}
}
ui_flush(); // show one line at a time
}
if (mustfree) {
xfree(name);
}
}
}
ui_flush(); /* show one line at a time */
}
}
/*
* ":delmarks[!] [marks]"

View File

@@ -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