From dbdc2d40bb7a950e294c6e50906f546707ccf390 Mon Sep 17 00:00:00 2001 From: James McCoy Date: Fri, 28 Apr 2017 21:04:17 -0400 Subject: vim-patch:7.4.2231 Problem: ":oldfiles" output is a very long list. Solution: Add a pattern argument. (Coot, closes vim/vim#575) https://github.com/vim/vim/commit/e11d61a3b1cdedf3144de697a2b38af62c3a78d8 --- src/nvim/ex_cmds.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) (limited to 'src/nvim/ex_cmds.c') diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c index 7726e0fc6d..ab85bb766f 100644 --- a/src/nvim/ex_cmds.c +++ b/src/nvim/ex_cmds.c @@ -6158,3 +6158,71 @@ void ex_substitute(exarg_T *eap) ga_clear(&save_view); unblock_autocmds(); } + +/// List v:oldfiles in a nice way. +void ex_oldfiles(exarg_T *eap) +{ + list_T *l = get_vim_var_list(VV_OLDFILES); + listitem_T *li; + long nr = 0; + + if (l == NULL) { + msg((char_u *)_("No old files")); + } else { + char_u *reg_pat = NULL; + regmatch_T regmatch; + + if (*eap->arg != NUL) { + if (skip_vimgrep_pat(eap->arg, ®_pat, NULL) == NULL) { + EMSG(_(e_invalpat)); + return; + } + regmatch.regprog = vim_regcomp(reg_pat, p_magic ? RE_MAGIC : 0); + if (regmatch.regprog == NULL) { + return; + } + } + + msg_start(); + msg_scroll = TRUE; + for (li = l->lv_first; li != NULL && !got_int; li = li->li_next) { + nr++; + const char *fname = tv_get_string(&li->li_tv); + if (reg_pat == NULL || *reg_pat == NUL + || vim_regexec(®match, (char_u *)fname, (colnr_T)0)) { + msg_outnum(nr); + MSG_PUTS(": "); + msg_outtrans((char_u *)tv_get_string(&li->li_tv)); + msg_clr_eos(); + msg_putchar('\n'); + ui_flush(); // output one line at a time + os_breakcheck(); + } + } + if (*eap->arg != NUL) { + vim_regfree(regmatch.regprog); + } + + /* Assume "got_int" was set to truncate the listing. */ + got_int = FALSE; + + // File selection prompt on ":browse oldfiles" + if (cmdmod.browse) { + quit_more = false; + nr = prompt_for_number(false); + msg_starthere(); + if (nr > 0 && nr <= l->lv_len) { + const char *const p = tv_list_find_str(l, nr - 1); + if (p == NULL) { + return; + } + char *const s = (char *)expand_env_save((char_u *)p); + eap->arg = (char_u *)s; + eap->cmdidx = CMD_edit; + cmdmod.browse = false; + do_exedit(eap, NULL); + xfree(s); + } + } + } +} -- cgit From 059c3fc2f952b42824ca37610c040c938a75de5c Mon Sep 17 00:00:00 2001 From: James McCoy Date: Sat, 29 Apr 2017 07:55:15 -0400 Subject: vim-patch:7.4.2239 Problem: Warning for missing declaration of skip_vimgrep_pat(). (John Marriott) Solution: Move it to another file. https://github.com/vim/vim/commit/9baf297c99cc35adb921bee04369499d76438889 --- src/nvim/ex_cmds.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) (limited to 'src/nvim/ex_cmds.c') diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c index ab85bb766f..95cbcbbcb9 100644 --- a/src/nvim/ex_cmds.c +++ b/src/nvim/ex_cmds.c @@ -6159,6 +6159,50 @@ void ex_substitute(exarg_T *eap) unblock_autocmds(); } +/// Skip over the pattern argument of ":vimgrep /pat/[g][j]". +/// Put the start of the pattern in "*s", unless "s" is NULL. +/// If "flags" is not NULL put the flags in it: VGR_GLOBAL, VGR_NOJUMP. +/// If "s" is not NULL terminate the pattern with a NUL. +/// Return a pointer to the char just past the pattern plus flags. +char_u *skip_vimgrep_pat(char_u *p, char_u **s, int *flags) +{ + int c; + + if (vim_isIDc(*p)) { + // ":vimgrep pattern fname" + if (s != NULL) + *s = p; + p = skiptowhite(p); + if (s != NULL && *p != NUL) + *p++ = NUL; + } else { + // ":vimgrep /pattern/[g][j] fname" + if (s != NULL) + *s = p + 1; + c = *p; + p = skip_regexp(p + 1, c, TRUE, NULL); + if (*p != c) + return NULL; + + // Truncate the pattern. + if (s != NULL) + *p = NUL; + ++p; + + // Find the flags + while (*p == 'g' || *p == 'j') { + if (flags != NULL) { + if (*p == 'g') + *flags |= VGR_GLOBAL; + else + *flags |= VGR_NOJUMP; + } + ++p; + } + } + return p; +} + /// List v:oldfiles in a nice way. void ex_oldfiles(exarg_T *eap) { -- cgit From ab50c1fdb73aa58f620491d50c6fcd222d37cb9d Mon Sep 17 00:00:00 2001 From: James McCoy Date: Sat, 29 Apr 2017 21:24:42 -0400 Subject: vim-patch:7.4.2246 Problem: Oldfiles test fails. Solution: Include missing changes. https://github.com/vim/vim/commit/d6f2ee32dcfa18c781ef157918b524318a2215a2 --- src/nvim/ex_cmds.c | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) (limited to 'src/nvim/ex_cmds.c') diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c index 95cbcbbcb9..772527532e 100644 --- a/src/nvim/ex_cmds.c +++ b/src/nvim/ex_cmds.c @@ -6213,27 +6213,12 @@ void ex_oldfiles(exarg_T *eap) if (l == NULL) { msg((char_u *)_("No old files")); } else { - char_u *reg_pat = NULL; - regmatch_T regmatch; - - if (*eap->arg != NUL) { - if (skip_vimgrep_pat(eap->arg, ®_pat, NULL) == NULL) { - EMSG(_(e_invalpat)); - return; - } - regmatch.regprog = vim_regcomp(reg_pat, p_magic ? RE_MAGIC : 0); - if (regmatch.regprog == NULL) { - return; - } - } - msg_start(); msg_scroll = TRUE; for (li = l->lv_first; li != NULL && !got_int; li = li->li_next) { nr++; const char *fname = tv_get_string(&li->li_tv); - if (reg_pat == NULL || *reg_pat == NUL - || vim_regexec(®match, (char_u *)fname, (colnr_T)0)) { + if (!message_filtered((char_u *)fname)) { msg_outnum(nr); MSG_PUTS(": "); msg_outtrans((char_u *)tv_get_string(&li->li_tv)); @@ -6243,9 +6228,6 @@ void ex_oldfiles(exarg_T *eap) os_breakcheck(); } } - if (*eap->arg != NUL) { - vim_regfree(regmatch.regprog); - } /* Assume "got_int" was set to truncate the listing. */ got_int = FALSE; -- cgit From f219657453271f19519148d76536879bec044534 Mon Sep 17 00:00:00 2001 From: James McCoy Date: Sat, 29 Apr 2017 21:29:44 -0400 Subject: 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. https://github.com/vim/vim/commit/d29459baa61819e59961804ed258efac5733ec70 --- src/nvim/ex_cmds.c | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'src/nvim/ex_cmds.c') diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c index 772527532e..1b2eb774c9 100644 --- a/src/nvim/ex_cmds.c +++ b/src/nvim/ex_cmds.c @@ -1490,6 +1490,11 @@ void 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() */ -- cgit From 2b191ac5b9a18f31eadb4f14ed8a220d0c03ebdc Mon Sep 17 00:00:00 2001 From: James McCoy Date: Sat, 29 Apr 2017 22:09:09 -0400 Subject: lint --- src/nvim/ex_cmds.c | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) (limited to 'src/nvim/ex_cmds.c') diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c index 1b2eb774c9..f73d4c16b6 100644 --- a/src/nvim/ex_cmds.c +++ b/src/nvim/ex_cmds.c @@ -6175,34 +6175,40 @@ char_u *skip_vimgrep_pat(char_u *p, char_u **s, int *flags) if (vim_isIDc(*p)) { // ":vimgrep pattern fname" - if (s != NULL) + if (s != NULL) { *s = p; + } p = skiptowhite(p); - if (s != NULL && *p != NUL) + if (s != NULL && *p != NUL) { *p++ = NUL; + } } else { // ":vimgrep /pattern/[g][j] fname" - if (s != NULL) + if (s != NULL) { *s = p + 1; + } c = *p; - p = skip_regexp(p + 1, c, TRUE, NULL); - if (*p != c) + p = skip_regexp(p + 1, c, true, NULL); + if (*p != c) { return NULL; + } // Truncate the pattern. - if (s != NULL) + if (s != NULL) { *p = NUL; - ++p; + } + p++; // Find the flags while (*p == 'g' || *p == 'j') { if (flags != NULL) { - if (*p == 'g') + if (*p == 'g') { *flags |= VGR_GLOBAL; - else + } else { *flags |= VGR_NOJUMP; + } } - ++p; + p++; } } return p; @@ -6219,7 +6225,7 @@ void ex_oldfiles(exarg_T *eap) msg((char_u *)_("No old files")); } else { msg_start(); - msg_scroll = TRUE; + msg_scroll = true; for (li = l->lv_first; li != NULL && !got_int; li = li->li_next) { nr++; const char *fname = tv_get_string(&li->li_tv); @@ -6234,8 +6240,8 @@ void ex_oldfiles(exarg_T *eap) } } - /* Assume "got_int" was set to truncate the listing. */ - got_int = FALSE; + // Assume "got_int" was set to truncate the listing. + got_int = false; // File selection prompt on ":browse oldfiles" if (cmdmod.browse) { -- cgit