diff --git a/src/Make_cyg_ming.mak b/src/Make_cyg_ming.mak
index 6a3cf81..bb4c739 100644
--- a/src/Make_cyg_ming.mak
+++ b/src/Make_cyg_ming.mak
@@ -760,6 +760,7 @@
 	$(OUTDIR)/profiler.o \
 	$(OUTDIR)/quickfix.o \
 	$(OUTDIR)/regexp.o \
+	$(OUTDIR)/scriptfile.o \
 	$(OUTDIR)/screen.o \
 	$(OUTDIR)/search.o \
 	$(OUTDIR)/session.o \
diff --git a/src/Make_morph.mak b/src/Make_morph.mak
index c41e853..08111aa 100644
--- a/src/Make_morph.mak
+++ b/src/Make_morph.mak
@@ -77,6 +77,7 @@
 	profiler.c						\
 	quickfix.c						\
 	regexp.c						\
+	scriptfile.c						\
 	screen.c						\
 	search.c						\
 	session.c						\
diff --git a/src/Make_mvc.mak b/src/Make_mvc.mak
index 301087d..facc15e 100644
--- a/src/Make_mvc.mak
+++ b/src/Make_mvc.mak
@@ -769,6 +769,7 @@
 	$(OUTDIR)\profiler.obj \
 	$(OUTDIR)\quickfix.obj \
 	$(OUTDIR)\regexp.obj \
+	$(OUTDIR)\scriptfile.obj \
 	$(OUTDIR)\screen.obj \
 	$(OUTDIR)\search.obj \
 	$(OUTDIR)\session.obj \
@@ -1627,6 +1628,8 @@
 
 $(OUTDIR)/regexp.obj:	$(OUTDIR) regexp.c regexp_nfa.c  $(INCL)
 
+$(OUTDIR)/scriptfile.obj:	$(OUTDIR) scriptfile.c  $(INCL)
+
 $(OUTDIR)/screen.obj:	$(OUTDIR) screen.c  $(INCL)
 
 $(OUTDIR)/search.obj:	$(OUTDIR) search.c  $(INCL)
@@ -1805,6 +1808,7 @@
 	proto/profiler.pro \
 	proto/quickfix.pro \
 	proto/regexp.pro \
+	proto/scriptfile.pro \
 	proto/screen.pro \
 	proto/search.pro \
 	proto/session.pro \
diff --git a/src/Make_vms.mms b/src/Make_vms.mms
index cb57d91..d1ceb6b 100644
--- a/src/Make_vms.mms
+++ b/src/Make_vms.mms
@@ -315,6 +315,7 @@
 	indent.c insexpand.c json.c list.c main.c map.c mark.c menu.c mbyte.c \
 	memfile.c memline.c message.c misc1.c misc2.c move.c normal.c ops.c \
 	option.c popupmnu.c popupwin.c profiler.c quickfix.c regexp.c \
+	scriptfile.c \
 	search.c session.c sha256.c sign.c spell.c spellfile.c syntax.c tag.c \
 	term.c termlib.c testing.c textprop.c ui.c undo.c usercmd.c \
 	userfunc.c version.c viminfo.c screen.c window.c os_unix.c os_vms.c \
@@ -332,6 +333,7 @@
 	map.obj mark.obj menu.obj memfile.obj memline.obj message.obj \
 	misc1.obj misc2.obj move.obj mbyte.obj normal.obj ops.obj option.obj \
 	popupmnu.obj popupwin.obj profiler.obj quickfix.obj regexp.obj \
+	scriptfile.obj \
 	search.obj session.obj sha256.obj sign.obj spell.obj spellfile.obj \
 	syntax.obj tag.obj term.obj termlib.obj testing.obj textprop.obj \
 	ui.obj undo.obj usercmd.obj userfunc.obj screen.obj version.obj \
@@ -724,6 +726,10 @@
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
  globals.h
+scriptfile.obj : scriptfile.c vim.h [.auto]config.h feature.h os_unix.h \
+ ascii.h keymap.h term.h macros.h structs.h regexp.h \
+ gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
+ globals.h
 screen.obj : screen.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
diff --git a/src/Makefile b/src/Makefile
index 9bdba1f..46b865e 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -1636,6 +1636,7 @@
 	pty.c \
 	quickfix.c \
 	regexp.c \
+	scriptfile.c \
 	screen.c \
 	search.c \
 	session.c \
@@ -1761,6 +1762,7 @@
 	objects/pty.o \
 	objects/quickfix.o \
 	objects/regexp.o \
+	objects/scriptfile.o \
 	objects/screen.o \
 	objects/search.o \
 	objects/session.o \
@@ -1911,6 +1913,7 @@
 	pty.pro \
 	quickfix.pro \
 	regexp.pro \
+	scriptfile.pro \
 	screen.pro \
 	search.pro \
 	session.pro \
@@ -3277,6 +3280,9 @@
 objects/regexp.o: regexp.c regexp_nfa.c
 	$(CCC) -o $@ regexp.c
 
+objects/scriptfile.o: scriptfile.c
+	$(CCC) -o $@ scriptfile.c
+
 objects/screen.o: screen.c
 	$(CCC) -o $@ screen.c
 
@@ -3724,6 +3730,10 @@
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
  proto.h globals.h regexp_nfa.c
+objects/scriptfile.o: scriptfile.c vim.h protodef.h auto/config.h feature.h os_unix.h \
+ auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
+ proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
+ proto.h globals.h
 objects/screen.o: screen.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
diff --git a/src/README.md b/src/README.md
index 194f8d6..979cdea 100644
--- a/src/README.md
+++ b/src/README.md
@@ -55,6 +55,7 @@
 profiler.c	| vim script profiler
 quickfix.c	| quickfix commands (":make", ":cn")
 regexp.c	| pattern matching
+scriptfile.c	| runtime directory handling and sourcing scripts
 screen.c	| updating the windows
 search.c	| pattern searching
 session.c	| sessions and views
diff --git a/src/cmdexpand.c b/src/cmdexpand.c
index 209013b..b3f18c6 100644
--- a/src/cmdexpand.c
+++ b/src/cmdexpand.c
@@ -19,8 +19,6 @@
 static int	ExpandFromContext(expand_T *xp, char_u *, int *, char_u ***, int);
 static int	expand_showtail(expand_T *xp);
 static int	expand_shellcmd(char_u *filepat, int *num_file, char_u ***file, int flagsarg);
-static int	ExpandRTDir(char_u *pat, int flags, int *num_file, char_u ***file, char *dirname[]);
-static int	ExpandPackAddDir(char_u *pat, int *num_file, char_u ***file);
 #if defined(FEAT_EVAL)
 static int	ExpandUserDefined(expand_T *xp, regmatch_T *regmatch, int *num_file, char_u ***file);
 static int	ExpandUserList(expand_T *xp, int *num_file, char_u ***file);
@@ -2565,160 +2563,6 @@
 # endif
 
 /*
- * Expand color scheme, compiler or filetype names.
- * Search from 'runtimepath':
- *   'runtimepath'/{dirnames}/{pat}.vim
- * When "flags" has DIP_START: search also from 'start' of 'packpath':
- *   'packpath'/pack/ * /start/ * /{dirnames}/{pat}.vim
- * When "flags" has DIP_OPT: search also from 'opt' of 'packpath':
- *   'packpath'/pack/ * /opt/ * /{dirnames}/{pat}.vim
- * "dirnames" is an array with one or more directory names.
- */
-    static int
-ExpandRTDir(
-    char_u	*pat,
-    int		flags,
-    int		*num_file,
-    char_u	***file,
-    char	*dirnames[])
-{
-    char_u	*s;
-    char_u	*e;
-    char_u	*match;
-    garray_T	ga;
-    int		i;
-    int		pat_len;
-
-    *num_file = 0;
-    *file = NULL;
-    pat_len = (int)STRLEN(pat);
-    ga_init2(&ga, (int)sizeof(char *), 10);
-
-    for (i = 0; dirnames[i] != NULL; ++i)
-    {
-	s = alloc(STRLEN(dirnames[i]) + pat_len + 7);
-	if (s == NULL)
-	{
-	    ga_clear_strings(&ga);
-	    return FAIL;
-	}
-	sprintf((char *)s, "%s/%s*.vim", dirnames[i], pat);
-	globpath(p_rtp, s, &ga, 0);
-	vim_free(s);
-    }
-
-    if (flags & DIP_START) {
-	for (i = 0; dirnames[i] != NULL; ++i)
-	{
-	    s = alloc(STRLEN(dirnames[i]) + pat_len + 22);
-	    if (s == NULL)
-	    {
-		ga_clear_strings(&ga);
-		return FAIL;
-	    }
-	    sprintf((char *)s, "pack/*/start/*/%s/%s*.vim", dirnames[i], pat);
-	    globpath(p_pp, s, &ga, 0);
-	    vim_free(s);
-	}
-    }
-
-    if (flags & DIP_OPT) {
-	for (i = 0; dirnames[i] != NULL; ++i)
-	{
-	    s = alloc(STRLEN(dirnames[i]) + pat_len + 20);
-	    if (s == NULL)
-	    {
-		ga_clear_strings(&ga);
-		return FAIL;
-	    }
-	    sprintf((char *)s, "pack/*/opt/*/%s/%s*.vim", dirnames[i], pat);
-	    globpath(p_pp, s, &ga, 0);
-	    vim_free(s);
-	}
-    }
-
-    for (i = 0; i < ga.ga_len; ++i)
-    {
-	match = ((char_u **)ga.ga_data)[i];
-	s = match;
-	e = s + STRLEN(s);
-	if (e - 4 > s && STRNICMP(e - 4, ".vim", 4) == 0)
-	{
-	    e -= 4;
-	    for (s = e; s > match; MB_PTR_BACK(match, s))
-		if (s < match || vim_ispathsep(*s))
-		    break;
-	    ++s;
-	    *e = NUL;
-	    mch_memmove(match, s, e - s + 1);
-	}
-    }
-
-    if (ga.ga_len == 0)
-	return FAIL;
-
-    // Sort and remove duplicates which can happen when specifying multiple
-    // directories in dirnames.
-    remove_duplicates(&ga);
-
-    *file = ga.ga_data;
-    *num_file = ga.ga_len;
-    return OK;
-}
-
-/*
- * Expand loadplugin names:
- * 'packpath'/pack/ * /opt/{pat}
- */
-    static int
-ExpandPackAddDir(
-    char_u	*pat,
-    int		*num_file,
-    char_u	***file)
-{
-    char_u	*s;
-    char_u	*e;
-    char_u	*match;
-    garray_T	ga;
-    int		i;
-    int		pat_len;
-
-    *num_file = 0;
-    *file = NULL;
-    pat_len = (int)STRLEN(pat);
-    ga_init2(&ga, (int)sizeof(char *), 10);
-
-    s = alloc(pat_len + 26);
-    if (s == NULL)
-    {
-	ga_clear_strings(&ga);
-	return FAIL;
-    }
-    sprintf((char *)s, "pack/*/opt/%s*", pat);
-    globpath(p_pp, s, &ga, 0);
-    vim_free(s);
-
-    for (i = 0; i < ga.ga_len; ++i)
-    {
-	match = ((char_u **)ga.ga_data)[i];
-	s = gettail(match);
-	e = s + STRLEN(s);
-	mch_memmove(match, s, e - s + 1);
-    }
-
-    if (ga.ga_len == 0)
-	return FAIL;
-
-    // Sort and remove duplicates which can happen when specifying multiple
-    // directories in dirnames.
-    remove_duplicates(&ga);
-
-    *file = ga.ga_data;
-    *num_file = ga.ga_len;
-    return OK;
-}
-
-/*
  * Expand "file" for all comma-separated directories in "path".
  * Adds the matches to "ga".  Caller must init "ga".
  */
diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c
index 71b9d06..e2c87bd 100644
--- a/src/ex_cmds2.c
+++ b/src/ex_cmds2.c
@@ -14,8 +14,6 @@
 #include "vim.h"
 #include "version.h"
 
-static void	cmd_source(char_u *fname, exarg_T *eap);
-
 #if defined(FEAT_EVAL) || defined(PROTO)
 # if defined(FEAT_TIMERS) || defined(PROTO)
 static timer_T	*first_timer = NULL;
@@ -1163,608 +1161,6 @@
 }
 #endif
 
