Patch 7.4.2244
Problem:    Adding pattern to ":oldfiles" is not a generic solution.
Solution:   Add the ":filter /pat/ cmd" command modifier.  Only works for some
            commands right now.
Files:      src/structs.h, src/ex_docmd.c, src/ex_cmds.h, src/message.c,
            src/proto/message.pro, runtime/doc/starting.txt,
            runtime/doc/various.txt, src/testdir/test_viminfo.vim,
            src/testdir/test_alot.vim, src/testdir/test_filter_cmd.vim,
            src/Makefile


*** ../vim-7.4.2243/src/structs.h       2016-08-22 23:04:29.206161702 +0200
--- src/structs.h       2016-08-23 22:01:52.378554550 +0200
***************
*** 571,576 ****
--- 571,577 ----
  # ifdef FEAT_AUTOCMD
      char_u    *save_ei;               /* saved value of 'eventignore' */
  # endif
+     regmatch_T        filter_regmatch;        /* set by :filter /pat/ */
  } cmdmod_T;
  
  #define MF_SEED_LEN   8
*** ../vim-7.4.2243/src/ex_docmd.c      2016-08-21 19:07:14.261008144 +0200
--- src/ex_docmd.c      2016-08-23 22:33:12.762029931 +0200
***************
*** 1781,1786 ****
--- 1781,1787 ----
      linenr_T          lnum;
      long              n;
      char_u            *errormsg = NULL;       /* error message */
+     char_u            *after_modifier = NULL;
      exarg_T           ea;                     /* Ex command arguments */
      long              verbose_save = -1;
      int                       save_msg_scroll = msg_scroll;
***************
*** 1917,1922 ****
--- 1918,1941 ----
                        cmdmod.keepjumps = TRUE;
                        continue;
  
+           case 'f':   /* only accept ":filter {pat} cmd" */
+                       {
+                           char_u *reg_pat;
+ 
+                           if (!checkforcmd(&p, "filter", 4)
+                                               || *p == NUL || ends_excmd(*p))
+                               break;
+                           p = skip_vimgrep_pat(p, &reg_pat, NULL);
+                           if (p == NULL || *p == NUL)
+                               break;
+                           cmdmod.filter_regmatch.regprog =
+                                               vim_regcomp(reg_pat, RE_MAGIC);
+                           if (cmdmod.filter_regmatch.regprog == NULL)
+                               break;
+                           ea.cmd = p;
+                           continue;
+                       }
+ 
                        /* ":hide" and ":hide | cmd" are not modifiers */
            case 'h':   if (p != ea.cmd || !checkforcmd(&p, "hide", 3)
                                               || *p == NUL || ends_excmd(*p))
***************
*** 2041,2046 ****
--- 2060,2066 ----
        }
        break;
      }
+     after_modifier = ea.cmd;
  
  #ifdef FEAT_EVAL
      ea.skip = did_emsg || got_int || did_throw || (cstack->cs_idx >= 0
***************
*** 2374,2380 ****
        {
            STRCPY(IObuff, _("E492: Not an editor command"));
            if (!sourcing)
!               append_command(*cmdlinep);
            errormsg = IObuff;
            did_emsg_syntax = TRUE;
        }
--- 2394,2407 ----
        {
            STRCPY(IObuff, _("E492: Not an editor command"));
            if (!sourcing)
!           {
!               /* If the modifier was parsed OK the error must be in the
!                * following command */
!               if (after_modifier != NULL)
!                   append_command(after_modifier);
!               else
!                   append_command(*cmdlinep);
!           }
            errormsg = IObuff;
            did_emsg_syntax = TRUE;
        }
***************
*** 2818,2823 ****
--- 2845,2851 ----
            case CMD_echomsg:
            case CMD_echon:
            case CMD_execute:
+           case CMD_filter:
            case CMD_help:
            case CMD_hide:
            case CMD_ijump:
***************
*** 2989,2994 ****
--- 3017,3024 ----
        free_string_option(cmdmod.save_ei);
      }
  #endif
