summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2016-08-26 22:29:11 +0200
committerBram Moolenaar <Bram@vim.org>2016-08-26 22:29:11 +0200
commitd29459baa61819e59961804ed258efac5733ec70 (patch)
tree11154e516a0d506808a6bb51d77add58af7d6e16
parent257095760732597983bdd026e791907b7980e295 (diff)
patch 7.4.2263v7.4.2263
Problem: :filter does not work for many commands. Can only get matching messages. Solution: Make :filter work for :command, :map, :list, :number and :print. Make ":filter!" show non-matching lines.
-rw-r--r--src/ex_cmds.c4
-rw-r--r--src/ex_cmds.h2
-rw-r--r--src/ex_docmd.c13
-rw-r--r--src/getchar.c5
-rw-r--r--src/message.c8
-rw-r--r--src/structs.h1
-rw-r--r--src/testdir/test_filter_cmd.vim39
-rw-r--r--src/version.c2
8 files changed, 68 insertions, 6 deletions
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index 64d14aedd2..9f2cd9540f 100644
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -2918,6 +2918,10 @@ print_line(linenr_T lnum, int use_number, int list)
{
int save_silent = silent_mode;
+ /* apply :filter /pat/ */
+ if (message_filtered(ml_get(lnum)))
+ return;
+
msg_start();
silent_mode = FALSE;
info_message = TRUE; /* use mch_msg(), not mch_errmsg() */
diff --git a/src/ex_cmds.h b/src/ex_cmds.h
index 81b3ff809a..eaa49158c3 100644
--- a/src/ex_cmds.h
+++ b/src/ex_cmds.h
@@ -545,7 +545,7 @@ EX(CMD_filetype, "filetype", ex_filetype,
EXTRA|TRLBAR|CMDWIN,
ADDR_LINES),
EX(CMD_filter, "filter", ex_wrongmodifier,
- NEEDARG|EXTRA|NOTRLCOM,
+ BANG|NEEDARG|EXTRA|NOTRLCOM,
ADDR_LINES),
EX(CMD_find, "find", ex_find,
RANGE|NOTADR|BANG|FILE1|EDITCMD|ARGOPT|TRLBAR,
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 94216b371e..44f6c1e3b4 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -1925,6 +1925,13 @@ do_one_cmd(
if (!checkforcmd(&p, "filter", 4)
|| *p == NUL || ends_excmd(*p))
break;
+ if (*p == '!')
+ {
+ cmdmod.filter_force = TRUE;
+ p = skipwhite(p + 1);
+ if (*p == NUL || ends_excmd(*p))
+ break;
+ }
p = skip_vimgrep_pat(p, &reg_pat, NULL);
if (p == NULL || *p == NUL)
break;
@@ -5928,8 +5935,10 @@ uc_list(char_u *name, size_t name_len)
cmd = USER_CMD_GA(gap, i);
a = (long)cmd->uc_argt;
- /* Skip commands which don't match the requested prefix */
- if (STRNCMP(name, cmd->uc_name, name_len) != 0)
+ /* Skip commands which don't match the requested prefix and
+ * commands filtered out. */
+ if (STRNCMP(name, cmd->uc_name, name_len) != 0
+ || message_filtered(cmd->uc_name))
continue;
/* Put out the title first time */
diff --git a/src/getchar.c b/src/getchar.c
index 52b1853776..9fcc62b08e 100644
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -1919,7 +1919,7 @@ vungetc(int c)
* This may do a blocking wait if "advance" is TRUE.
*
* if "advance" is TRUE (vgetc()):
- * really get the character.
+ * Really get the character.
* KeyTyped is set to TRUE in the case the user typed the key.
* KeyStuffed is TRUE if the character comes from the stuff buffer.
* if "advance" is FALSE (vpeekc()):
@@ -3987,6 +3987,9 @@ showmap(
int len = 1;
char_u *mapchars;
+ if (message_filtered(mp->m_keys) && message_filtered(mp->m_str))
+ return;
+
if (msg_didout || msg_silent != 0)
{
msg_putchar('\n');
diff --git a/src/message.c b/src/message.c
index f24bc28173..0d10431372 100644
--- a/src/message.c
+++ b/src/message.c
@@ -2161,8 +2161,12 @@ msg_puts_display(
int
message_filtered(char_u *msg)
{
- return cmdmod.filter_regmatch.regprog != NULL
- && !vim_regexec(&cmdmod.filter_regmatch, msg, (colnr_T)0);
+ int match;
+
+ if (cmdmod.filter_regmatch.regprog == NULL)
+ return FALSE;
+ match = vim_regexec(&cmdmod.filter_regmatch, msg, (colnr_T)0);
+ return cmdmod.filter_force ? match : !match;
}
/*
diff --git a/src/structs.h b/src/structs.h
index e559220604..e581e43659 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -572,6 +572,7 @@ typedef struct
char_u *save_ei; /* saved value of 'eventignore' */
# endif
regmatch_T filter_regmatch; /* set by :filter /pat/ */
+ int filter_force; /* set for :filter! */
} cmdmod_T;
#define MF_SEED_LEN 8
diff --git a/src/testdir/test_filter_cmd.vim b/src/testdir/test_filter_cmd.vim
index f85a11ce45..0bbd905c85 100644
--- a/src/testdir/test_filter_cmd.vim
+++ b/src/testdir/test_filter_cmd.vim
@@ -4,6 +4,39 @@ func Test_filter()
edit Xdoesnotmatch
edit Xwillmatch
call assert_equal('"Xwillmatch"', substitute(execute('filter willma ls'), '[^"]*\(".*"\)[^"]*', '\1', ''))
+ bwipe Xdoesnotmatch
+ bwipe Xwillmatch
+
+ new
+ call setline(1, ['foo1', 'foo2', 'foo3', 'foo4', 'foo5'])
+ call assert_equal("\nfoo2\nfoo4", execute('filter /foo[24]/ 1,$print'))
+ call assert_equal("\n 2 foo2\n 4 foo4", execute('filter /foo[24]/ 1,$number'))
+ call assert_equal("\nfoo2$\nfoo4$", execute('filter /foo[24]/ 1,$list'))
+
+ call assert_equal("\nfoo1$\nfoo3$\nfoo5$", execute('filter! /foo[24]/ 1,$list'))
+ bwipe!
+
+ command XTryThis echo 'this'
+ command XTryThat echo 'that'
+ command XDoThat echo 'that'
+ let lines = split(execute('filter XTry command'), "\n")
+ call assert_equal(3, len(lines))
+ call assert_match("XTryThat", lines[1])
+ call assert_match("XTryThis", lines[2])
+ delcommand XTryThis
+ delcommand XTryThat
+ delcommand XDoThat
+
+ map f1 the first key
+ map f2 the second key
+ map f3 not a key
+ let lines = split(execute('filter the map f'), "\n")
+ call assert_equal(2, len(lines))
+ call assert_match("f2", lines[0])
+ call assert_match("f1", lines[1])
+ unmap f1
+ unmap f2
+ unmap f3
endfunc
func Test_filter_fails()
@@ -12,4 +45,10 @@ func Test_filter_fails()
call assert_fails('filter /pat', 'E476:')
call assert_fails('filter /pat/', 'E476:')
call assert_fails('filter /pat/ asdf', 'E492:')
+
+ call assert_fails('filter!', 'E471:')
+ call assert_fails('filter! pat', 'E476:')
+ call assert_fails('filter! /pat', 'E476:')
+ call assert_fails('filter! /pat/', 'E476:')
+ call assert_fails('filter! /pat/ asdf', 'E492:')
endfunc
diff --git a/src/version.c b/src/version.c
index a46e74830d..934eecb290 100644
--- a/src/version.c
+++ b/src/version.c
@@ -764,6 +764,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2263,
+/**/
2262,
/**/
2261,