-/*
- * ":runtime [what] {name}"
- */
-    void
-ex_runtime(exarg_T *eap)
-{
-    char_u  *arg = eap->arg;
-    char_u  *p = skiptowhite(arg);
-    int	    len = (int)(p - arg);
-    int	    flags = eap->forceit ? DIP_ALL : 0;
-
-    if (STRNCMP(arg, "START", len) == 0)
-    {
-	flags += DIP_START + DIP_NORTP;
-	arg = skipwhite(arg + len);
-    }
-    else if (STRNCMP(arg, "OPT", len) == 0)
-    {
-	flags += DIP_OPT + DIP_NORTP;
-	arg = skipwhite(arg + len);
-    }
-    else if (STRNCMP(arg, "PACK", len) == 0)
-    {
-	flags += DIP_START + DIP_OPT + DIP_NORTP;
-	arg = skipwhite(arg + len);
-    }
-    else if (STRNCMP(arg, "ALL", len) == 0)
-    {
-	flags += DIP_START + DIP_OPT;
-	arg = skipwhite(arg + len);
-    }
-
-    source_runtime(arg, flags);
-}
-
-    static void
-source_callback(char_u *fname, void *cookie UNUSED)
-{
-    (void)do_source(fname, FALSE, DOSO_NONE);
-}
-
-/*
- * Find the file "name" in all directories in "path" and invoke
- * "callback(fname, cookie)".
- * "name" can contain wildcards.
- * When "flags" has DIP_ALL: source all files, otherwise only the first one.
- * When "flags" has DIP_DIR: find directories instead of files.
- * When "flags" has DIP_ERR: give an error message if there is no match.
- *
- * return FAIL when no file could be sourced, OK otherwise.
- */
-    int
-do_in_path(
-    char_u	*path,
-    char_u	*name,
-    int		flags,
-    void	(*callback)(char_u *fname, void *ck),
-    void	*cookie)
-{
-    char_u	*rtp;
-    char_u	*np;
-    char_u	*buf;
-    char_u	*rtp_copy;
-    char_u	*tail;
-    int		num_files;
-    char_u	**files;
-    int		i;
-    int		did_one = FALSE;
-#ifdef AMIGA
-    struct Process	*proc = (struct Process *)FindTask(0L);
-    APTR		save_winptr = proc->pr_WindowPtr;
-
-    /* Avoid a requester here for a volume that doesn't exist. */
-    proc->pr_WindowPtr = (APTR)-1L;
-#endif
-
-    /* Make a copy of 'runtimepath'.  Invoking the callback may change the
-     * value. */
-    rtp_copy = vim_strsave(path);
-    buf = alloc(MAXPATHL);
-    if (buf != NULL && rtp_copy != NULL)
-    {
-	if (p_verbose > 1 && name != NULL)
-	{
-	    verbose_enter();
-	    smsg(_("Searching for \"%s\" in \"%s\""),
-						 (char *)name, (char *)path);
-	    verbose_leave();
-	}
-
-	/* Loop over all entries in 'runtimepath'. */
-	rtp = rtp_copy;
-	while (*rtp != NUL && ((flags & DIP_ALL) || !did_one))
-	{
-	    size_t buflen;
-
-	    /* Copy the path from 'runtimepath' to buf[]. */
-	    copy_option_part(&rtp, buf, MAXPATHL, ",");
-	    buflen = STRLEN(buf);
-
-	    /* Skip after or non-after directories. */
-	    if (flags & (DIP_NOAFTER | DIP_AFTER))
-	    {
-		int is_after = buflen >= 5
-				     && STRCMP(buf + buflen - 5, "after") == 0;
-
-		if ((is_after && (flags & DIP_NOAFTER))
-			|| (!is_after && (flags & DIP_AFTER)))
-		    continue;
-	    }
-
-	    if (name == NULL)
-	    {
-		(*callback)(buf, (void *) &cookie);
-		if (!did_one)
-		    did_one = (cookie == NULL);
-	    }
-	    else if (buflen + STRLEN(name) + 2 < MAXPATHL)
-	    {
-		add_pathsep(buf);
-		tail = buf + STRLEN(buf);
-
-		/* Loop over all patterns in "name" */
-		np = name;
-		while (*np != NUL && ((flags & DIP_ALL) || !did_one))
-		{
-		    /* Append the pattern from "name" to buf[]. */
-		    copy_option_part(&np, tail, (int)(MAXPATHL - (tail - buf)),
-								       "\t ");
-
-		    if (p_verbose > 2)
-		    {
-			verbose_enter();
-			smsg(_("Searching for \"%s\""), buf);
-			verbose_leave();
-		    }
-
-		    /* Expand wildcards, invoke the callback for each match. */
-		    if (gen_expand_wildcards(1, &buf, &num_files, &files,
-				  (flags & DIP_DIR) ? EW_DIR : EW_FILE) == OK)
-		    {
-			for (i = 0; i < num_files; ++i)
-			{
-			    (*callback)(files[i], cookie);
-			    did_one = TRUE;
-			    if (!(flags & DIP_ALL))
-				break;
-			}
-			FreeWild(num_files, files);
-		    }
-		}
-	    }
-	}
-    }
-    vim_free(buf);
-    vim_free(rtp_copy);
-    if (!did_one && name != NULL)
-    {
-	char *basepath = path == p_rtp ? "runtimepath" : "packpath";
-
-	if (flags & DIP_ERR)
-	    semsg(_(e_dirnotf), basepath, name);
-	else if (p_verbose > 0)
-	{
-	    verbose_enter();
-	    smsg(_("not found in '%s': \"%s\""), basepath, name);
-	    verbose_leave();
-	}
-    }
-
-#ifdef AMIGA
-    proc->pr_WindowPtr = save_winptr;
-#endif
-
-    return did_one ? OK : FAIL;
-}
-
-/*
- * Find "name" in "path".  When found, invoke the callback function for
- * it: callback(fname, "cookie")
- * When "flags" has DIP_ALL repeat for all matches, otherwise only the first
- * one is used.
- * Returns OK when at least one match found, FAIL otherwise.
- *
- * If "name" is NULL calls callback for each entry in "path". Cookie is
- * passed by reference in this case, setting it to NULL indicates that callback
- * has done its job.
- */
-    static int
-do_in_path_and_pp(
-    char_u	*path,
-    char_u	*name,
-    int		flags,
-    void	(*callback)(char_u *fname, void *ck),
-    void	*cookie)
-{
-    int		done = FAIL;
-    char_u	*s;
-    int		len;
-    char	*start_dir = "pack/*/start/*/%s";
-    char	*opt_dir = "pack/*/opt/*/%s";
-
-    if ((flags & DIP_NORTP) == 0)
-	done = do_in_path(path, name, flags, callback, cookie);
-
-    if ((done == FAIL || (flags & DIP_ALL)) && (flags & DIP_START))
-    {
-	len = (int)(STRLEN(start_dir) + STRLEN(name));
-	s = alloc(len);
-	if (s == NULL)
-	    return FAIL;
-	vim_snprintf((char *)s, len, start_dir, name);
-	done = do_in_path(p_pp, s, flags, callback, cookie);
-	vim_free(s);
-    }
-
-    if ((done == FAIL || (flags & DIP_ALL)) && (flags & DIP_OPT))
-    {
-	len = (int)(STRLEN(opt_dir) + STRLEN(name));
-	s = alloc(len);
-	if (s == NULL)
-	    return FAIL;
-	vim_snprintf((char *)s, len, opt_dir, name);
-	done = do_in_path(p_pp, s, flags, callback, cookie);
-	vim_free(s);
-    }
-
-    return done;
-}
-
-/*
- * Just like do_in_path_and_pp(), using 'runtimepath' for "path".
- */
-    int
-do_in_runtimepath(
-    char_u	*name,
-    int		flags,
-    void	(*callback)(char_u *fname, void *ck),
-    void	*cookie)
-{
-    return do_in_path_and_pp(p_rtp, name, flags, callback, cookie);
-}
-
-/*
- * Source the file "name" from all directories in 'runtimepath'.
- * "name" can contain wildcards.
- * When "flags" has DIP_ALL: source all files, otherwise only the first one.
- *
- * return FAIL when no file could be sourced, OK otherwise.
- */
-    int
-source_runtime(char_u *name, int flags)
-{
-    return source_in_path(p_rtp, name, flags);
-}
-
-/*
- * Just like source_runtime(), but use "path" instead of 'runtimepath'.
- */
-    int
-source_in_path(char_u *path, char_u *name, int flags)
-{
-    return do_in_path_and_pp(path, name, flags, source_callback, NULL);
-}
-
-
-#if defined(FEAT_EVAL) || defined(PROTO)
-
-/*
- * Expand wildcards in "pat" and invoke do_source() for each match.
- */
-    static void
-source_all_matches(char_u *pat)
-{
-    int	    num_files;
-    char_u  **files;
-    int	    i;
-
-    if (gen_expand_wildcards(1, &pat, &num_files, &files, EW_FILE) == OK)
-    {
-	for (i = 0; i < num_files; ++i)
-	    (void)do_source(files[i], FALSE, DOSO_NONE);
-	FreeWild(num_files, files);
-    }
-}
-
-/*
- * Add the package directory to 'runtimepath'.
- */
-    static int
-add_pack_dir_to_rtp(char_u *fname)
-{
-    char_u  *p4, *p3, *p2, *p1, *p;
-    char_u  *entry;
-    char_u  *insp = NULL;
-    int	    c;
-    char_u  *new_rtp;
-    int	    keep;
-    size_t  oldlen;
-    size_t  addlen;
-    size_t  new_rtp_len;
-    char_u  *afterdir = NULL;
-    size_t  afterlen = 0;
-    char_u  *after_insp = NULL;
-    char_u  *ffname = NULL;
-    size_t  fname_len;
-    char_u  *buf = NULL;
-    char_u  *rtp_ffname;
-    int	    match;
-    int	    retval = FAIL;
-
-    p4 = p3 = p2 = p1 = get_past_head(fname);
-    for (p = p1; *p; MB_PTR_ADV(p))
-	if (vim_ispathsep_nocolon(*p))
-	{
-	    p4 = p3; p3 = p2; p2 = p1; p1 = p;
-	}
-
-    /* now we have:
-     * rtp/pack/name/start/name
-     *    p4   p3   p2    p1
-     *
-     * find the part up to "pack" in 'runtimepath' */
-    c = *++p4; /* append pathsep in order to expand symlink */
-    *p4 = NUL;
-    ffname = fix_fname(fname);
-    *p4 = c;
-    if (ffname == NULL)
-	return FAIL;
-
-    // Find "ffname" in "p_rtp", ignoring '/' vs '\' differences.
-    // Also stop at the first "after" directory.
-    fname_len = STRLEN(ffname);
-    buf = alloc(MAXPATHL);
-    if (buf == NULL)
-	goto theend;
-    for (entry = p_rtp; *entry != NUL; )
-    {
-	char_u *cur_entry = entry;
-
-	copy_option_part(&entry, buf, MAXPATHL, ",");
-	if (insp == NULL)
-	{
-	    add_pathsep(buf);
-	    rtp_ffname = fix_fname(buf);
-	    if (rtp_ffname == NULL)
-		goto theend;
-	    match = vim_fnamencmp(rtp_ffname, ffname, fname_len) == 0;
-	    vim_free(rtp_ffname);
-	    if (match)
-		// Insert "ffname" after this entry (and comma).
-		insp = entry;
-	}
-
-	if ((p = (char_u *)strstr((char *)buf, "after")) != NULL
-		&& p > buf
-		&& vim_ispathsep(p[-1])
-		&& (vim_ispathsep(p[5]) || p[5] == NUL || p[5] == ','))
-	{
-	    if (insp == NULL)
-		// Did not find "ffname" before the first "after" directory,
-		// insert it before this entry.
-		insp = cur_entry;
-	    after_insp = cur_entry;
-	    break;
-	}
-    }
-
-    if (insp == NULL)
-	// Both "fname" and "after" not found, append at the end.
-	insp = p_rtp + STRLEN(p_rtp);
-
-    // check if rtp/pack/name/start/name/after exists
-    afterdir = concat_fnames(fname, (char_u *)"after", TRUE);
-    if (afterdir != NULL && mch_isdir(afterdir))
-	afterlen = STRLEN(afterdir) + 1; // add one for comma
-
-    oldlen = STRLEN(p_rtp);
-    addlen = STRLEN(fname) + 1; // add one for comma
-    new_rtp = alloc(oldlen + addlen + afterlen + 1); // add one for NUL
-    if (new_rtp == NULL)
-	goto theend;
-
-    // We now have 'rtp' parts: {keep}{keep_after}{rest}.
-    // Create new_rtp, first: {keep},{fname}
-    keep = (int)(insp - p_rtp);
-    mch_memmove(new_rtp, p_rtp, keep);
-    new_rtp_len = keep;
-    if (*insp == NUL)
-	new_rtp[new_rtp_len++] = ',';  // add comma before
-    mch_memmove(new_rtp + new_rtp_len, fname, addlen - 1);
-    new_rtp_len += addlen - 1;
-    if (*insp != NUL)
-	new_rtp[new_rtp_len++] = ',';  // add comma after
-
-    if (afterlen > 0 && after_insp != NULL)
-    {
-	int keep_after = (int)(after_insp - p_rtp);
-
-	// Add to new_rtp: {keep},{fname}{keep_after},{afterdir}
-	mch_memmove(new_rtp + new_rtp_len, p_rtp + keep,
-							keep_after - keep);
-	new_rtp_len += keep_after - keep;
-	mch_memmove(new_rtp + new_rtp_len, afterdir, afterlen - 1);
-	new_rtp_len += afterlen - 1;
-	new_rtp[new_rtp_len++] = ',';
-	keep = keep_after;
-    }
-
-    if (p_rtp[keep] != NUL)
-	// Append rest: {keep},{fname}{keep_after},{afterdir}{rest}
-	mch_memmove(new_rtp + new_rtp_len, p_rtp + keep, oldlen - keep + 1);
-    else
-	new_rtp[new_rtp_len] = NUL;
-
-    if (afterlen > 0 && after_insp == NULL)
-    {
-	// Append afterdir when "after" was not found:
-	// {keep},{fname}{rest},{afterdir}
-	STRCAT(new_rtp, ",");
-	STRCAT(new_rtp, afterdir);
-    }
-
-    set_option_value((char_u *)"rtp", 0L, new_rtp, 0);
-    vim_free(new_rtp);
-    retval = OK;
-
-theend:
-    vim_free(buf);
-    vim_free(ffname);
-    vim_free(afterdir);
-    return retval;
-}
-
-/*
- * Load scripts in "plugin" and "ftdetect" directories of the package.
- */
-    static int
-load_pack_plugin(char_u *fname)
-{
-    static char *plugpat = "%s/plugin/**/*.vim";
-    static char *ftpat = "%s/ftdetect/*.vim";
-    int		len;
-    char_u	*ffname = fix_fname(fname);
-    char_u	*pat = NULL;
-    int		retval = FAIL;
-
-    if (ffname == NULL)
-	return FAIL;
-    len = (int)STRLEN(ffname) + (int)STRLEN(ftpat);
-    pat = alloc(len);
-    if (pat == NULL)
-	goto theend;
-    vim_snprintf((char *)pat, len, plugpat, ffname);
-    source_all_matches(pat);
-
-    {
-	char_u *cmd = vim_strsave((char_u *)"g:did_load_filetypes");
-
-	/* If runtime/filetype.vim wasn't loaded yet, the scripts will be
-	 * found when it loads. */
-	if (cmd != NULL && eval_to_number(cmd) > 0)
-	{
-	    do_cmdline_cmd((char_u *)"augroup filetypedetect");
-	    vim_snprintf((char *)pat, len, ftpat, ffname);
-	    source_all_matches(pat);
-	    do_cmdline_cmd((char_u *)"augroup END");
-	}
-	vim_free(cmd);
-    }
-    vim_free(pat);
-    retval = OK;
-
-theend:
-    vim_free(ffname);
-    return retval;
-}
-
-/* used for "cookie" of add_pack_plugin() */
-static int APP_ADD_DIR;
-static int APP_LOAD;
-static int APP_BOTH;
-
-    static void
-add_pack_plugin(char_u *fname, void *cookie)
-{
-    if (cookie != &APP_LOAD)
-    {
-	char_u	*buf = alloc(MAXPATHL);
-	char_u	*p;
-	int	found = FALSE;
-
-	if (buf == NULL)
-	    return;
-	p = p_rtp;
-	while (*p != NUL)
-	{
-	    copy_option_part(&p, buf, MAXPATHL, ",");
-	    if (pathcmp((char *)buf, (char *)fname, -1) == 0)
-	    {
-		found = TRUE;
-		break;
-	    }
-	}
-	vim_free(buf);
-	if (!found)
-	    /* directory is not yet in 'runtimepath', add it */
-	    if (add_pack_dir_to_rtp(fname) == FAIL)
-		return;
-    }
-
-    if (cookie != &APP_ADD_DIR)
-	load_pack_plugin(fname);
-}
-
-/*
- * Add all packages in the "start" directory to 'runtimepath'.
- */
-    void
-add_pack_start_dirs(void)
-{
-    do_in_path(p_pp, (char_u *)"pack/*/start/*", DIP_ALL + DIP_DIR,
-					       add_pack_plugin, &APP_ADD_DIR);
-}
-
-/*
- * Load plugins from all packages in the "start" directory.
- */
-    void
-load_start_packages(void)
-{
-    did_source_packages = TRUE;
-    do_in_path(p_pp, (char_u *)"pack/*/start/*", DIP_ALL + DIP_DIR,
-						  add_pack_plugin, &APP_LOAD);
-}
-
-/*
- * ":packloadall"
- * Find plugins in the package directories and source them.
- */
-    void
-ex_packloadall(exarg_T *eap)
-{
-    if (!did_source_packages || eap->forceit)
-    {
-	/* First do a round to add all directories to 'runtimepath', then load
-	 * the plugins. This allows for plugins to use an autoload directory
-	 * of another plugin. */
-	add_pack_start_dirs();
-	load_start_packages();
-    }
-}
-
-/*
- * ":packadd[!] {name}"
- */
-    void
-ex_packadd(exarg_T *eap)
-{
-    static char *plugpat = "pack/*/%s/%s";
-    int		len;
-    char	*pat;
-    int		round;
-    int		res = OK;
-
-    /* Round 1: use "start", round 2: use "opt". */
-    for (round = 1; round <= 2; ++round)
-    {
-	/* Only look under "start" when loading packages wasn't done yet. */
-	if (round == 1 && did_source_packages)
-	    continue;
-
-	len = (int)STRLEN(plugpat) + (int)STRLEN(eap->arg) + 5;
-	pat = alloc(len);
-	if (pat == NULL)
-	    return;
-	vim_snprintf(pat, len, plugpat, round == 1 ? "start" : "opt", eap->arg);
-	/* The first round don't give a "not found" error, in the second round
-	 * only when nothing was found in the first round. */
-	res = do_in_path(p_pp, (char_u *)pat,
-		DIP_ALL + DIP_DIR + (round == 2 && res == FAIL ? DIP_ERR : 0),
-		add_pack_plugin, eap->forceit ? &APP_ADD_DIR : &APP_BOTH);
-	vim_free(pat);
-    }
-}
-#endif
-
-#if defined(FEAT_EVAL) || defined(PROTO)
-/*
- * ":options"
- */
-    void
-ex_options(
-    exarg_T	*eap UNUSED)
-{
-    vim_setenv((char_u *)"OPTWIN_CMD",
-	    (char_u *)(cmdmod.tab ? "tab"
-		: (cmdmod.split & WSP_VERT) ? "vert" : ""));
-    cmd_source((char_u *)SYS_OPTWIN_FILE, NULL);
-}
-#endif
-
 #if defined(FEAT_PYTHON3) || defined(FEAT_PYTHON) || defined(PROTO)
 
 # if (defined(FEAT_PYTHON) && defined(FEAT_PYTHON3)) || defined(PROTO)
