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
