vim-patch:7.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.

d29459baa6
This commit is contained in:
James McCoy 2017-04-29 21:29:44 -04:00
parent ab50c1fdb7
commit f219657453
No known key found for this signature in database
GPG Key ID: DFE691AE331BA3DB
9 changed files with 71 additions and 7 deletions

View File

@ -1490,6 +1490,11 @@ void print_line(linenr_T lnum, int use_number, int list)
{ {
int save_silent = silent_mode; int save_silent = silent_mode;
// apply :filter /pat/
if (message_filtered(ml_get(lnum))) {
return;
}
msg_start(); msg_start();
silent_mode = FALSE; silent_mode = FALSE;
info_message = TRUE; /* use mch_msg(), not mch_errmsg() */ info_message = TRUE; /* use mch_msg(), not mch_errmsg() */

View File

@ -932,7 +932,7 @@ return {
}, },
{ {
command='filter', command='filter',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM), flags=bit.bor(BANG, NEEDARG, EXTRA, NOTRLCOM),
addr_type=ADDR_LINES, addr_type=ADDR_LINES,
func='ex_wrongmodifier', func='ex_wrongmodifier',
}, },

View File

@ -177,6 +177,7 @@ typedef struct {
bool noswapfile; ///< true when ":noswapfile" was used bool noswapfile; ///< true when ":noswapfile" was used
char_u *save_ei; ///< saved value of 'eventignore' char_u *save_ei; ///< saved value of 'eventignore'
regmatch_T filter_regmatch; ///< set by :filter /pat/ regmatch_T filter_regmatch; ///< set by :filter /pat/
bool filter_force; ///< set for :filter!
} cmdmod_T; } cmdmod_T;
#endif // NVIM_EX_CMDS_DEFS_H #endif // NVIM_EX_CMDS_DEFS_H

View File

@ -1356,6 +1356,13 @@ static char_u * do_one_cmd(char_u **cmdlinep,
if (!checkforcmd(&p, "filter", 4) || *p == NUL || ends_excmd(*p)) { if (!checkforcmd(&p, "filter", 4) || *p == NUL || ends_excmd(*p)) {
break; 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); p = skip_vimgrep_pat(p, &reg_pat, NULL);
if (p == NULL || *p == NUL) { if (p == NULL || *p == NUL) {
break; break;
@ -4883,9 +4890,12 @@ static void uc_list(char_u *name, size_t name_len)
cmd = USER_CMD_GA(gap, i); cmd = USER_CMD_GA(gap, i);
a = cmd->uc_argt; a = cmd->uc_argt;
/* Skip commands which don't match the requested prefix */ // Skip commands which don't match the requested prefix and
if (STRNCMP(name, cmd->uc_name, name_len) != 0) // commands filtered out.
if (STRNCMP(name, cmd->uc_name, name_len) != 0
|| message_filtered(cmd->uc_name)) {
continue; continue;
}
/* Put out the title first time */ /* Put out the title first time */
if (!found) if (!found)

View File

@ -1592,7 +1592,7 @@ vungetc ( /* unget one character (can only be done once!) */
/// This may do a blocking wait if "advance" is TRUE. /// This may do a blocking wait if "advance" is TRUE.
/// ///
/// if "advance" is TRUE (vgetc()): /// 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. /// KeyTyped is set to TRUE in the case the user typed the key.
/// KeyStuffed is TRUE if the character comes from the stuff buffer. /// KeyStuffed is TRUE if the character comes from the stuff buffer.
/// if "advance" is FALSE (vpeekc()): /// if "advance" is FALSE (vpeekc()):
@ -3168,6 +3168,10 @@ showmap (
{ {
size_t len = 1; size_t len = 1;
if (message_filtered(mp->m_keys) && message_filtered(mp->m_str)) {
return;
}
if (msg_didout || msg_silent != 0) { if (msg_didout || msg_silent != 0) {
msg_putchar('\n'); msg_putchar('\n');
if (got_int) /* 'q' typed at MORE prompt */ if (got_int) /* 'q' typed at MORE prompt */

View File

@ -1794,8 +1794,12 @@ static void msg_puts_display(const char_u *str, int maxlen, int attr,
/// "pattern". /// "pattern".
bool message_filtered(char_u *msg) bool message_filtered(char_u *msg)
{ {
return cmdmod.filter_regmatch.regprog != NULL if (cmdmod.filter_regmatch.regprog == NULL) {
&& !vim_regexec(&cmdmod.filter_regmatch, msg, (colnr_T)0); return false;
}
bool match = vim_regexec(&cmdmod.filter_regmatch, msg, (colnr_T)0);
return cmdmod.filter_force ? match : !match;
} }
/* /*

View File

@ -72,6 +72,7 @@ let v:testing = 1
set directory^=. set directory^=.
set backspace= set backspace=
set nohidden smarttab noautoindent noautoread complete-=i noruler noshowcmd set nohidden smarttab noautoindent noautoread complete-=i noruler noshowcmd
set listchars=eol:$
" Prevent Nvim log from writing to stderr. " Prevent Nvim log from writing to stderr.
let $NVIM_LOG_FILE='Xnvim.log' let $NVIM_LOG_FILE='Xnvim.log'

View File

@ -4,6 +4,39 @@ func Test_filter()
edit Xdoesnotmatch edit Xdoesnotmatch
edit Xwillmatch edit Xwillmatch
call assert_equal('"Xwillmatch"', substitute(execute('filter willma ls'), '[^"]*\(".*"\)[^"]*', '\1', '')) 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 endfunc
func Test_filter_fails() 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/', 'E476:') call assert_fails('filter /pat/', 'E476:')
call assert_fails('filter /pat/ asdf', 'E492:') 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 endfunc

View File

@ -181,7 +181,7 @@ static const int included_patches[] = {
2266, 2266,
2265, 2265,
2264, 2264,
// 2263, 2263,
// 2262 NA // 2262 NA
// 2261 NA // 2261 NA
// 2260 NA // 2260 NA