@@ -1954,952 +1350,6 @@
 #endif
 
 /*
- * ":source {fname}"
- */
-    void
-ex_source(exarg_T *eap)
-{
-#ifdef FEAT_BROWSE
-    if (cmdmod.browse)
-    {
-	char_u *fname = NULL;
-
-	fname = do_browse(0, (char_u *)_("Source Vim script"), eap->arg,
-				      NULL, NULL,
-				      (char_u *)_(BROWSE_FILTER_MACROS), NULL);
-	if (fname != NULL)
-	{
-	    cmd_source(fname, eap);
-	    vim_free(fname);
-	}
-    }
-    else
-#endif
-	cmd_source(eap->arg, eap);
-}
-
-    static void
-cmd_source(char_u *fname, exarg_T *eap)
-{
-    if (*fname == NUL)
-	emsg(_(e_argreq));
-
-    else if (eap != NULL && eap->forceit)
-	/* ":source!": read Normal mode commands
-	 * Need to execute the commands directly.  This is required at least
-	 * for:
-	 * - ":g" command busy
-	 * - after ":argdo", ":windo" or ":bufdo"
-	 * - another command follows
-	 * - inside a loop
-	 */
-	openscript(fname, global_busy || listcmd_busy || eap->nextcmd != NULL
-#ifdef FEAT_EVAL
-						 || eap->cstack->cs_idx >= 0
-#endif
-						 );
-
-    /* ":source" read ex commands */
-    else if (do_source(fname, FALSE, DOSO_NONE) == FAIL)
-	semsg(_(e_notopen), fname);
-}
-
-/*
- * ":source" and associated commands.
- */
-/*
- * Structure used to store info for each sourced file.
- * It is shared between do_source() and getsourceline().
- * This is required, because it needs to be handed to do_cmdline() and
- * sourcing can be done recursively.
- */
-struct source_cookie
-{
-    FILE	*fp;		// opened file for sourcing
-    char_u	*nextline;	// if not NULL: line that was read ahead
-    linenr_T	sourcing_lnum;	// line number of the source file
-    int		finished;	// ":finish" used
-#ifdef USE_CRNL
-    int		fileformat;	// EOL_UNKNOWN, EOL_UNIX or EOL_DOS
-    int		error;		// TRUE if LF found after CR-LF
-#endif
-#ifdef FEAT_EVAL
-    linenr_T	breakpoint;	// next line with breakpoint or zero
-    char_u	*fname;		// name of sourced file
-    int		dbg_tick;	// debug_tick when breakpoint was set
-    int		level;		// top nesting level of sourced file
-#endif
-    vimconv_T	conv;		// type of conversion
-};
-
-#ifdef FEAT_EVAL
-/*
- * Return the address holding the next breakpoint line for a source cookie.
- */
-    linenr_T *
-source_breakpoint(void *cookie)
-{
-    return &((struct source_cookie *)cookie)->breakpoint;
-}
-
-/*
- * Return the address holding the debug tick for a source cookie.
- */
-    int *
-source_dbg_tick(void *cookie)
-{
-    return &((struct source_cookie *)cookie)->dbg_tick;
-}
-
-/*
- * Return the nesting level for a source cookie.
- */
-    int
-source_level(void *cookie)
-{
-    return ((struct source_cookie *)cookie)->level;
-}
-#endif
-
-static char_u *get_one_sourceline(struct source_cookie *sp);
-
-#if (defined(MSWIN) && defined(FEAT_CSCOPE)) || defined(HAVE_FD_CLOEXEC)
-# define USE_FOPEN_NOINH
-/*
- * Special function to open a file without handle inheritance.
- * When possible the handle is closed on exec().
- */
-    static FILE *
-fopen_noinh_readbin(char *filename)
-{
-# ifdef MSWIN
-    int	fd_tmp = mch_open(filename, O_RDONLY | O_BINARY | O_NOINHERIT, 0);
-# else
-    int	fd_tmp = mch_open(filename, O_RDONLY, 0);
-# endif
-
-    if (fd_tmp == -1)
-	return NULL;
-
-# ifdef HAVE_FD_CLOEXEC
-    {
-	int fdflags = fcntl(fd_tmp, F_GETFD);
-	if (fdflags >= 0 && (fdflags & FD_CLOEXEC) == 0)
-	    (void)fcntl(fd_tmp, F_SETFD, fdflags | FD_CLOEXEC);
-    }
-# endif
-
-    return fdopen(fd_tmp, READBIN);
-}
-#endif
-
-/*
- * do_source: Read the file "fname" and execute its lines as EX commands.
- *
- * This function may be called recursively!
- *
- * return FAIL if file could not be opened, OK otherwise
- */
-    int
-do_source(
-    char_u	*fname,
-    int		check_other,	    /* check for .vimrc and _vimrc */
-    int		is_vimrc)	    /* DOSO_ value */
-{
-    struct source_cookie    cookie;
-    char_u		    *save_sourcing_name;
-    linenr_T		    save_sourcing_lnum;
-    char_u		    *p;
-    char_u		    *fname_exp;
-    char_u		    *firstline = NULL;
-    int			    retval = FAIL;
-#ifdef FEAT_EVAL
-    sctx_T		    save_current_sctx;
-    static scid_T	    last_current_SID = 0;
-    static int		    last_current_SID_seq = 0;
-    funccal_entry_T	    funccalp_entry;
-    int			    save_debug_break_level = debug_break_level;
-    scriptitem_T	    *si = NULL;
-# ifdef UNIX
-    stat_T		    st;
-    int			    stat_ok;
-# endif
-#endif
-#ifdef STARTUPTIME
-    struct timeval	    tv_rel;
-    struct timeval	    tv_start;
-#endif
-#ifdef FEAT_PROFILE
-    proftime_T		    wait_start;
-#endif
-    int			    trigger_source_post = FALSE;
-
-    p = expand_env_save(fname);
-    if (p == NULL)
-	return retval;
-    fname_exp = fix_fname(p);
-    vim_free(p);
-    if (fname_exp == NULL)
-	return retval;
-    if (mch_isdir(fname_exp))
-    {
-	smsg(_("Cannot source a directory: \"%s\""), fname);
-	goto theend;
-    }
-
-    /* Apply SourceCmd autocommands, they should get the file and source it. */
-    if (has_autocmd(EVENT_SOURCECMD, fname_exp, NULL)
-	    && apply_autocmds(EVENT_SOURCECMD, fname_exp, fname_exp,
-							       FALSE, curbuf))
-    {
-#ifdef FEAT_EVAL
-	retval = aborting() ? FAIL : OK;
-#else
-	retval = OK;
-#endif
-	if (retval == OK)
-	    // Apply SourcePost autocommands.
-	    apply_autocmds(EVENT_SOURCEPOST, fname_exp, fname_exp,
-								FALSE, curbuf);
-	goto theend;
-    }
-
-    /* Apply SourcePre autocommands, they may get the file. */
-    apply_autocmds(EVENT_SOURCEPRE, fname_exp, fname_exp, FALSE, curbuf);
-
-#ifdef USE_FOPEN_NOINH
-    cookie.fp = fopen_noinh_readbin((char *)fname_exp);
-#else
-    cookie.fp = mch_fopen((char *)fname_exp, READBIN);
-#endif
-    if (cookie.fp == NULL && check_other)
-    {
-	/*
-	 * Try again, replacing file name ".vimrc" by "_vimrc" or vice versa,
-	 * and ".exrc" by "_exrc" or vice versa.
-	 */
-	p = gettail(fname_exp);
-	if ((*p == '.' || *p == '_')
-		&& (STRICMP(p + 1, "vimrc") == 0
-		    || STRICMP(p + 1, "gvimrc") == 0
-		    || STRICMP(p + 1, "exrc") == 0))
-	{
-	    if (*p == '_')
-		*p = '.';
-	    else
-		*p = '_';
-#ifdef USE_FOPEN_NOINH
-	    cookie.fp = fopen_noinh_readbin((char *)fname_exp);
-#else
-	    cookie.fp = mch_fopen((char *)fname_exp, READBIN);
-#endif
-	}
-    }
-
-    if (cookie.fp == NULL)
-    {
-	if (p_verbose > 0)
-	{
-	    verbose_enter();
-	    if (sourcing_name == NULL)
-		smsg(_("could not source \"%s\""), fname);
-	    else
-		smsg(_("line %ld: could not source \"%s\""),
-							sourcing_lnum, fname);
-	    verbose_leave();
-	}
-	goto theend;
-    }
-
-    /*
-     * The file exists.
-     * - In verbose mode, give a message.
-     * - For a vimrc file, may want to set 'compatible', call vimrc_found().
-     */
-    if (p_verbose > 1)
-    {
-	verbose_enter();
-	if (sourcing_name == NULL)
-	    smsg(_("sourcing \"%s\""), fname);
-	else
-	    smsg(_("line %ld: sourcing \"%s\""),
-							sourcing_lnum, fname);
-	verbose_leave();
-    }
-    if (is_vimrc == DOSO_VIMRC)
-	vimrc_found(fname_exp, (char_u *)"MYVIMRC");
-    else if (is_vimrc == DOSO_GVIMRC)
-	vimrc_found(fname_exp, (char_u *)"MYGVIMRC");
-
-#ifdef USE_CRNL
-    /* If no automatic file format: Set default to CR-NL. */
-    if (*p_ffs == NUL)
-	cookie.fileformat = EOL_DOS;
-    else
-	cookie.fileformat = EOL_UNKNOWN;
-    cookie.error = FALSE;
-#endif
-
-    cookie.nextline = NULL;
-    cookie.sourcing_lnum = 0;
-    cookie.finished = FALSE;
-
-#ifdef FEAT_EVAL
-    /*
-     * Check if this script has a breakpoint.
-     */
-    cookie.breakpoint = dbg_find_breakpoint(TRUE, fname_exp, (linenr_T)0);
-    cookie.fname = fname_exp;
-    cookie.dbg_tick = debug_tick;
-
-    cookie.level = ex_nesting_level;
-#endif
-
-    /*
-     * Keep the sourcing name/lnum, for recursive calls.
-     */
-    save_sourcing_name = sourcing_name;
-    sourcing_name = fname_exp;
-    save_sourcing_lnum = sourcing_lnum;
-    sourcing_lnum = 0;
-
-#ifdef STARTUPTIME
-    if (time_fd != NULL)
-	time_push(&tv_rel, &tv_start);
-#endif
-
-#ifdef FEAT_EVAL
-# ifdef FEAT_PROFILE
-    if (do_profiling == PROF_YES)
-	prof_child_enter(&wait_start);		/* entering a child now */
-# endif
-
-    /* Don't use local function variables, if called from a function.
-     * Also starts profiling timer for nested script. */
-    save_funccal(&funccalp_entry);
-
-    save_current_sctx = current_sctx;
-    current_sctx.sc_lnum = 0;
-    current_sctx.sc_version = 1;
-
-    // Check if this script was sourced before to finds its SID.
-    // If it's new, generate a new SID.
-    // Always use a new sequence number.
-    current_sctx.sc_seq = ++last_current_SID_seq;
-# ifdef UNIX
-    stat_ok = (mch_stat((char *)fname_exp, &st) >= 0);
-# endif
-    for (current_sctx.sc_sid = script_items.ga_len; current_sctx.sc_sid > 0;
-							 --current_sctx.sc_sid)
-    {
-	si = &SCRIPT_ITEM(current_sctx.sc_sid);
-	if (si->sn_name != NULL
-		&& (
-# ifdef UNIX
-		    /* Compare dev/ino when possible, it catches symbolic
-		     * links.  Also compare file names, the inode may change
-		     * when the file was edited. */
-		    ((stat_ok && si->sn_dev_valid)
-			&& (si->sn_dev == st.st_dev
-			    && si->sn_ino == st.st_ino)) ||
-# endif
-		fnamecmp(si->sn_name, fname_exp) == 0))
-	    break;
-    }
-    if (current_sctx.sc_sid == 0)
-    {
-	current_sctx.sc_sid = ++last_current_SID;
-	if (ga_grow(&script_items,
-		     (int)(current_sctx.sc_sid - script_items.ga_len)) == FAIL)
-	    goto almosttheend;
-	while (script_items.ga_len < current_sctx.sc_sid)
-	{
-	    ++script_items.ga_len;
-	    SCRIPT_ITEM(script_items.ga_len).sn_name = NULL;
-# ifdef FEAT_PROFILE
-	    SCRIPT_ITEM(script_items.ga_len).sn_prof_on = FALSE;
-# endif
-	}
-	si = &SCRIPT_ITEM(current_sctx.sc_sid);
-	si->sn_name = fname_exp;
-	fname_exp = vim_strsave(si->sn_name);  // used for autocmd
-# ifdef UNIX
-	if (stat_ok)
-	{
-	    si->sn_dev_valid = TRUE;
-	    si->sn_dev = st.st_dev;
-	    si->sn_ino = st.st_ino;
-	}
-	else
-	    si->sn_dev_valid = FALSE;
-# endif
-
-	/* Allocate the local script variables to use for this script. */
-	new_script_vars(current_sctx.sc_sid);
-    }
-
-# ifdef FEAT_PROFILE
-    if (do_profiling == PROF_YES)
-    {
-	int	forceit;
-
-	/* Check if we do profiling for this script. */
-	if (!si->sn_prof_on && has_profiling(TRUE, si->sn_name, &forceit))
-	{
-	    script_do_profile(si);
-	    si->sn_pr_force = forceit;
-	}
-	if (si->sn_prof_on)
-	{
-	    ++si->sn_pr_count;
-	    profile_start(&si->sn_pr_start);
-	    profile_zero(&si->sn_pr_children);
-	}
-    }
-# endif
-#endif
-
-    cookie.conv.vc_type = CONV_NONE;		/* no conversion */
-
-    /* Read the first line so we can check for a UTF-8 BOM. */
-    firstline = getsourceline(0, (void *)&cookie, 0, TRUE);
-    if (firstline != NULL && STRLEN(firstline) >= 3 && firstline[0] == 0xef
-			      && firstline[1] == 0xbb && firstline[2] == 0xbf)
-    {
-	/* Found BOM; setup conversion, skip over BOM and recode the line. */
-	convert_setup(&cookie.conv, (char_u *)"utf-8", p_enc);
-	p = string_convert(&cookie.conv, firstline + 3, NULL);
-	if (p == NULL)
-	    p = vim_strsave(firstline + 3);
-	if (p != NULL)
-	{
-	    vim_free(firstline);
-	    firstline = p;
-	}
-    }
-
-    /*
-     * Call do_cmdline, which will call getsourceline() to get the lines.
-     */
-    do_cmdline(firstline, getsourceline, (void *)&cookie,
-				     DOCMD_VERBOSE|DOCMD_NOWAIT|DOCMD_REPEAT);
-    retval = OK;
-
-#ifdef FEAT_PROFILE
-    if (do_profiling == PROF_YES)
-    {
-	/* Get "si" again, "script_items" may have been reallocated. */
-	si = &SCRIPT_ITEM(current_sctx.sc_sid);
-	if (si->sn_prof_on)
-	{
-	    profile_end(&si->sn_pr_start);
-	    profile_sub_wait(&wait_start, &si->sn_pr_start);
-	    profile_add(&si->sn_pr_total, &si->sn_pr_start);
-	    profile_self(&si->sn_pr_self, &si->sn_pr_start,
-							 &si->sn_pr_children);
-	}
-    }
-#endif
-
-    if (got_int)
-	emsg(_(e_interr));
-    sourcing_name = save_sourcing_name;
-    sourcing_lnum = save_sourcing_lnum;
-    if (p_verbose > 1)
-    {
-	verbose_enter();
-	smsg(_("finished sourcing %s"), fname);
-	if (sourcing_name != NULL)
-	    smsg(_("continuing in %s"), sourcing_name);
-	verbose_leave();
-    }
-#ifdef STARTUPTIME
-    if (time_fd != NULL)
-    {
-	vim_snprintf((char *)IObuff, IOSIZE, "sourcing %s", fname);
-	time_msg((char *)IObuff, &tv_start);
-	time_pop(&tv_rel);
-    }
-#endif
-
-    if (!got_int)
-	trigger_source_post = TRUE;
-
-#ifdef FEAT_EVAL
-    /*
-     * After a "finish" in debug mode, need to break at first command of next
-     * sourced file.
-     */
-    if (save_debug_break_level > ex_nesting_level
-	    && debug_break_level == ex_nesting_level)
-	++debug_break_level;
-#endif
-
-#ifdef FEAT_EVAL
-almosttheend:
-    current_sctx = save_current_sctx;
-    restore_funccal();
-# ifdef FEAT_PROFILE
-    if (do_profiling == PROF_YES)
-	prof_child_exit(&wait_start);		/* leaving a child now */
-# endif
-#endif
-    fclose(cookie.fp);
-    vim_free(cookie.nextline);
-    vim_free(firstline);
-    convert_setup(&cookie.conv, NULL, NULL);
-
-    if (trigger_source_post)
-	apply_autocmds(EVENT_SOURCEPOST, fname_exp, fname_exp, FALSE, curbuf);
-
-theend:
-    vim_free(fname_exp);
-    return retval;
-}
-
-#if defined(FEAT_EVAL) || defined(PROTO)
-
-/*
- * ":scriptnames"
- */
-    void
-ex_scriptnames(exarg_T *eap)
-{
-    int i;
-
-    if (eap->addr_count > 0)
-    {
-	// :script {scriptId}: edit the script
-	if (eap->line2 < 1 || eap->line2 > script_items.ga_len)
-	    emsg(_(e_invarg));
-	else
-	{
-	    eap->arg = SCRIPT_ITEM(eap->line2).sn_name;
-	    do_exedit(eap, NULL);
-	}
-	return;
-    }
-
-    for (i = 1; i <= script_items.ga_len && !got_int; ++i)
-	if (SCRIPT_ITEM(i).sn_name != NULL)
-	{
-	    home_replace(NULL, SCRIPT_ITEM(i).sn_name,
-						    NameBuff, MAXPATHL, TRUE);
-	    smsg("%3d: %s", i, NameBuff);
-	}
-}
-
-# if defined(BACKSLASH_IN_FILENAME) || defined(PROTO)
-/*
- * Fix slashes in the list of script names for 'shellslash'.
- */
-    void
-scriptnames_slash_adjust(void)
-{
-    int i;
-
-    for (i = 1; i <= script_items.ga_len; ++i)
-	if (SCRIPT_ITEM(i).sn_name != NULL)
-	    slash_adjust(SCRIPT_ITEM(i).sn_name);
-}
-# endif
-
-/*
- * Get a pointer to a script name.  Used for ":verbose set".
- */
-    char_u *
-get_scriptname(scid_T id)
-{
-    if (id == SID_MODELINE)
-	return (char_u *)_("modeline");
-    if (id == SID_CMDARG)
-	return (char_u *)_("--cmd argument");
-    if (id == SID_CARG)
-	return (char_u *)_("-c argument");
-    if (id == SID_ENV)
-	return (char_u *)_("environment variable");
-    if (id == SID_ERROR)
-	return (char_u *)_("error handler");
-    return SCRIPT_ITEM(id).sn_name;
-}
-
-# if defined(EXITFREE) || defined(PROTO)
-    void
-free_scriptnames(void)
-{
-    int			i;
-
-    for (i = script_items.ga_len; i > 0; --i)
-	vim_free(SCRIPT_ITEM(i).sn_name);
-    ga_clear(&script_items);
-}
-# endif
-
-#endif
-
-    linenr_T
-get_sourced_lnum(char_u *(*fgetline)(int, void *, int, int), void *cookie)
-{
-    return fgetline == getsourceline
-			? ((struct source_cookie *)cookie)->sourcing_lnum
-			: sourcing_lnum;
-}
-
-/*
- * Get one full line from a sourced file.
- * Called by do_cmdline() when it's called from do_source().
- *
- * Return a pointer to the line in allocated memory.
- * Return NULL for end-of-file or some error.
- */
-    char_u *
-getsourceline(int c UNUSED, void *cookie, int indent UNUSED, int do_concat)
-{
-    struct source_cookie *sp = (struct source_cookie *)cookie;
-    char_u		*line;
-    char_u		*p;
-
-#ifdef FEAT_EVAL
-    /* If breakpoints have been added/deleted need to check for it. */
-    if (sp->dbg_tick < debug_tick)
-    {
-	sp->breakpoint = dbg_find_breakpoint(TRUE, sp->fname, sourcing_lnum);
-	sp->dbg_tick = debug_tick;
-    }
-# ifdef FEAT_PROFILE
-    if (do_profiling == PROF_YES)
-	script_line_end();
-# endif
-#endif
-
-    // Set the current sourcing line number.
-    sourcing_lnum = sp->sourcing_lnum + 1;
-
-    /*
-     * Get current line.  If there is a read-ahead line, use it, otherwise get
-     * one now.
-     */
-    if (sp->finished)
-	line = NULL;
-    else if (sp->nextline == NULL)
-	line = get_one_sourceline(sp);
-    else
-    {
-	line = sp->nextline;
-	sp->nextline = NULL;
-	++sp->sourcing_lnum;
-    }
-#ifdef FEAT_PROFILE
-    if (line != NULL && do_profiling == PROF_YES)
-	script_line_start();
-#endif
-
-    /* Only concatenate lines starting with a \ when 'cpoptions' doesn't
-     * contain the 'C' flag. */
-    if (line != NULL && do_concat && vim_strchr(p_cpo, CPO_CONCAT) == NULL)
-    {
-	/* compensate for the one line read-ahead */
-	--sp->sourcing_lnum;
-
-	// Get the next line and concatenate it when it starts with a
-	// backslash. We always need to read the next line, keep it in
-	// sp->nextline.
-	/* Also check for a comment in between continuation lines: "\ */
-	sp->nextline = get_one_sourceline(sp);
-	if (sp->nextline != NULL
-		&& (*(p = skipwhite(sp->nextline)) == '\\'
-			      || (p[0] == '"' && p[1] == '\\' && p[2] == ' ')))
-	{
-	    garray_T    ga;
-
-	    ga_init2(&ga, (int)sizeof(char_u), 400);
-	    ga_concat(&ga, line);
-	    if (*p == '\\')
-		ga_concat(&ga, p + 1);
-	    for (;;)
-	    {
-		vim_free(sp->nextline);
-		sp->nextline = get_one_sourceline(sp);
-		if (sp->nextline == NULL)
-		    break;
-		p = skipwhite(sp->nextline);
-		if (*p == '\\')
-		{
-		    // Adjust the growsize to the current length to speed up
-		    // concatenating many lines.
-		    if (ga.ga_len > 400)
-		    {
-			if (ga.ga_len > 8000)
-			    ga.ga_growsize = 8000;
-			else
-			    ga.ga_growsize = ga.ga_len;
-		    }
-		    ga_concat(&ga, p + 1);
-		}
-		else if (p[0] != '"' || p[1] != '\\' || p[2] != ' ')
-		    break;
-	    }
-	    ga_append(&ga, NUL);
-	    vim_free(line);
-	    line = ga.ga_data;
-	}
-    }
-
-    if (line != NULL && sp->conv.vc_type != CONV_NONE)
-    {
-	char_u	*s;
-
-	/* Convert the encoding of the script line. */
-	s = string_convert(&sp->conv, line, NULL);
-	if (s != NULL)
-	{
-	    vim_free(line);
-	    line = s;
-	}
-    }
-
-#ifdef FEAT_EVAL
-    /* Did we encounter a breakpoint? */
-    if (sp->breakpoint != 0 && sp->breakpoint <= sourcing_lnum)
-    {
-	dbg_breakpoint(sp->fname, sourcing_lnum);
-	/* Find next breakpoint. */
-	sp->breakpoint = dbg_find_breakpoint(TRUE, sp->fname, sourcing_lnum);
-	sp->dbg_tick = debug_tick;
-    }
-#endif
-
-    return line;
-}
-
-    static char_u *
-get_one_sourceline(struct source_cookie *sp)
-{
-    garray_T		ga;
-    int			len;
-    int			c;
-    char_u		*buf;
-#ifdef USE_CRNL
-    int			has_cr;		/* CR-LF found */
-#endif
-    int			have_read = FALSE;
-
-    /* use a growarray to store the sourced line */
-    ga_init2(&ga, 1, 250);
-
-    /*
-     * Loop until there is a finished line (or end-of-file).
-     */
-    ++sp->sourcing_lnum;
-    for (;;)
-    {
-	/* make room to read at least 120 (more) characters */
-	if (ga_grow(&ga, 120) == FAIL)
-	    break;
-	buf = (char_u *)ga.ga_data;
-
-	if (fgets((char *)buf + ga.ga_len, ga.ga_maxlen - ga.ga_len,
-							      sp->fp) == NULL)
-	    break;
-	len = ga.ga_len + (int)STRLEN(buf + ga.ga_len);
-#ifdef USE_CRNL
-	/* Ignore a trailing CTRL-Z, when in Dos mode.	Only recognize the
-	 * CTRL-Z by its own, or after a NL. */
-	if (	   (len == 1 || (len >= 2 && buf[len - 2] == '\n'))
-		&& sp->fileformat == EOL_DOS
-		&& buf[len - 1] == Ctrl_Z)
-	{
-	    buf[len - 1] = NUL;
-	    break;
-	}
-#endif
-
-	have_read = TRUE;
-	ga.ga_len = len;
-
-	/* If the line was longer than the buffer, read more. */
-	if (ga.ga_maxlen - ga.ga_len == 1 && buf[len - 1] != '\n')
-	    continue;
-
-	if (len >= 1 && buf[len - 1] == '\n')	/* remove trailing NL */
-	{
-#ifdef USE_CRNL
-	    has_cr = (len >= 2 && buf[len - 2] == '\r');
-	    if (sp->fileformat == EOL_UNKNOWN)
-	    {
-		if (has_cr)
-		    sp->fileformat = EOL_DOS;
-		else
-		    sp->fileformat = EOL_UNIX;
-	    }
-
-	    if (sp->fileformat == EOL_DOS)
-	    {
-		if (has_cr)	    /* replace trailing CR */
-		{
-		    buf[len - 2] = '\n';
-		    --len;
-		    --ga.ga_len;
-		}
-		else	    /* lines like ":map xx yy^M" will have failed */
-		{
-		    if (!sp->error)
-		    {
-			msg_source(HL_ATTR(HLF_W));
-			emsg(_("W15: Warning: Wrong line separator, ^M may be missing"));
-		    }
-		    sp->error = TRUE;
-		    sp->fileformat = EOL_UNIX;
-		}
-	    }
-#endif
-	    /* The '\n' is escaped if there is an odd number of ^V's just
-	     * before it, first set "c" just before the 'V's and then check
-	     * len&c parities (is faster than ((len-c)%2 == 0)) -- Acevedo */
-	    for (c = len - 2; c >= 0 && buf[c] == Ctrl_V; c--)
-		;
-	    if ((len & 1) != (c & 1))	/* escaped NL, read more */
-	    {
-		++sp->sourcing_lnum;
-		continue;
-	    }
-
-	    buf[len - 1] = NUL;		/* remove the NL */
-	}
-
-	/*
-	 * Check for ^C here now and then, so recursive :so can be broken.
-	 */
-	line_breakcheck();
-	break;
-    }
-
-    if (have_read)
-	return (char_u *)ga.ga_data;
-
-    vim_free(ga.ga_data);
-    return NULL;
-}
-
-/*
- * ":scriptencoding": Set encoding conversion for a sourced script.
- */
-    void
-ex_scriptencoding(exarg_T *eap)
-{
-    struct source_cookie	*sp;
-    char_u			*name;
-
-    if (!getline_equal(eap->getline, eap->cookie, getsourceline))
-    {
-	emsg(_("E167: :scriptencoding used outside of a sourced file"));
-	return;
-    }
-
-    if (*eap->arg != NUL)
-    {
-	name = enc_canonize(eap->arg);
-	if (name == NULL)	/* out of memory */
-	    return;
-    }
-    else
-	name = eap->arg;
-
-    /* Setup for conversion from the specified encoding to 'encoding'. */
-    sp = (struct source_cookie *)getline_cookie(eap->getline, eap->cookie);
-    convert_setup(&sp->conv, name, p_enc);
-
-    if (name != eap->arg)
-	vim_free(name);
-}
-
-/*
- * ":scriptversion": Set Vim script version for a sourced script.
- */
-    void
-ex_scriptversion(exarg_T *eap UNUSED)
-{
-#ifdef FEAT_EVAL
-    int		nr;
-
-    if (!getline_equal(eap->getline, eap->cookie, getsourceline))
-    {
-	emsg(_("E984: :scriptversion used outside of a sourced file"));
-	return;
-    }
-
-    nr = getdigits(&eap->arg);
-    if (nr == 0 || *eap->arg != NUL)
-	emsg(_(e_invarg));
-    else if (nr > 3)
-	semsg(_("E999: scriptversion not supported: %d"), nr);
-    else
-	current_sctx.sc_version = nr;
-#endif
-}
-
-#if defined(FEAT_EVAL) || defined(PROTO)
-/*
- * ":finish": Mark a sourced file as finished.
- */
-    void
-ex_finish(exarg_T *eap)
-{
-    if (getline_equal(eap->getline, eap->cookie, getsourceline))
-	do_finish(eap, FALSE);
-    else
-	emsg(_("E168: :finish used outside of a sourced file"));
-}
-
-/*
- * Mark a sourced file as finished.  Possibly makes the ":finish" pending.
- * Also called for a pending finish at the ":endtry" or after returning from
- * an extra do_cmdline().  "reanimate" is used in the latter case.
- */
-    void
-do_finish(exarg_T *eap, int reanimate)
-{
-    int		idx;
-
-    if (reanimate)
-	((struct source_cookie *)getline_cookie(eap->getline,
-					      eap->cookie))->finished = FALSE;
-
-    /*
-     * Cleanup (and inactivate) conditionals, but stop when a try conditional
-     * not in its finally clause (which then is to be executed next) is found.
-     * In this case, make the ":finish" pending for execution at the ":endtry".
-     * Otherwise, finish normally.
-     */
-    idx = cleanup_conditionals(eap->cstack, 0, TRUE);
-    if (idx >= 0)
-    {
-	eap->cstack->cs_pending[idx] = CSTP_FINISH;
-	report_make_pending(CSTP_FINISH, NULL);
-    }
-    else
-	((struct source_cookie *)getline_cookie(eap->getline,
-					       eap->cookie))->finished = TRUE;
-}
-
-
-/*
- * Return TRUE when a sourced file had the ":finish" command: Don't give error
- * message for missing ":endif".
- * Return FALSE when not sourcing a file.
- */
-    int
-source_finished(
-    char_u	*(*fgetline)(int, void *, int, int),
-    void	*cookie)
-{
-    return (getline_equal(fgetline, cookie, getsourceline)
-	    && ((struct source_cookie *)getline_cookie(
-						fgetline, cookie))->finished);
-}
-#endif
-
-/*
  * ":checktime [buffer]"
  */
     void
