# HG changeset patch # User Christian Brabandt # Date 1510347606 -3600 # Node ID 3f2f468b8b9d1d7e6aa9e7ba541bf9d35fbf19b9 # Parent f1aaf8757efe86e7bd8274f86e5d48ed212d94f4 patch 8.0.1284: loading file type detection slows down startup commit https://github.com/vim/vim/commit/462455ee8b81cb5709007d91248ac4a88308d6e9 Author: Bram Moolenaar Date: Fri Nov 10 21:53:11 2017 +0100 patch 8.0.1284: loading file type detection slows down startup Problem: Loading file type detection slows down startup. Solution: Store the last pattern of an autocommand event to make appending quicker. diff --git a/src/fileio.c b/src/fileio.c --- a/src/fileio.c +++ b/src/fileio.c @@ -7650,6 +7650,8 @@ forward_slash(char_u *fname) * 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,6 +7664,8 @@ forward_slash(char_u *fname) * V * NULL * + * last_autopat[1] --------+ + * V * first_autopat[1] --> Autopat.next --> NULL * Autopat.cmds * | @@ -7689,11 +7693,12 @@ typedef struct AutoCmd 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 */ - 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 */ @@ -7813,6 +7818,16 @@ static AutoPat *first_autopat[NUM_EVENTS 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,6 +8026,15 @@ au_cleanup(void) /* 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,9 +8699,13 @@ do_autocmd_event( } /* - * Find AutoPat entries with this pattern. + * Find AutoPat entries with this pattern. When adding a command it + * always goes at or after the last one, so start at the end. */ - prev_ap = &first_autopat[(int)event]; + 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,6 +8811,7 @@ do_autocmd_event( } ap->cmds = NULL; *prev_ap = ap; + last_autopat[(int)event] = ap; ap->next = NULL; if (group == AUGROUP_ALL) ap->group = current_augroup; diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -762,6 +762,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1284, +/**/ 1283, /**/ 1282,