aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Edmund Lazo <jan.lazo@mail.utoronto.ca>2019-07-01 14:28:37 -0400
committerJan Edmund Lazo <jan.lazo@mail.utoronto.ca>2019-07-15 23:07:29 -0400
commitd27175aa2879bbc84bb5bb57edf809b7f1da8c7e (patch)
tree6ba6a7f79ddf3610c5cc2f7ae654093d92d58dee
parent5d933310c875908b81ece4f831f72a311f5eb14e (diff)
downloadrneovim-d27175aa2879bbc84bb5bb57edf809b7f1da8c7e.tar.gz
rneovim-d27175aa2879bbc84bb5bb57edf809b7f1da8c7e.tar.bz2
rneovim-d27175aa2879bbc84bb5bb57edf809b7f1da8c7e.zip
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) https://github.com/vim/vim/commit/ad6dc49a7564a99fca36c1928e3865787d3bd5b2
-rw-r--r--runtime/doc/various.txt24
-rw-r--r--src/nvim/mark.c67
-rw-r--r--src/nvim/testdir/test_filter_cmd.vim21
3 files changed, 66 insertions, 46 deletions
diff --git a/runtime/doc/various.txt b/runtime/doc/various.txt
index 63066cef8a..bfb00f74c4 100644
--- a/runtime/doc/various.txt
+++ b/runtime/doc/various.txt
@@ -359,17 +359,19 @@ g8 Print the hex values of the bytes used in the
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/nvim/mark.c b/src/nvim/mark.c
index c87b612dbd..598fd79c0e 100644
--- a/src/nvim/mark.c
+++ b/src/nvim/mark.c
@@ -656,48 +656,51 @@ 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;
-
- if (c == -1) { /* finish up */
- if (did_title)
- did_title = FALSE;
- else {
- if (arg == NULL)
+ 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) {
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
- && (arg == NULL || vim_strchr(arg, c) != NULL)
- && p->lnum != 0) {
- if (!did_title) {
- /* Highlight title */
- MSG_PUTS_TITLE(_("\nmark line col file/text"));
- did_title = TRUE;
+ } 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;
}
- msg_putchar('\n');
- if (!got_int) {
- sprintf((char *)IObuff, " %c %6ld %4d ", c, p->lnum, p->col);
- msg_outtrans(IObuff);
- 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;
}
- if (name != NULL) {
- msg_outtrans_attr(name, current ? HL_ATTR(HLF_D) : 0);
- if (mustfree) {
- xfree(name);
+ msg_putchar('\n');
+ if (!got_int) {
+ snprintf((char *)IObuff, IOSIZE, " %c %6ld %4d ", c, p->lnum, p->col);
+ msg_outtrans(IObuff);
+ 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 */
}
}
diff --git a/src/nvim/testdir/test_filter_cmd.vim b/src/nvim/testdir/test_filter_cmd.vim
index 6f40a902e1..0c45db049b 100644
--- a/src/nvim/testdir/test_filter_cmd.vim
+++ b/src/nvim/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