Patch 8.0.1284
Problem:    Loading file type detection slows down startup.
Solution:   Store the last pattern of an autocommand event to make appending
            quicker.
Files:      src/fileio.c


*** ../vim-8.0.1283/src/fileio.c        2017-11-09 12:29:27.390551291 +0100
--- src/fileio.c        2017-11-10 21:32:24.728163773 +0100
***************
*** 7650,7655 ****
--- 7650,7657 ----
   * together, to avoid having to match the pattern too often.
   * The result is an array of Autopat lists, which point to AutoCmd lists:
   *
+  * last_autopat[0]  -----------------------------+
+  *                                             V
   * first_autopat[0] --> Autopat.next  -->  Autopat.next -->  NULL
   *                    Autopat.cmds       Autopat.cmds
   *                        |                    |
***************
*** 7662,7667 ****
--- 7664,7671 ----
   *                        V
   *                       NULL
   *
+  * last_autopat[1]  --------+
+  *                        V
   * first_autopat[1] --> Autopat.next  -->  NULL
   *                    Autopat.cmds
   *                        |
***************
*** 7689,7699 ****
  
  typedef struct AutoPat
  {
      char_u        *pat;               /* pattern as typed (NULL when pattern
                                           has been removed) */
      regprog_T     *reg_prog;          /* compiled regprog for pattern */
      AutoCmd       *cmds;              /* list of commands to do */
-     struct AutoPat  *next;            /* next AutoPat in AutoPat list */
      int                   group;              /* group ID */
      int                   patlen;             /* strlen() of pat */
      int                   buflocal_nr;        /* !=0 for buffer-local AutoPat 
*/
--- 7693,7704 ----
  
  typedef struct AutoPat
  {
+     struct AutoPat  *next;            /* next AutoPat in AutoPat list; MUST
+                                        * be the first entry */
      char_u        *pat;               /* pattern as typed (NULL when pattern
                                           has been removed) */
      regprog_T     *reg_prog;          /* compiled regprog for pattern */
      AutoCmd       *cmds;              /* list of commands to do */
      int                   group;              /* group ID */
      int                   patlen;             /* strlen() of pat */
      int                   buflocal_nr;        /* !=0 for buffer-local AutoPat 
*/
***************
*** 7813,7818 ****
--- 7818,7833 ----
      NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
  };
  
+ static AutoPat *last_autopat[NUM_EVENTS] =
+ {
+     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
+ };
+ 
  /*
   * struct used to keep status while executing autocommands for an event.
   */
***************
*** 8011,8016 ****
--- 8026,8040 ----
            /* remove the pattern if it has been marked for deletion */
            if (ap->pat == NULL)
            {
+               if (ap->next == NULL)
+               {
+                   if (prev_ap == &(first_autopat[(int)event]))
+                       last_autopat[(int)event] = NULL;
+                   else
+                       /* this depends on the "next" field being the first in
+                        * the struct */
+                       last_autopat[(int)event] = (AutoPat *)prev_ap;
+               }
                *prev_ap = ap->next;
                vim_regfree(ap->reg_prog);
                vim_free(ap);
***************
*** 8675,8683 ****
        }
  
        /*
!        * Find AutoPat entries with this pattern.
         */
!       prev_ap = &first_autopat[(int)event];
        while ((ap = *prev_ap) != NULL)
        {
            if (ap->pat != NULL)
--- 8699,8711 ----
        }
  
        /*
!        * Find AutoPat entries with this pattern.  When adding a command it
!        * always goes at or after the last one, so start at the end.
         */
!       if (!forceit && *cmd != NUL && last_autopat[(int)event] != NULL)
!           prev_ap = &last_autopat[(int)event];
!       else
!           prev_ap = &first_autopat[(int)event];
        while ((ap = *prev_ap) != NULL)
        {
            if (ap->pat != NULL)
***************
*** 8783,8788 ****
--- 8811,8817 ----
                }
                ap->cmds = NULL;
                *prev_ap = ap;
+               last_autopat[(int)event] = ap;
                ap->next = NULL;
                if (group == AUGROUP_ALL)
                    ap->group = current_augroup;
*** ../vim-8.0.1283/src/version.c       2017-11-09 22:10:29.188559134 +0100
--- src/version.c       2017-11-10 21:51:03.811958628 +0100
***************
*** 763,764 ****
--- 763,766 ----
  {   /* Add new patch number below this line */
+ /**/
+     1284,
  /**/

-- 
"Lisp has all the visual appeal of oatmeal with nail clippings thrown in."
                                                         -- Larry Wall

 /// 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