diff --git a/src/proto.h b/src/proto.h
index 3b6d1ac..10c8ff5 100644
--- a/src/proto.h
+++ b/src/proto.h
@@ -184,6 +184,7 @@
 #  include "quickfix.pro"
 # endif
 # include "regexp.pro"
+# include "scriptfile.pro"
 # include "screen.pro"
 # include "session.pro"
 # if defined(FEAT_CRYPT) || defined(FEAT_PERSISTENT_UNDO)
diff --git a/src/proto/ex_cmds2.pro b/src/proto/ex_cmds2.pro
index 9d45c7e..e0fd3c6 100644
--- a/src/proto/ex_cmds2.pro
+++ b/src/proto/ex_cmds2.pro
@@ -20,36 +20,10 @@
 int buf_write_all(buf_T *buf, int forceit);
 void ex_listdo(exarg_T *eap);
 void ex_compiler(exarg_T *eap);
-void ex_runtime(exarg_T *eap);
-int do_in_path(char_u *path, char_u *name, int flags, void (*callback)(char_u *fname, void *ck), void *cookie);
-int do_in_runtimepath(char_u *name, int flags, void (*callback)(char_u *fname, void *ck), void *cookie);
-int source_runtime(char_u *name, int flags);
-int source_in_path(char_u *path, char_u *name, int flags);
-void add_pack_start_dirs(void);
-void load_start_packages(void);
-void ex_packloadall(exarg_T *eap);
-void ex_packadd(exarg_T *eap);
-void ex_options(exarg_T *eap);
 void init_pyxversion(void);
 void ex_pyxfile(exarg_T *eap);
 void ex_pyx(exarg_T *eap);
 void ex_pyxdo(exarg_T *eap);