+     if (cmdmod.filter_regmatch.regprog != NULL)
+       vim_regfree(cmdmod.filter_regmatch.regprog);
  
      cmdmod = save_cmdmod;
  
***************
*** 3323,3328 ****
--- 3353,3359 ----
      {"botright", 2, FALSE},
      {"browse", 3, FALSE},
      {"confirm", 4, FALSE},
+     {"filter", 4, FALSE},
      {"hide", 3, FALSE},
      {"keepalt", 5, FALSE},
      {"keepjumps", 5, FALSE},
***************
*** 3833,3838 ****
--- 3864,3870 ----
        case CMD_cfdo:
        case CMD_confirm:
        case CMD_debug:
+       case CMD_filter:
        case CMD_folddoclosed:
        case CMD_folddoopen:
        case CMD_hide:
*** ../vim-7.4.2243/src/ex_cmds.h       2016-08-20 18:36:48.296969153 +0200
--- src/ex_cmds.h       2016-08-23 22:52:33.835678370 +0200
***************
*** 544,549 ****
--- 544,552 ----
  EX(CMD_filetype,      "filetype",     ex_filetype,
                        EXTRA|TRLBAR|CMDWIN,
                        ADDR_LINES),
+ EX(CMD_filter,                "filter",       ex_wrongmodifier,
+                       NEEDARG|EXTRA|NOTRLCOM,
+                       ADDR_LINES),
  EX(CMD_find,          "find",         ex_find,
                        RANGE|NOTADR|BANG|FILE1|EDITCMD|ARGOPT|TRLBAR,
                        ADDR_LINES),
***************
*** 992,998 ****
                        RANGE|BANG|EXTRA,
                        ADDR_LINES),
  EX(CMD_oldfiles,      "oldfiles",     ex_oldfiles,
!                       BANG|TRLBAR|NOTADR|EXTRA|SBOXOK|CMDWIN,
                        ADDR_LINES),
  EX(CMD_omap,          "omap",         ex_map,
                        EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
--- 995,1001 ----
                        RANGE|BANG|EXTRA,
                        ADDR_LINES),
  EX(CMD_oldfiles,      "oldfiles",     ex_oldfiles,
!                       BANG|TRLBAR|SBOXOK|CMDWIN,
                        ADDR_LINES),
  EX(CMD_omap,          "omap",         ex_map,
                        EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
*** ../vim-7.4.2243/src/message.c       2016-08-16 21:58:36.726878365 +0200
--- src/message.c       2016-08-23 23:39:55.077845915 +0200
***************
*** 137,142 ****
--- 137,147 ----
      int               retval;
      char_u    *buf = NULL;
  
+     /* Skip messages not matching ":filter pattern".
+      * Don't filter when there is an error. */
+     if (!emsg_on_display && message_filtered(s))
+       return TRUE;
+ 
  #ifdef FEAT_EVAL
      if (attr == 0)
        set_vim_var_string(VV_STATUSMSG, s, -1);
***************
*** 2150,2155 ****
--- 2155,2171 ----
  }
  
  /*
+  * Return TRUE when ":filter pattern" was used and "msg" does not match
+  * "pattern".
+  */
+     int
+ message_filtered(char_u *msg)
+ {
+     return cmdmod.filter_regmatch.regprog != NULL
+                    && !vim_regexec(&cmdmod.filter_regmatch, msg, (colnr_T)0);
+ }
+ 
+ /*
   * Scroll the screen up one line for displaying the next message line.
   */
      static void
*** ../vim-7.4.2243/src/proto/message.pro       2016-08-10 20:53:01.679116172 
+0200
--- src/proto/message.pro       2016-08-23 22:55:25.546141638 +0200
***************
*** 43,48 ****
--- 43,49 ----
  void msg_puts_long_attr(char_u *longstr, int attr);
  void msg_puts_long_len_attr(char_u *longstr, int len, int attr);
  void msg_puts_attr(char_u *s, int attr);