-void ex_source(exarg_T *eap);
-linenr_T *source_breakpoint(void *cookie);
-int *source_dbg_tick(void *cookie);
-int source_level(void *cookie);
-int do_source(char_u *fname, int check_other, int is_vimrc);
-void ex_scriptnames(exarg_T *eap);
-void scriptnames_slash_adjust(void);
-char_u *get_scriptname(scid_T id);
-void free_scriptnames(void);
-linenr_T get_sourced_lnum(char_u *(*fgetline)(int, void *, int, int), void *cookie);
-char_u *getsourceline(int c, void *cookie, int indent, int do_concat);
-void ex_scriptencoding(exarg_T *eap);
-void ex_scriptversion(exarg_T *eap);
-void ex_finish(exarg_T *eap);
-void do_finish(exarg_T *eap, int reanimate);
-int source_finished(char_u *(*fgetline)(int, void *, int, int), void *cookie);
 void ex_checktime(exarg_T *eap);
 char_u *get_mess_lang(void);
 void set_lang_var(void);
diff --git a/src/proto/scriptfile.pro b/src/proto/scriptfile.pro
new file mode 100644
index 0000000..98f8210
--- /dev/null
+++ b/src/proto/scriptfile.pro
@@ -0,0 +1,30 @@
+/* scriptfile.c */
+void ex_runtime(exarg_T *eap);
+int do_in_path(char_u *path, char_u *name, int flags, void (*callback)(char_u *fname, void *ck), void *cookie);
+int do_in_runtimepath(char_u *name, int flags, void (*callback)(char_u *fname, void *ck), void *cookie);
+int source_runtime(char_u *name, int flags);
+int source_in_path(char_u *path, char_u *name, int flags);
+void add_pack_start_dirs(void);
+void load_start_packages(void);
+void ex_packloadall(exarg_T *eap);
+void ex_packadd(exarg_T *eap);
+int ExpandRTDir(char_u *pat, int flags, int *num_file, char_u ***file, char *dirnames[]);
+int ExpandPackAddDir(char_u *pat, int *num_file, char_u ***file);
+void ex_source(exarg_T *eap);
+void ex_options(exarg_T *eap);
+linenr_T *source_breakpoint(void *cookie);
+int *source_dbg_tick(void *cookie);
+int source_level(void *cookie);
+int do_source(char_u *fname, int check_other, int is_vimrc);
+void ex_scriptnames(exarg_T *eap);
+void scriptnames_slash_adjust(void);
+char_u *get_scriptname(scid_T id);
+void free_scriptnames(void);
+linenr_T get_sourced_lnum(char_u *(*fgetline)(int, void *, int, int), void *cookie);
+char_u *getsourceline(int c, void *cookie, int indent, int do_concat);
+void ex_scriptencoding(exarg_T *eap);
+void ex_scriptversion(exarg_T *eap);
+void ex_finish(exarg_T *eap);
+void do_finish(exarg_T *eap, int reanimate);
+int source_finished(char_u *(*fgetline)(int, void *, int, int), void *cookie);
+/* vim: set ft=c : */
diff --git a/src/scriptfile.c b/src/scriptfile.c
new file mode 100644
index 0000000..15096e5
--- /dev/null
+++ b/src/scriptfile.c
@@ -0,0 +1,1693 @@
+/* vi:set ts=8 sts=4 sw=4 noet:
+ *
+ * VIM - Vi IMproved	by Bram Moolenaar
+ *
+ * Do ":help uganda"  in Vim to read copying and usage conditions.
+ * Do ":help credits" in Vim to see a list of people who contributed.
+ * See README.txt for an overview of the Vim source code.
+ */
+
+/*
+ * scriptfile.c: functions for dealing with the runtime directories/files
+ */
+
+#include "vim.h"
+
+/*
+ * ":runtime [what] {name}"
+ */
+    void
+ex_runtime(exarg_T *eap)
+{
+    char_u  *arg = eap->arg;
+    char_u  *p = skiptowhite(arg);
+    int	    len = (int)(p - arg);
+    int	    flags = eap->forceit ? DIP_ALL : 0;
+
+    if (STRNCMP(arg, "START", len) == 0)
+    {
+	flags += DIP_START + DIP_NORTP;
+	arg = skipwhite(arg + len);
+    }
+    else if (STRNCMP(arg, "OPT", len) == 0)
+    {
+	flags += DIP_OPT + DIP_NORTP;
+	arg = skipwhite(arg + len);
+    }
+    else if (STRNCMP(arg, "PACK", len) == 0)
+    {
+	flags += DIP_START + DIP_OPT + DIP_NORTP;
+	arg = skipwhite(arg + len);
+    }
+    else if (STRNCMP(arg, "ALL", len) == 0)
+    {
+	flags += DIP_START + DIP_OPT;
+	arg = skipwhite(arg + len);
+    }
+
+    source_runtime(arg, flags);
+}
+
+    static void
+source_callback(char_u *fname, void *cookie UNUSED)
+{
+    (void)do_source(fname, FALSE, DOSO_NONE);
+}
+
+/*
+ * Find the file "name" in all directories in "path" and invoke
+ * "callback(fname, cookie)".
+ * "name" can contain wildcards.
+ * When "flags" has DIP_ALL: source all files, otherwise only the first one.
+ * When "flags" has DIP_DIR: find directories instead of files.
+ * When "flags" has DIP_ERR: give an error message if there is no match.
+ *
+ * return FAIL when no file could be sourced, OK otherwise.
+ */
+    int
+do_in_path(
+    char_u	*path,
+    char_u	*name,
+    int		flags,
+    void	(*callback)(char_u *fname, void *ck),
+    void	*cookie)
+{
+    char_u	*rtp;
+    char_u	*np;
+    char_u	*buf;
+    char_u	*rtp_copy;
+    char_u	*tail;
+    int		num_files;
+    char_u	**files;
+    int		i;
+    int		did_one = FALSE;
+#ifdef AMIGA
+    struct Process	*proc = (struct Process *)FindTask(0L);
+    APTR		save_winptr = proc->pr_WindowPtr;
+
+    // Avoid a requester here for a volume that doesn't exist.
+    proc->pr_WindowPtr = (APTR)-1L;
+#endif
+
+    // Make a copy of 'runtimepath'.  Invoking the callback may change the
+    // value.
+    rtp_copy = vim_strsave(path);
+    buf = alloc(MAXPATHL);
+    if (buf != NULL && rtp_copy != NULL)
+    {
+	if (p_verbose > 1 && name != NULL)
+	{
+	    verbose_enter();
+	    smsg(_("Searching for \"%s\" in \"%s\""),
+						 (char *)name, (char *)path);
+	    verbose_leave();
+	}
+
+	// Loop over all entries in 'runtimepath'.
+	rtp = rtp_copy;
+	while (*rtp != NUL && ((flags & DIP_ALL) || !did_one))
+	{
+	    size_t buflen;
+
+	    // Copy the path from 'runtimepath' to buf[].
+	    copy_option_part(&rtp, buf, MAXPATHL, ",");
+	    buflen = STRLEN(buf);
+
+	    // Skip after or non-after directories.
+	    if (flags & (DIP_NOAFTER | DIP_AFTER))
+	    {
+		int is_after = buflen >= 5
+				     && STRCMP(buf + buflen - 5, "after") == 0;
+
+		if ((is_after && (flags & DIP_NOAFTER))
+			|| (!is_after && (flags & DIP_AFTER)))
+		    continue;
+	    }
+
+	    if (name == NULL)
+	    {
+		(*callback)(buf, (void *) &cookie);
+		if (!did_one)
+		    did_one = (cookie == NULL);
+	    }
+	    else if (buflen + STRLEN(name) + 2 < MAXPATHL)
+	    {
+		add_pathsep(buf);
+		tail = buf + STRLEN(buf);
+
+		// Loop over all patterns in "name"
+		np = name;
+		while (*np != NUL && ((flags & DIP_ALL) || !did_one))
+		{
+		    // Append the pattern from "name" to buf[].
+		    copy_option_part(&np, tail, (int)(MAXPATHL - (tail - buf)),
+								       "\t ");
+
+		    if (p_verbose > 2)
+		    {
+			verbose_enter();
+			smsg(_("Searching for \"%s\""), buf);
+			verbose_leave();
+		    }
+
+		    // Expand wildcards, invoke the callback for each match.
+		    if (gen_expand_wildcards(1, &buf, &num_files, &files,
+				  (flags & DIP_DIR) ? EW_DIR : EW_FILE) == OK)
+		    {
+			for (i = 0; i < num_files; ++i)
+			{
+			    (*callback)(files[i], cookie);
+			    did_one = TRUE;
+			    if (!(flags & DIP_ALL))
+				break;
+			}
+			FreeWild(num_files, files);
+		    }
+		}
+	    }
+	}
+    }
+    vim_free(buf);
+    vim_free(rtp_copy);
+    if (!did_one && name != NULL)
+    {
+	char *basepath = path == p_rtp ? "runtimepath" : "packpath";
+
+	if (flags & DIP_ERR)
+	    semsg(_(e_dirnotf), basepath, name);
+	else if (p_verbose > 0)
+	{
+	    verbose_enter();
+	    smsg(_("not found in '%s': \"%s\""), basepath, name);
+	    verbose_leave();
+	}
+    }
+
+#ifdef AMIGA
+    proc->pr_WindowPtr = save_winptr;
+#endif
+
+    return did_one ? OK : FAIL;
+}
+
+/*
+ * Find "name" in "path".  When found, invoke the callback function for
+ * it: callback(fname, "cookie")
+ * When "flags" has DIP_ALL repeat for all matches, otherwise only the first
+ * one is used.
+ * Returns OK when at least one match found, FAIL otherwise.
+ *
+ * If "name" is NULL calls callback for each entry in "path". Cookie is
+ * passed by reference in this case, setting it to NULL indicates that callback
+ * has done its job.
+ */
+    static int
+do_in_path_and_pp(
+    char_u	*path,
+    char_u	*name,
+    int		flags,
+    void	(*callback)(char_u *fname, void *ck),
+    void	*cookie)
+{
+    int		done = FAIL;
+    char_u	*s;
+    int		len;
+    char	*start_dir = "pack/*/start/*/%s";
+    char	*opt_dir = "pack/*/opt/*/%s";
+
+    if ((flags & DIP_NORTP) == 0)
+	done = do_in_path(path, name, flags, callback, cookie);
+
+    if ((done == FAIL || (flags & DIP_ALL)) && (flags & DIP_START))
+    {
+	len = (int)(STRLEN(start_dir) + STRLEN(name));
+	s = alloc(len);
+	if (s == NULL)
+	    return FAIL;
+	vim_snprintf((char *)s, len, start_dir, name);
+	done = do_in_path(p_pp, s, flags, callback, cookie);
+	vim_free(s);
+    }
+
+    if ((done == FAIL || (flags & DIP_ALL)) && (flags & DIP_OPT))
+    {
+	len = (int)(STRLEN(opt_dir) + STRLEN(name));
+	s = alloc(len);
+	if (s == NULL)
+	    return FAIL;
+	vim_snprintf((char *)s, len, opt_dir, name);
+	done = do_in_path(p_pp, s, flags, callback, cookie);
+	vim_free(s);
+    }
+
+    return done;
+}
+
+/*
+ * Just like do_in_path_and_pp(), using 'runtimepath' for "path".
+ */
+    int
+do_in_runtimepath(
+    char_u	*name,
+    int		flags,
+    void	(*callback)(char_u *fname, void *ck),
+    void	*cookie)
+{
+    return do_in_path_and_pp(p_rtp, name, flags, callback, cookie);
+}
+
+/*
+ * Source the file "name" from all directories in 'runtimepath'.
+ * "name" can contain wildcards.
+ * When "flags" has DIP_ALL: source all files, otherwise only the first one.
+ *
+ * return FAIL when no file could be sourced, OK otherwise.
+ */
+    int
+source_runtime(char_u *name, int flags)
+{
+    return source_in_path(p_rtp, name, flags);
+}
+
+/*
+ * Just like source_runtime(), but use "path" instead of 'runtimepath'.
+ */
+    int
+source_in_path(char_u *path, char_u *name, int flags)
+{
+    return do_in_path_and_pp(path, name, flags, source_callback, NULL);
+}
+
+
+#if defined(FEAT_EVAL) || defined(PROTO)
+
+/*
+ * Expand wildcards in "pat" and invoke do_source() for each match.
+ */
+    static void
+source_all_matches(char_u *pat)
+{
+    int	    num_files;
+    char_u  **files;
+    int	    i;
+
+    if (gen_expand_wildcards(1, &pat, &num_files, &files, EW_FILE) == OK)
+    {
+	for (i = 0; i < num_files; ++i)
+	    (void)do_source(files[i], FALSE, DOSO_NONE);
+	FreeWild(num_files, files);
+    }
+}
+
+/*
+ * Add the package directory to 'runtimepath'.
+ */
+    static int
+add_pack_dir_to_rtp(char_u *fname)
+{
+    char_u  *p4, *p3, *p2, *p1, *p;
+    char_u  *entry;
+    char_u  *insp = NULL;
+    int	    c;
+    char_u  *new_rtp;
+    int	    keep;
+    size_t  oldlen;
+    size_t  addlen;
+    size_t  new_rtp_len;
+    char_u  *afterdir = NULL;
+    size_t  afterlen = 0;
+    char_u  *after_insp = NULL;
+    char_u  *ffname = NULL;
+    size_t  fname_len;
+    char_u  *buf = NULL;
+    char_u  *rtp_ffname;
+    int	    match;
+    int	    retval = FAIL;
+
+    p4 = p3 = p2 = p1 = get_past_head(fname);
+    for (p = p1; *p; MB_PTR_ADV(p))
+	if (vim_ispathsep_nocolon(*p))
+	{
+	    p4 = p3; p3 = p2; p2 = p1; p1 = p;
+	}
+
+    // now we have:
+    // rtp/pack/name/start/name
+    //    p4   p3   p2    p1
+    //
+    // find the part up to "pack" in 'runtimepath'
+    c = *++p4; // append pathsep in order to expand symlink
+    *p4 = NUL;
+    ffname = fix_fname(fname);
+    *p4 = c;
+    if (ffname == NULL)
+	return FAIL;
+
+    // Find "ffname" in "p_rtp", ignoring '/' vs '\' differences.
+    // Also stop at the first "after" directory.
+    fname_len = STRLEN(ffname);
+    buf = alloc(MAXPATHL);
+    if (buf == NULL)
+	goto theend;
+    for (entry = p_rtp; *entry != NUL; )
+    {
+	char_u *cur_entry = entry;
+
+	copy_option_part(&entry, buf, MAXPATHL, ",");
+	if (insp == NULL)
+	{
+	    add_pathsep(buf);
+	    rtp_ffname = fix_fname(buf);
+	    if (rtp_ffname == NULL)
+		goto theend;
+	    match = vim_fnamencmp(rtp_ffname, ffname, fname_len) == 0;
+	    vim_free(rtp_ffname);
+	    if (match)
+		// Insert "ffname" after this entry (and comma).
+		insp = entry;
+	}
+
+	if ((p = (char_u *)strstr((char *)buf, "after")) != NULL
+		&& p > buf
+		&& vim_ispathsep(p[-1])
+		&& (vim_ispathsep(p[5]) || p[5] == NUL || p[5] == ','))
+	{
+	    if (insp == NULL)
+		// Did not find "ffname" before the first "after" directory,
+		// insert it before this entry.
+		insp = cur_entry;
+	    after_insp = cur_entry;
+	    break;
+	}
+    }
+
+    if (insp == NULL)
+	// Both "fname" and "after" not found, append at the end.
+	insp = p_rtp + STRLEN(p_rtp);
+
+    // check if rtp/pack/name/start/name/after exists
+    afterdir = concat_fnames(fname, (char_u *)"after", TRUE);
+    if (afterdir != NULL && mch_isdir(afterdir))
+	afterlen = STRLEN(afterdir) + 1; // add one for comma
+
+    oldlen = STRLEN(p_rtp);
+    addlen = STRLEN(fname) + 1; // add one for comma
+    new_rtp = alloc(oldlen + addlen + afterlen + 1); // add one for NUL
+    if (new_rtp == NULL)
+	goto theend;
+
+    // We now have 'rtp' parts: {keep}{keep_after}{rest}.
+    // Create new_rtp, first: {keep},{fname}
+    keep = (int)(insp - p_rtp);
+    mch_memmove(new_rtp, p_rtp, keep);
+    new_rtp_len = keep;
+    if (*insp == NUL)
+	new_rtp[new_rtp_len++] = ',';  // add comma before
+    mch_memmove(new_rtp + new_rtp_len, fname, addlen - 1);
+    new_rtp_len += addlen - 1;
+    if (*insp != NUL)
+	new_rtp[new_rtp_len++] = ',';  // add comma after
+
+    if (afterlen > 0 && after_insp != NULL)
+    {
+	int keep_after = (int)(after_insp - p_rtp);
+
+	// Add to new_rtp: {keep},{fname}{keep_after},{afterdir}
+	mch_memmove(new_rtp + new_rtp_len, p_rtp + keep,
+							keep_after - keep);
+	new_rtp_len += keep_after - keep;
+	mch_memmove(new_rtp + new_rtp_len, afterdir, afterlen - 1);
+	new_rtp_len += afterlen - 1;
+	new_rtp[new_rtp_len++] = ',';
+	keep = keep_after;
+    }
+
+    if (p_rtp[keep] != NUL)
+	// Append rest: {keep},{fname}{keep_after},{afterdir}{rest}
+	mch_memmove(new_rtp + new_rtp_len, p_rtp + keep, oldlen - keep + 1);
+    else
+	new_rtp[new_rtp_len] = NUL;
+
+    if (afterlen > 0 && after_insp == NULL)
+    {
+	// Append afterdir when "after" was not found:
+	// {keep},{fname}{rest},{afterdir}
+	STRCAT(new_rtp, ",");
+	STRCAT(new_rtp, afterdir);
+    }
+
+    set_option_value((char_u *)"rtp", 0L, new_rtp, 0);
+    vim_free(new_rtp);
+    retval = OK;
+
+theend:
+    vim_free(buf);
+    vim_free(ffname);
+    vim_free(afterdir);
+    return retval;
+}
+
+/*
+ * Load scripts in "plugin" and "ftdetect" directories of the package.
+ */
+    static int
+load_pack_plugin(char_u *fname)
+{
+    static char *plugpat = "%s/plugin/**/*.vim";
+    static char *ftpat = "%s/ftdetect/*.vim";
+    int		len;
+    char_u	*ffname = fix_fname(fname);
+    char_u	*pat = NULL;
+    int		retval = FAIL;
+
+    if (ffname == NULL)
+	return FAIL;
+    len = (int)STRLEN(ffname) + (int)STRLEN(ftpat);
+    pat = alloc(len);
+    if (pat == NULL)
+	goto theend;
+    vim_snprintf((char *)pat, len, plugpat, ffname);
+    source_all_matches(pat);
+
+    {
+	char_u *cmd = vim_strsave((char_u *)"g:did_load_filetypes");
+
+	// If runtime/filetype.vim wasn't loaded yet, the scripts will be
+	// found when it loads.
+	if (cmd != NULL && eval_to_number(cmd) > 0)
+	{
+	    do_cmdline_cmd((char_u *)"augroup filetypedetect");
+	    vim_snprintf((char *)pat, len, ftpat, ffname);
+	    source_all_matches(pat);
+	    do_cmdline_cmd((char_u *)"augroup END");
+	}
+	vim_free(cmd);
+    }
+    vim_free(pat);
+    retval = OK;
+
+theend:
+    vim_free(ffname);
+    return retval;
+}
+
+// used for "cookie" of add_pack_plugin()
+static int APP_ADD_DIR;
+static int APP_LOAD;
+static int APP_BOTH;
+
+    static void
+add_pack_plugin(char_u *fname, void *cookie)
+{
+    if (cookie != &APP_LOAD)
+    {
+	char_u	*buf = alloc(MAXPATHL);
+	char_u	*p;
+	int	found = FALSE;
+
+	if (buf == NULL)
+	    return;
+	p = p_rtp;
+	while (*p != NUL)
+	{
+	    copy_option_part(&p, buf, MAXPATHL, ",");
+	    if (pathcmp((char *)buf, (char *)fname, -1) == 0)
+	    {
+		found = TRUE;
+		break;
+	    }
+	}
+	vim_free(buf);
+	if (!found)
+	    // directory is not yet in 'runtimepath', add it
+	    if (add_pack_dir_to_rtp(fname) == FAIL)
+		return;
+    }
+
+    if (cookie != &APP_ADD_DIR)
+	load_pack_plugin(fname);
+}
+
+/*
+ * Add all packages in the "start" directory to 'runtimepath'.
+ */
+    void
+add_pack_start_dirs(void)
+{
+    do_in_path(p_pp, (char_u *)"pack/*/start/*", DIP_ALL + DIP_DIR,
+					       add_pack_plugin, &APP_ADD_DIR);
+}
+
+/*
+ * Load plugins from all packages in the "start" directory.
+ */
+    void
+load_start_packages(void)
+{
+    did_source_packages = TRUE;
+    do_in_path(p_pp, (char_u *)"pack/*/start/*", DIP_ALL + DIP_DIR,
+						  add_pack_plugin, &APP_LOAD);
+}
+
+/*
+ * ":packloadall"
+ * Find plugins in the package directories and source them.
+ */
+    void
+ex_packloadall(exarg_T *eap)
+{
+    if (!did_source_packages || eap->forceit)
+    {
+	// First do a round to add all directories to 'runtimepath', then load
+	// the plugins. This allows for plugins to use an autoload directory
+	// of another plugin.
+	add_pack_start_dirs();
+	load_start_packages();
+    }
+}
+
+/*
+ * ":packadd[!] {name}"
+ */
+    void
+ex_packadd(exarg_T *eap)
+{
+    static char *plugpat = "pack/*/%s/%s";
+    int		len;
+    char	*pat;
+    int		round;
+    int		res = OK;
+
+    // Round 1: use "start", round 2: use "opt".
+    for (round = 1; round <= 2; ++round)
+    {
+	// Only look under "start" when loading packages wasn't done yet.
+	if (round == 1 && did_source_packages)
+	    continue;
+
+	len = (int)STRLEN(plugpat) + (int)STRLEN(eap->arg) + 5;
+	pat = alloc(len);
+	if (pat == NULL)
+	    return;
+	vim_snprintf(pat, len, plugpat, round == 1 ? "start" : "opt", eap->arg);
+	// The first round don't give a "not found" error, in the second round
+	// only when nothing was found in the first round.
+	res = do_in_path(p_pp, (char_u *)pat,
+		DIP_ALL + DIP_DIR + (round == 2 && res == FAIL ? DIP_ERR : 0),
+		add_pack_plugin, eap->forceit ? &APP_ADD_DIR : &APP_BOTH);
+	vim_free(pat);
+    }
+}
+#endif
+
+/*
+ * Expand color scheme, compiler or filetype names.
+ * Search from 'runtimepath':
+ *   'runtimepath'/{dirnames}/{pat}.vim
+ * When "flags" has DIP_START: search also from 'start' of 'packpath':
+ *   'packpath'/pack/ * /start/ * /{dirnames}/{pat}.vim
+ * When "flags" has DIP_OPT: search also from 'opt' of 'packpath':
+ *   'packpath'/pack/ * /opt/ * /{dirnames}/{pat}.vim
+ * "dirnames" is an array with one or more directory names.
+ */
+    int
+ExpandRTDir(
+    char_u	*pat,
+    int		flags,
+    int		*num_file,
+    char_u	***file,
+    char	*dirnames[])
+{
+    char_u	*s;
+    char_u	*e;
+    char_u	*match;
+    garray_T	ga;
+    int		i;
+    int		pat_len;
+
+    *num_file = 0;
+    *file = NULL;
+    pat_len = (int)STRLEN(pat);
+    ga_init2(&ga, (int)sizeof(char *), 10);
+
+    for (i = 0; dirnames[i] != NULL; ++i)
+    {
+	s = alloc(STRLEN(dirnames[i]) + pat_len + 7);
+	if (s == NULL)
+	{
+	    ga_clear_strings(&ga);
+	    return FAIL;
+	}
+	sprintf((char *)s, "%s/%s*.vim", dirnames[i], pat);
+	globpath(p_rtp, s, &ga, 0);
+	vim_free(s);
+    }
+
+    if (flags & DIP_START) {
+	for (i = 0; dirnames[i] != NULL; ++i)
+	{
+	    s = alloc(STRLEN(dirnames[i]) + pat_len + 22);
+	    if (s == NULL)
+	    {
+		ga_clear_strings(&ga);
+		return FAIL;
+	    }
+	    sprintf((char *)s, "pack/*/start/*/%s/%s*.vim", dirnames[i], pat);
+	    globpath(p_pp, s, &ga, 0);
+	    vim_free(s);
+	}
+    }
+
+    if (flags & DIP_OPT) {
+	for (i = 0; dirnames[i] != NULL; ++i)
+	{
+	    s = alloc(STRLEN(dirnames[i]) + pat_len + 20);
+	    if (s == NULL)
+	    {
+		ga_clear_strings(&ga);
+		return FAIL;
+	    }
+	    sprintf((char *)s, "pack/*/opt/*/%s/%s*.vim", dirnames[i], pat);
+	    globpath(p_pp, s, &ga, 0);
+	    vim_free(s);
+	}
+    }
+
+    for (i = 0; i < ga.ga_len; ++i)
+    {
+	match = ((char_u **)ga.ga_data)[i];
+	s = match;
+	e = s + STRLEN(s);
+	if (e - 4 > s && STRNICMP(e - 4, ".vim", 4) == 0)
+	{
+	    e -= 4;
+	    for (s = e; s > match; MB_PTR_BACK(match, s))
+		if (s < match || vim_ispathsep(*s))
+		    break;
+	    ++s;
+	    *e = NUL;
+	    mch_memmove(match, s, e - s + 1);
+	}
+    }
+
+    if (ga.ga_len == 0)
+	return FAIL;
+
+    // Sort and remove duplicates which can happen when specifying multiple
+    // directories in dirnames.
+    remove_duplicates(&ga);
+
+    *file = ga.ga_data;
+    *num_file = ga.ga_len;
+    return OK;
+}
+
+/*
+ * Expand loadplugin names:
+ * 'packpath'/pack/ * /opt/{pat}
+ */
+    int
+ExpandPackAddDir(
+    char_u	*pat,
+    int		*num_file,
+    char_u	***file)
+{
+    char_u	*s;
+    char_u	*e;
+    char_u	*match;
+    garray_T	ga;
+    int		i;
+    int		pat_len;
+
+    *num_file = 0;
+    *file = NULL;
+    pat_len = (int)STRLEN(pat);
+    ga_init2(&ga, (int)sizeof(char *), 10);
+
+    s = alloc(pat_len + 26);
+    if (s == NULL)
+    {
+	ga_clear_strings(&ga);
+	return FAIL;
+    }
+    sprintf((char *)s, "pack/*/opt/%s*", pat);
+    globpath(p_pp, s, &ga, 0);
+    vim_free(s);
+
+    for (i = 0; i < ga.ga_len; ++i)
+    {
+	match = ((char_u **)ga.ga_data)[i];
+	s = gettail(match);
+	e = s + STRLEN(s);
+	mch_memmove(match, s, e - s + 1);
+    }
+
+    if (ga.ga_len == 0)
+	return FAIL;
+
+    // Sort and remove duplicates which can happen when specifying multiple
+    // directories in dirnames.
+    remove_duplicates(&ga);
+
+    *file = ga.ga_data;
+    *num_file = ga.ga_len;
+    return OK;
+}
+
+    static void
+cmd_source(char_u *fname, exarg_T *eap)
+{
+    if (*fname == NUL)
+	emsg(_(e_argreq));
+
+    else if (eap != NULL && eap->forceit)
+	// ":source!": read Normal mode commands
+	// Need to execute the commands directly.  This is required at least
+	// for:
+	// - ":g" command busy
+	// - after ":argdo", ":windo" or ":bufdo"
+	// - another command follows
+	// - inside a loop
+	openscript(fname, global_busy || listcmd_busy || eap->nextcmd != NULL
+#ifdef FEAT_EVAL
+						 || eap->cstack->cs_idx >= 0
+#endif
+						 );
+
+    // ":source" read ex commands
+    else if (do_source(fname, FALSE, DOSO_NONE) == FAIL)
+	semsg(_(e_notopen), fname);
+}
+
+/*
+ * ":source {fname}"
+ */
+    void
+ex_source(exarg_T *eap)
+{
+#ifdef FEAT_BROWSE
+    if (cmdmod.browse)
+    {
+	char_u *fname = NULL;
+
+	fname = do_browse(0, (char_u *)_("Source Vim script"), eap->arg,
+				      NULL, NULL,
+				      (char_u *)_(BROWSE_FILTER_MACROS), NULL);
+	if (fname != NULL)
+	{
+	    cmd_source(fname, eap);
+	    vim_free(fname);
+	}
+    }
+    else
+#endif
+	cmd_source(eap->arg, eap);
+}
+
+#if defined(FEAT_EVAL) || defined(PROTO)
+/*
+ * ":options"
+ */
+    void
+ex_options(
+    exarg_T	*eap UNUSED)
+{
+    vim_setenv((char_u *)"OPTWIN_CMD",
+	    (char_u *)(cmdmod.tab ? "tab"
+		: (cmdmod.split & WSP_VERT) ? "vert" : ""));
+    cmd_source((char_u *)SYS_OPTWIN_FILE, NULL);
+}
+#endif
+
+/*
+ * ":source" and associated commands.
+ */
+/*
+ * Structure used to store info for each sourced file.
+ * It is shared between do_source() and getsourceline().
+ * This is required, because it needs to be handed to do_cmdline() and
+ * sourcing can be done recursively.
+ */
+struct source_cookie
+{
+    FILE	*fp;		// opened file for sourcing
+    char_u	*nextline;	// if not NULL: line that was read ahead
+    linenr_T	sourcing_lnum;	// line number of the source file
+    int		finished;	// ":finish" used
+#ifdef USE_CRNL
+    int		fileformat;	// EOL_UNKNOWN, EOL_UNIX or EOL_DOS
+    int		error;		// TRUE if LF found after CR-LF
+#endif
+#ifdef FEAT_EVAL
+    linenr_T	breakpoint;	// next line with breakpoint or zero
+    char_u	*fname;		// name of sourced file
+    int		dbg_tick;	// debug_tick when breakpoint was set
+    int		level;		// top nesting level of sourced file
+#endif
+    vimconv_T	conv;		// type of conversion
+};
+
+#ifdef FEAT_EVAL
+/*
+ * Return the address holding the next breakpoint line for a source cookie.
+ */
+    linenr_T *
+source_breakpoint(void *cookie)
+{
+    return &((struct source_cookie *)cookie)->breakpoint;
+}
+
+/*
+ * Return the address holding the debug tick for a source cookie.
+ */
+    int *
+source_dbg_tick(void *cookie)
+{
+    return &((struct source_cookie *)cookie)->dbg_tick;
+}
+
+/*
+ * Return the nesting level for a source cookie.
+ */
+    int
+source_level(void *cookie)
+{
+    return ((struct source_cookie *)cookie)->level;
+}
+#endif
+
+#if (defined(MSWIN) && defined(FEAT_CSCOPE)) || defined(HAVE_FD_CLOEXEC)
+# define USE_FOPEN_NOINH
+/*
+ * Special function to open a file without handle inheritance.
+ * When possible the handle is closed on exec().
+ */
+    static FILE *
+fopen_noinh_readbin(char *filename)
+{
+# ifdef MSWIN
+    int	fd_tmp = mch_open(filename, O_RDONLY | O_BINARY | O_NOINHERIT, 0);
+# else
+    int	fd_tmp = mch_open(filename, O_RDONLY, 0);
+# endif
+
+    if (fd_tmp == -1)
+	return NULL;
+
+# ifdef HAVE_FD_CLOEXEC
+    {
+	int fdflags = fcntl(fd_tmp, F_GETFD);
+	if (fdflags >= 0 && (fdflags & FD_CLOEXEC) == 0)
+	    (void)fcntl(fd_tmp, F_SETFD, fdflags | FD_CLOEXEC);
+    }
+# endif
+
+    return fdopen(fd_tmp, READBIN);
+}
+#endif
+
+/*
+ * do_source: Read the file "fname" and execute its lines as EX commands.
+ *
+ * This function may be called recursively!
+ *
+ * return FAIL if file could not be opened, OK otherwise
+ */
+    int
+do_source(
+    char_u	*fname,
+    int		check_other,	    // check for .vimrc and _vimrc
+    int		is_vimrc)	    // DOSO_ value
+{
+    struct source_cookie    cookie;
+    char_u		    *save_sourcing_name;
+    linenr_T		    save_sourcing_lnum;
+    char_u		    *p;
+    char_u		    *fname_exp;
+    char_u		    *firstline = NULL;
+    int			    retval = FAIL;
+#ifdef FEAT_EVAL
+    sctx_T		    save_current_sctx;
+    static scid_T	    last_current_SID = 0;
+    static int		    last_current_SID_seq = 0;
+    funccal_entry_T	    funccalp_entry;
+    int			    save_debug_break_level = debug_break_level;
+    scriptitem_T	    *si = NULL;
+# ifdef UNIX
+    stat_T		    st;
+    int			    stat_ok;
+# endif
+#endif
+#ifdef STARTUPTIME
+    struct timeval	    tv_rel;
+    struct timeval	    tv_start;
+#endif
+#ifdef FEAT_PROFILE
+    proftime_T		    wait_start;
+#endif
+    int			    trigger_source_post = FALSE;
+
+    p = expand_env_save(fname);
+    if (p == NULL)
+	return retval;
+    fname_exp = fix_fname(p);
+    vim_free(p);
+    if (fname_exp == NULL)
+	return retval;
+    if (mch_isdir(fname_exp))
+    {
+	smsg(_("Cannot source a directory: \"%s\""), fname);
+	goto theend;
+    }
+
+    // Apply SourceCmd autocommands, they should get the file and source it.
+    if (has_autocmd(EVENT_SOURCECMD, fname_exp, NULL)
+	    && apply_autocmds(EVENT_SOURCECMD, fname_exp, fname_exp,
+							       FALSE, curbuf))
+    {
+#ifdef FEAT_EVAL
+	retval = aborting() ? FAIL : OK;
+#else
+	retval = OK;
+#endif
+	if (retval == OK)
+	    // Apply SourcePost autocommands.
+	    apply_autocmds(EVENT_SOURCEPOST, fname_exp, fname_exp,
+								FALSE, curbuf);
+	goto theend;
+    }
+
+    // Apply SourcePre autocommands, they may get the file.
+    apply_autocmds(EVENT_SOURCEPRE, fname_exp, fname_exp, FALSE, curbuf);
+
+#ifdef USE_FOPEN_NOINH
+    cookie.fp = fopen_noinh_readbin((char *)fname_exp);
+#else
+    cookie.fp = mch_fopen((char *)fname_exp, READBIN);
+#endif
+    if (cookie.fp == NULL && check_other)
+    {
+	// Try again, replacing file name ".vimrc" by "_vimrc" or vice versa,
+	// and ".exrc" by "_exrc" or vice versa.
+	p = gettail(fname_exp);
+	if ((*p == '.' || *p == '_')
+		&& (STRICMP(p + 1, "vimrc") == 0
+		    || STRICMP(p + 1, "gvimrc") == 0
+		    || STRICMP(p + 1, "exrc") == 0))
+	{
+	    if (*p == '_')
+		*p = '.';
+	    else
+		*p = '_';
+#ifdef USE_FOPEN_NOINH
+	    cookie.fp = fopen_noinh_readbin((char *)fname_exp);
+#else
+	    cookie.fp = mch_fopen((char *)fname_exp, READBIN);
+#endif
+	}
+    }
+
+    if (cookie.fp == NULL)
+    {
+	if (p_verbose > 0)
+	{
+	    verbose_enter();
+	    if (sourcing_name == NULL)
+		smsg(_("could not source \"%s\""), fname);
+	    else
+		smsg(_("line %ld: could not source \"%s\""),
+							sourcing_lnum, fname);
+	    verbose_leave();
+	}
+	goto theend;
+    }
+
+    // The file exists.
+    // - In verbose mode, give a message.
+    // - For a vimrc file, may want to set 'compatible', call vimrc_found().
+    if (p_verbose > 1)
+    {
+	verbose_enter();
+	if (sourcing_name == NULL)
+	    smsg(_("sourcing \"%s\""), fname);
+	else
+	    smsg(_("line %ld: sourcing \"%s\""),
+							sourcing_lnum, fname);
+	verbose_leave();
+    }
+    if (is_vimrc == DOSO_VIMRC)
+	vimrc_found(fname_exp, (char_u *)"MYVIMRC");
+    else if (is_vimrc == DOSO_GVIMRC)
+	vimrc_found(fname_exp, (char_u *)"MYGVIMRC");
+
+#ifdef USE_CRNL
+    // If no automatic file format: Set default to CR-NL.
+    if (*p_ffs == NUL)
+	cookie.fileformat = EOL_DOS;
+    else
+	cookie.fileformat = EOL_UNKNOWN;
+    cookie.error = FALSE;
+#endif
+
+    cookie.nextline = NULL;
+    cookie.sourcing_lnum = 0;
+    cookie.finished = FALSE;
+
+#ifdef FEAT_EVAL
+    // Check if this script has a breakpoint.
+    cookie.breakpoint = dbg_find_breakpoint(TRUE, fname_exp, (linenr_T)0);
+    cookie.fname = fname_exp;
+    cookie.dbg_tick = debug_tick;
+
+    cookie.level = ex_nesting_level;
+#endif
+
+    // Keep the sourcing name/lnum, for recursive calls.
+    save_sourcing_name = sourcing_name;
+    sourcing_name = fname_exp;
+    save_sourcing_lnum = sourcing_lnum;
+    sourcing_lnum = 0;
+
+#ifdef STARTUPTIME
+    if (time_fd != NULL)
+	time_push(&tv_rel, &tv_start);
+#endif
+
+#ifdef FEAT_EVAL
+# ifdef FEAT_PROFILE
+    if (do_profiling == PROF_YES)
+	prof_child_enter(&wait_start);		// entering a child now
+# endif
+
+    // Don't use local function variables, if called from a function.
+    // Also starts profiling timer for nested script.
+    save_funccal(&funccalp_entry);
+
+    save_current_sctx = current_sctx;
+    current_sctx.sc_lnum = 0;
+    current_sctx.sc_version = 1;
+
+    // Check if this script was sourced before to finds its SID.
+    // If it's new, generate a new SID.
+    // Always use a new sequence number.
+    current_sctx.sc_seq = ++last_current_SID_seq;
+# ifdef UNIX
+    stat_ok = (mch_stat((char *)fname_exp, &st) >= 0);
+# endif
+    for (current_sctx.sc_sid = script_items.ga_len; current_sctx.sc_sid > 0;
+							 --current_sctx.sc_sid)
+    {
+	si = &SCRIPT_ITEM(current_sctx.sc_sid);
+	if (si->sn_name != NULL
+		&& (
+# ifdef UNIX
+		    // Compare dev/ino when possible, it catches symbolic
+		    // links.  Also compare file names, the inode may change
+		    // when the file was edited.
+		    ((stat_ok && si->sn_dev_valid)
+			&& (si->sn_dev == st.st_dev
+			    && si->sn_ino == st.st_ino)) ||
+# endif
+		fnamecmp(si->sn_name, fname_exp) == 0))
+	    break;
+    }
+    if (current_sctx.sc_sid == 0)
+    {
+	current_sctx.sc_sid = ++last_current_SID;
+	if (ga_grow(&script_items,
+		     (int)(current_sctx.sc_sid - script_items.ga_len)) == FAIL)
+	    goto almosttheend;
+	while (script_items.ga_len < current_sctx.sc_sid)
+	{
+	    ++script_items.ga_len;
+	    SCRIPT_ITEM(script_items.ga_len).sn_name = NULL;
+# ifdef FEAT_PROFILE
+	    SCRIPT_ITEM(script_items.ga_len).sn_prof_on = FALSE;
+# endif
+	}
+	si = &SCRIPT_ITEM(current_sctx.sc_sid);
+	si->sn_name = fname_exp;
+	fname_exp = vim_strsave(si->sn_name);  // used for autocmd
+# ifdef UNIX
+	if (stat_ok)
+	{
+	    si->sn_dev_valid = TRUE;
+	    si->sn_dev = st.st_dev;
+	    si->sn_ino = st.st_ino;
+	}
+	else
+	    si->sn_dev_valid = FALSE;
+# endif
+
+	// Allocate the local script variables to use for this script.
+	new_script_vars(current_sctx.sc_sid);
+    }
+
+# ifdef FEAT_PROFILE
+    if (do_profiling == PROF_YES)
+    {
+	int	forceit;
+
+	// Check if we do profiling for this script.
+	if (!si->sn_prof_on && has_profiling(TRUE, si->sn_name, &forceit))
+	{
+	    script_do_profile(si);
+	    si->sn_pr_force = forceit;
+	}
+	if (si->sn_prof_on)
+	{
+	    ++si->sn_pr_count;
+	    profile_start(&si->sn_pr_start);
+	    profile_zero(&si->sn_pr_children);
+	}
+    }
+# endif
+#endif
+
+    cookie.conv.vc_type = CONV_NONE;		// no conversion
+
+    // Read the first line so we can check for a UTF-8 BOM.
+    firstline = getsourceline(0, (void *)&cookie, 0, TRUE);
+    if (firstline != NULL && STRLEN(firstline) >= 3 && firstline[0] == 0xef
+			      && firstline[1] == 0xbb && firstline[2] == 0xbf)
+    {
+	// Found BOM; setup conversion, skip over BOM and recode the line.
+	convert_setup(&cookie.conv, (char_u *)"utf-8", p_enc);
+	p = string_convert(&cookie.conv, firstline + 3, NULL);
+	if (p == NULL)
+	    p = vim_strsave(firstline + 3);
+	if (p != NULL)
+	{
+	    vim_free(firstline);
+	    firstline = p;
+	}
+    }
+
+    // Call do_cmdline, which will call getsourceline() to get the lines.
+    do_cmdline(firstline, getsourceline, (void *)&cookie,
+				     DOCMD_VERBOSE|DOCMD_NOWAIT|DOCMD_REPEAT);
+    retval = OK;
+
+#ifdef FEAT_PROFILE
+    if (do_profiling == PROF_YES)
+    {
+	// Get "si" again, "script_items" may have been reallocated.
+	si = &SCRIPT_ITEM(current_sctx.sc_sid);
+	if (si->sn_prof_on)
+	{
+	    profile_end(&si->sn_pr_start);
+	    profile_sub_wait(&wait_start, &si->sn_pr_start);
+	    profile_add(&si->sn_pr_total, &si->sn_pr_start);
+	    profile_self(&si->sn_pr_self, &si->sn_pr_start,
+							 &si->sn_pr_children);
+	}
+    }
+#endif
+
+    if (got_int)
+	emsg(_(e_interr));
+    sourcing_name = save_sourcing_name;
+    sourcing_lnum = save_sourcing_lnum;
+    if (p_verbose > 1)
+    {
+	verbose_enter();
+	smsg(_("finished sourcing %s"), fname);
+	if (sourcing_name != NULL)
+	    smsg(_("continuing in %s"), sourcing_name);
+	verbose_leave();
+    }
+#ifdef STARTUPTIME
+    if (time_fd != NULL)
+    {
+	vim_snprintf((char *)IObuff, IOSIZE, "sourcing %s", fname);
+	time_msg((char *)IObuff, &tv_start);
+	time_pop(&tv_rel);
+    }
+#endif
+
+    if (!got_int)
+	trigger_source_post = TRUE;
+
+#ifdef FEAT_EVAL
+    // After a "finish" in debug mode, need to break at first command of next
+    // sourced file.
+    if (save_debug_break_level > ex_nesting_level
+	    && debug_break_level == ex_nesting_level)
+	++debug_break_level;
+#endif
+
+#ifdef FEAT_EVAL
+almosttheend:
+    current_sctx = save_current_sctx;
+    restore_funccal();
+# ifdef FEAT_PROFILE
+    if (do_profiling == PROF_YES)
+	prof_child_exit(&wait_start);		// leaving a child now
+# endif
+#endif
+    fclose(cookie.fp);
+    vim_free(cookie.nextline);
+    vim_free(firstline);
+    convert_setup(&cookie.conv, NULL, NULL);
+
+    if (trigger_source_post)
+	apply_autocmds(EVENT_SOURCEPOST, fname_exp, fname_exp, FALSE, curbuf);
+
+theend:
+    vim_free(fname_exp);
+    return retval;
+}
+
+#if defined(FEAT_EVAL) || defined(PROTO)
+
+/*
+ * ":scriptnames"
+ */
+    void
+ex_scriptnames(exarg_T *eap)
+{
+    int i;
+
+    if (eap->addr_count > 0)
+    {
+	// :script {scriptId}: edit the script
+	if (eap->line2 < 1 || eap->line2 > script_items.ga_len)
+	    emsg(_(e_invarg));
+	else
+	{
+	    eap->arg = SCRIPT_ITEM(eap->line2).sn_name;
+	    do_exedit(eap, NULL);
+	}
+	return;
+    }
+
+    for (i = 1; i <= script_items.ga_len && !got_int; ++i)
+	if (SCRIPT_ITEM(i).sn_name != NULL)
+	{
+	    home_replace(NULL, SCRIPT_ITEM(i).sn_name,
+						    NameBuff, MAXPATHL, TRUE);
+	    smsg("%3d: %s", i, NameBuff);
+	}
+}
+
+# if defined(BACKSLASH_IN_FILENAME) || defined(PROTO)
+/*
+ * Fix slashes in the list of script names for 'shellslash'.
+ */
+    void
+scriptnames_slash_adjust(void)
+{
+    int i;
+
+    for (i = 1; i <= script_items.ga_len; ++i)
+	if (SCRIPT_ITEM(i).sn_name != NULL)
+	    slash_adjust(SCRIPT_ITEM(i).sn_name);
+}
+# endif
+
+/*
+ * Get a pointer to a script name.  Used for ":verbose set".
+ */
+    char_u *
+get_scriptname(scid_T id)
+{
+    if (id == SID_MODELINE)
+	return (char_u *)_("modeline");
+    if (id == SID_CMDARG)
+	return (char_u *)_("--cmd argument");
+    if (id == SID_CARG)
+	return (char_u *)_("-c argument");
+    if (id == SID_ENV)
+	return (char_u *)_("environment variable");
+    if (id == SID_ERROR)
+	return (char_u *)_("error handler");
+    return SCRIPT_ITEM(id).sn_name;
+}
+
+# if defined(EXITFREE) || defined(PROTO)
+    void
+free_scriptnames(void)
+{
+    int			i;
+
+    for (i = script_items.ga_len; i > 0; --i)
+	vim_free(SCRIPT_ITEM(i).sn_name);
+    ga_clear(&script_items);
+}
+# endif
+
+#endif
+
+    linenr_T
+get_sourced_lnum(char_u *(*fgetline)(int, void *, int, int), void *cookie)
+{
+    return fgetline == getsourceline
+			? ((struct source_cookie *)cookie)->sourcing_lnum
+			: sourcing_lnum;
+}
+
+    static char_u *
+get_one_sourceline(struct source_cookie *sp)
+{
+    garray_T		ga;
+    int			len;
+    int			c;
+    char_u		*buf;
+#ifdef USE_CRNL
+    int			has_cr;		// CR-LF found
+#endif
+    int			have_read = FALSE;
+
+    // use a growarray to store the sourced line
+    ga_init2(&ga, 1, 250);
+
+    // Loop until there is a finished line (or end-of-file).
+    ++sp->sourcing_lnum;
+    for (;;)
+    {
+	// make room to read at least 120 (more) characters
+	if (ga_grow(&ga, 120) == FAIL)
+	    break;
+	buf = (char_u *)ga.ga_data;
+
+	if (fgets((char *)buf + ga.ga_len, ga.ga_maxlen - ga.ga_len,
+							      sp->fp) == NULL)
+	    break;
+	len = ga.ga_len + (int)STRLEN(buf + ga.ga_len);
+#ifdef USE_CRNL
+	// Ignore a trailing CTRL-Z, when in Dos mode.	Only recognize the
+	// CTRL-Z by its own, or after a NL.
+	if (	   (len == 1 || (len >= 2 && buf[len - 2] == '\n'))
+		&& sp->fileformat == EOL_DOS
+		&& buf[len - 1] == Ctrl_Z)
+	{
+	    buf[len - 1] = NUL;
+	    break;
+	}
+#endif
+
+	have_read = TRUE;
+	ga.ga_len = len;
+
+	// If the line was longer than the buffer, read more.
+	if (ga.ga_maxlen - ga.ga_len == 1 && buf[len - 1] != '\n')
+	    continue;
+
+	if (len >= 1 && buf[len - 1] == '\n')	// remove trailing NL
+	{
+#ifdef USE_CRNL
+	    has_cr = (len >= 2 && buf[len - 2] == '\r');
+	    if (sp->fileformat == EOL_UNKNOWN)
+	    {
+		if (has_cr)
+		    sp->fileformat = EOL_DOS;
+		else
+		    sp->fileformat = EOL_UNIX;
+	    }
+
+	    if (sp->fileformat == EOL_DOS)
+	    {
+		if (has_cr)	    // replace trailing CR
+		{
+		    buf[len - 2] = '\n';
+		    --len;
+		    --ga.ga_len;
+		}
+		else	    // lines like ":map xx yy^M" will have failed
+		{
+		    if (!sp->error)
+		    {
+			msg_source(HL_ATTR(HLF_W));
+			emsg(_("W15: Warning: Wrong line separator, ^M may be missing"));
+		    }
+		    sp->error = TRUE;
+		    sp->fileformat = EOL_UNIX;
+		}
+	    }
+#endif
+	    // The '\n' is escaped if there is an odd number of ^V's just
+	    // before it, first set "c" just before the 'V's and then check
+	    // len&c parities (is faster than ((len-c)%2 == 0)) -- Acevedo
+	    for (c = len - 2; c >= 0 && buf[c] == Ctrl_V; c--)
+		;
+	    if ((len & 1) != (c & 1))	// escaped NL, read more
+	    {
+		++sp->sourcing_lnum;
+		continue;
+	    }
+
+	    buf[len - 1] = NUL;		// remove the NL
+	}
+
+	// Check for ^C here now and then, so recursive :so can be broken.
+	line_breakcheck();
+	break;
+    }
+
+    if (have_read)
+	return (char_u *)ga.ga_data;
+
+    vim_free(ga.ga_data);
+    return NULL;
+}
+
+/*
+ * Get one full line from a sourced file.
+ * Called by do_cmdline() when it's called from do_source().
+ *
+ * Return a pointer to the line in allocated memory.
+ * Return NULL for end-of-file or some error.
+ */
+    char_u *
+getsourceline(int c UNUSED, void *cookie, int indent UNUSED, int do_concat)
+{
+    struct source_cookie *sp = (struct source_cookie *)cookie;
+    char_u		*line;
+    char_u		*p;
+
+#ifdef FEAT_EVAL
+    // If breakpoints have been added/deleted need to check for it.
+    if (sp->dbg_tick < debug_tick)
+    {
+	sp->breakpoint = dbg_find_breakpoint(TRUE, sp->fname, sourcing_lnum);
+	sp->dbg_tick = debug_tick;
+    }
+# ifdef FEAT_PROFILE
+    if (do_profiling == PROF_YES)
+	script_line_end();
+# endif
+#endif
+
+    // Set the current sourcing line number.
+    sourcing_lnum = sp->sourcing_lnum + 1;
+
+    // Get current line.  If there is a read-ahead line, use it, otherwise get
+    // one now.
+    if (sp->finished)
+	line = NULL;
+    else if (sp->nextline == NULL)
+	line = get_one_sourceline(sp);
+    else
+    {
+	line = sp->nextline;
+	sp->nextline = NULL;
+	++sp->sourcing_lnum;
+    }
+#ifdef FEAT_PROFILE
+    if (line != NULL && do_profiling == PROF_YES)
+	script_line_start();
+#endif
+
+    // Only concatenate lines starting with a \ when 'cpoptions' doesn't
+    // contain the 'C' flag.
+    if (line != NULL && do_concat && vim_strchr(p_cpo, CPO_CONCAT) == NULL)
+    {
+	// compensate for the one line read-ahead
+	--sp->sourcing_lnum;
+
+	// Get the next line and concatenate it when it starts with a
+	// backslash. We always need to read the next line, keep it in
+	// sp->nextline.
+	/* Also check for a comment in between continuation lines: "\ */
+	sp->nextline = get_one_sourceline(sp);
+	if (sp->nextline != NULL
+		&& (*(p = skipwhite(sp->nextline)) == '\\'
+			      || (p[0] == '"' && p[1] == '\\' && p[2] == ' ')))
+	{
+	    garray_T    ga;
+
+	    ga_init2(&ga, (int)sizeof(char_u), 400);
+	    ga_concat(&ga, line);
+	    if (*p == '\\')
+		ga_concat(&ga, p + 1);
+	    for (;;)
+	    {
+		vim_free(sp->nextline);
+		sp->nextline = get_one_sourceline(sp);
+		if (sp->nextline == NULL)
+		    break;
+		p = skipwhite(sp->nextline);
+		if (*p == '\\')
+		{
+		    // Adjust the growsize to the current length to speed up
+		    // concatenating many lines.
+		    if (ga.ga_len > 400)
+		    {
+			if (ga.ga_len > 8000)
+			    ga.ga_growsize = 8000;
+			else
+			    ga.ga_growsize = ga.ga_len;
+		    }
+		    ga_concat(&ga, p + 1);
+		}
+		else if (p[0] != '"' || p[1] != '\\' || p[2] != ' ')
+		    break;
+	    }
+	    ga_append(&ga, NUL);
+	    vim_free(line);
+	    line = ga.ga_data;
+	}
+    }
+
+    if (line != NULL && sp->conv.vc_type != CONV_NONE)
+    {
+	char_u	*s;
+
+	// Convert the encoding of the script line.
+	s = string_convert(&sp->conv, line, NULL);
+	if (s != NULL)
+	{
+	    vim_free(line);
+	    line = s;
+	}
+    }
+
+#ifdef FEAT_EVAL
+    // Did we encounter a breakpoint?
+    if (sp->breakpoint != 0 && sp->breakpoint <= sourcing_lnum)
+    {
+	dbg_breakpoint(sp->fname, sourcing_lnum);
+	// Find next breakpoint.
+	sp->breakpoint = dbg_find_breakpoint(TRUE, sp->fname, sourcing_lnum);
+	sp->dbg_tick = debug_tick;
+    }
+#endif
+
+    return line;
+}
+
+/*
+ * ":scriptencoding": Set encoding conversion for a sourced script.
+ */
+    void
+ex_scriptencoding(exarg_T *eap)
+{
+    struct source_cookie	*sp;
+    char_u			*name;
+
+    if (!getline_equal(eap->getline, eap->cookie, getsourceline))
+    {
+	emsg(_("E167: :scriptencoding used outside of a sourced file"));
+	return;
+    }
+
+    if (*eap->arg != NUL)
+    {
+	name = enc_canonize(eap->arg);
+	if (name == NULL)	// out of memory
+	    return;
+    }
+    else
+	name = eap->arg;
+
+    // Setup for conversion from the specified encoding to 'encoding'.
+    sp = (struct source_cookie *)getline_cookie(eap->getline, eap->cookie);
+    convert_setup(&sp->conv, name, p_enc);
+
+    if (name != eap->arg)
+	vim_free(name);
+}
+
+/*
+ * ":scriptversion": Set Vim script version for a sourced script.
+ */
+    void
+ex_scriptversion(exarg_T *eap UNUSED)
+{
+#ifdef FEAT_EVAL
+    int		nr;
+
+    if (!getline_equal(eap->getline, eap->cookie, getsourceline))
+    {
+	emsg(_("E984: :scriptversion used outside of a sourced file"));
+	return;
+    }
+
+    nr = getdigits(&eap->arg);
+    if (nr == 0 || *eap->arg != NUL)
+	emsg(_(e_invarg));
+    else if (nr > 3)
+	semsg(_("E999: scriptversion not supported: %d"), nr);
+    else
+	current_sctx.sc_version = nr;
+#endif
+}
+
+#if defined(FEAT_EVAL) || defined(PROTO)
+/*
+ * ":finish": Mark a sourced file as finished.
+ */
+    void
+ex_finish(exarg_T *eap)
+{
+    if (getline_equal(eap->getline, eap->cookie, getsourceline))
+	do_finish(eap, FALSE);
+    else
+	emsg(_("E168: :finish used outside of a sourced file"));
+}
+
+/*
+ * Mark a sourced file as finished.  Possibly makes the ":finish" pending.
+ * Also called for a pending finish at the ":endtry" or after returning from
+ * an extra do_cmdline().  "reanimate" is used in the latter case.
+ */
+    void
+do_finish(exarg_T *eap, int reanimate)
+{
+    int		idx;
+
+    if (reanimate)
+	((struct source_cookie *)getline_cookie(eap->getline,
+					      eap->cookie))->finished = FALSE;
+
+    // Cleanup (and inactivate) conditionals, but stop when a try conditional
+    // not in its finally clause (which then is to be executed next) is found.
+    // In this case, make the ":finish" pending for execution at the ":endtry".
+    // Otherwise, finish normally.
+    idx = cleanup_conditionals(eap->cstack, 0, TRUE);
+    if (idx >= 0)
+    {
+	eap->cstack->cs_pending[idx] = CSTP_FINISH;
+	report_make_pending(CSTP_FINISH, NULL);
+    }
+    else
+	((struct source_cookie *)getline_cookie(eap->getline,
+					       eap->cookie))->finished = TRUE;
+}
+
+
+/*
+ * Return TRUE when a sourced file had the ":finish" command: Don't give error
+ * message for missing ":endif".
+ * Return FALSE when not sourcing a file.
+ */
+    int
+source_finished(
+    char_u	*(*fgetline)(int, void *, int, int),
+    void	*cookie)
+{
+    return (getline_equal(fgetline, cookie, getsourceline)
+	    && ((struct source_cookie *)getline_cookie(
+						fgetline, cookie))->finished);
+}
+#endif
diff --git a/src/version.c b/src/version.c
index 35112b5..264a0b9 100644
--- a/src/version.c
+++ b/src/version.c
@@ -762,6 +762,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1927,
+/**/
     1926,
 /**/
     1925,