+ int message_filtered(char_u *msg);
  void may_clear_sb_text(void);
  void clear_sb_text(void);
  void show_sb_text(void);
*** ../vim-7.4.2243/runtime/doc/starting.txt    2016-08-20 18:36:48.296969153 
+0200
--- runtime/doc/starting.txt    2016-08-23 23:13:27.296449466 +0200
***************
*** 1563,1580 ****
                        file.  This list is read on startup and only changes
                        afterwards with `:rviminfo!`.  Also see |v:oldfiles|.
                        The number can be used with |c_#<|.
                        {not in Vi, only when compiled with the |+eval|
                        feature}
  
- :ol[dfiles] {pat}
- :ol[dfiles] /{pat}/
-                       Like `:oldfiles` but only files matching {pat} will
-                       be included.  {pat} is a Vim search pattern.  Instead
-                       of enclosing it in / any non-ID character (see
-                       |'isident'|) can be used, so long as it does not
-                       appear in {pat}.  Without the enclosing character the
-                       pattern cannot include the bar character.
- 
  :bro[wse] ol[dfiles][!]
                        List file names as with |:oldfiles|, and then prompt
                        for a number.  When the number is valid that file from
--- 1631,1642 ----
                        file.  This list is read on startup and only changes
                        afterwards with `:rviminfo!`.  Also see |v:oldfiles|.
                        The number can be used with |c_#<|.
+                       The output can be filtered with |:filter|, e.g.: >
+                               filter /\\.vim/ oldfiles
+ <                     The filtering happens on the file name.
                        {not in Vi, only when compiled with the |+eval|
                        feature}
  
  :bro[wse] ol[dfiles][!]
                        List file names as with |:oldfiles|, and then prompt
                        for a number.  When the number is valid that file from
*** ../vim-7.4.2243/runtime/doc/various.txt     2016-07-01 18:16:47.481936426 
+0200
--- runtime/doc/various.txt     2016-08-23 23:21:54.391667974 +0200
***************
*** 500,512 ****
                        redirection starts, if the variable is removed or
                        locked or the variable type is changed, then further
                        command output messages will cause errors. {not in Vi}
  
  :redi[r] =>> {var}    Append messages to an existing variable.  Only string
                        variables can be used. {not in Vi}
  
  :redi[r] END          End redirecting messages.  {not in Vi}
  
!                                               *:sil* *:silent*
  :sil[ent][!] {command}        Execute {command} silently.  Normal messages 
will not
                        be given or added to the message history.
                        When [!] is added, error messages will also be
--- 516,549 ----
                        redirection starts, if the variable is removed or
                        locked or the variable type is changed, then further
                        command output messages will cause errors. {not in Vi}
+                       To get the output of one command the |execute()|
+                       function can be used.
  
  :redi[r] =>> {var}    Append messages to an existing variable.  Only string
                        variables can be used. {not in Vi}
  
  :redi[r] END          End redirecting messages.  {not in Vi}
  
!                                                       *:filt* *:filter*
! :filt[er] {pat} {command}
! :filt[er] /{pat}/ {command}
!                       Restrict the output of {command} to matches with {pat}.
! 
!                       {pat} is a Vim search pattern.  Instead of enclosing
!                       it in / any non-ID character (see |'isident'|) can be
!                       used, so long as it does not appear in {pat}.  Without
!                       the enclosing character the pattern cannot include the
!                       bar character.
! 
!                       The pattern is matched against the relevant part of
!                       the output, not necessarily the whole line. Only some
!                       commands support filtering, try it out to check if it
!                       works.
! 
!                       Only normal messages are filtered, error messages are
!                       not.
! 
!                                               *:sil* *:silent* *:silent!*
  :sil[ent][!] {command}        Execute {command} silently.  Normal messages 
will not
                        be given or added to the message history.
                        When [!] is added, error messages will also be
*** ../vim-7.4.2243/src/testdir/test_viminfo.vim        2016-08-20 
18:36:48.308969048 +0200
--- src/testdir/test_viminfo.vim        2016-08-23 22:56:34.645523554 +0200
***************
*** 476,482 ****
    rviminfo! Xviminfo
    call delete('Xviminfo')
  
!   call assert_equal(['1: /tmp/file_one.txt', '2: /tmp/file_two.txt', '3: 
/tmp/another.txt'], filter(split(execute('oldfile'), "\n"), {i, v -> v =~ 
'/tmp/'}))
!   call assert_equal(['1: /tmp/file_one.txt', '2: /tmp/file_two.txt'], 
filter(split(execute('oldfile file_'), "\n"), {i, v -> v =~ '/tmp/'}))
!   call assert_equal(['3: /tmp/another.txt'], filter(split(execute('oldfile 
/another/'), "\n"), {i, v -> v =~ '/tmp/'}))
  endfunc
--- 476,482 ----
    rviminfo! Xviminfo
    call delete('Xviminfo')
  
!   call assert_equal(['1: /tmp/file_one.txt', '2: /tmp/file_two.txt', '3: 
/tmp/another.txt'], filter(split(execute('oldfiles'), "\n"), {i, v -> v =~ 
'/tmp/'}))
!   call assert_equal(['1: /tmp/file_one.txt', '2: /tmp/file_two.txt'], 
filter(split(execute('filter file_ oldfiles'), "\n"), {i, v -> v =~ '/tmp/'}))
!   call assert_equal(['3: /tmp/another.txt'], filter(split(execute('filter 
/another/ oldfiles'), "\n"), {i, v -> v =~ '/tmp/'}))
  endfunc
*** ../vim-7.4.2243/src/testdir/test_alot.vim   2016-08-20 16:56:48.254624304 
+0200
--- src/testdir/test_alot.vim   2016-08-23 23:26:21.653224287 +0200
***************
*** 13,18 ****
--- 13,19 ----
  source test_feedkeys.vim
  source test_fnamemodify.vim
  source test_file_perm.vim
+ source test_filter_cmd.vim
  source test_filter_map.vim
  source test_glob2regpat.vim
  source test_goto.vim
*** ../vim-7.4.2243/src/testdir/test_filter_cmd.vim     2016-08-23 
23:31:32.510403543 +0200
--- src/testdir/test_filter_cmd.vim     2016-08-23 23:45:44.730683338 +0200
***************
*** 0 ****
--- 1,15 ----
+ " Test the :filter command modifier
+ 
+ func Test_filter()
+   edit Xdoesnotmatch
+   edit Xwillmatch
+   call assert_equal('"Xwillmatch"', substitute(execute('filter willma ls'), 
'[^"]*\(".*"\)[^"]*', '\1', ''))
+ endfunc
+ 
+ func Test_filter_fails()
+   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
*** ../vim-7.4.2243/src/Makefile        2016-08-20 16:56:48.254624304 +0200
--- src/Makefile        2016-08-23 23:26:55.476917275 +0200
***************
*** 2072,2077 ****
--- 2082,2088 ----
        test_farsi \
        test_feedkeys \
        test_file_perm \
+       test_filter_cmd \
        test_filter_map \
        test_fnamemodify \
        test_glob2regpat \
*** ../vim-7.4.2243/src/version.c       2016-08-22 23:04:29.222161560 +0200
--- src/version.c       2016-08-23 23:19:12.481191890 +0200
***************
*** 765,766 ****
--- 765,768 ----
  {   /* Add new patch number below this line */
+ /**/
+     2244,
  /**/


-- 
Over the years, I've developed my sense of deja vu so acutely that now
I can remember things that *have* happened before ...

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui