diff -r d9573e846b47 src/globals.h
--- a/src/globals.h	Tue Jul 10 19:25:10 2012 +0200
+++ b/src/globals.h	Mon Jul 16 11:14:12 2012 +0200
@@ -1008,6 +1008,8 @@
 EXTERN int	need_highlight_changed INIT(= TRUE);
 EXTERN char_u	*use_viminfo INIT(= NULL);  /* name of viminfo file to use */
 
+EXTERN FILE	*filesin[1];
+
 #define NSCRIPT 15
 EXTERN FILE	*scriptin[NSCRIPT];	    /* streams to read script from */
 EXTERN int	curscript INIT(= 0);	    /* index in scriptin[] */
diff -r d9573e846b47 src/main.c
--- a/src/main.c	Tue Jul 10 19:25:10 2012 +0200
+++ b/src/main.c	Mon Jul 16 11:14:12 2012 +0200
@@ -2146,6 +2146,7 @@
 		    break;
 		}
 		/*FALLTHROUGH*/
+        case 'Y':		/* "-Y {file} read list of files to edit from {file}" */
 	    case 'S':		/* "-S {file}" execute Vim script */
 	    case 'i':		/* "-i {viminfo}" use for viminfo */
 #ifndef FEAT_DIFF
@@ -2317,6 +2318,107 @@
 		    }
 		    break;
 
+        case 'Y':		/* "-Y {file} read list of files to edit from {file} */
+		    if ((filesin[0] = mch_fopen(argv[0], READBIN)) == NULL)
+		    {
+			mch_errmsg(_("Cannot open for reading: \""));
+			mch_errmsg(argv[0]);
+			mch_errmsg("\"\n");
+			mch_exit(2);
+		    }
+
+            p = alloc(2000 * sizeof(char) + 1);
+            while (!vim_fgets(p, 2000 * sizeof(char), filesin[0])) {
+                argv_idx = -1;	    /* skip to next argument */
+
+                /* Check for only one type of editing. */
+                if (parmp->edit_type != EDIT_NONE && parmp->edit_type != EDIT_FILE)
+                mainerr(ME_TOO_MANY_ARGS, (char_u *)p);
+                parmp->edit_type = EDIT_FILE;
+
+#ifdef MSWIN
+                /* Remember if the argument was a full path before changing
+                 * slashes to backslashes. */
+                if (p[0] != NUL && p[1] == ':' && p[2] == '\\')
+                parmp->full_path = TRUE;
+#endif
+
+                /* Add the file to the global argument list. */
+                if (ga_grow(&global_alist.al_ga, 1) == FAIL)
+                mch_exit(2);
+#ifdef FEAT_DIFF
+                if (parmp->diff_mode && mch_isdir(p) && GARGCOUNT > 0
+                              && !mch_isdir(alist_name(&GARGLIST[0])))
+                {
+                char_u	    *r;
+
+                r = concat_fnames(p, gettail(alist_name(&GARGLIST[0])), TRUE);
+                if (r != NULL)
+                {
+                    vim_free(p);
+                    p = r;
+                }
+                }
+#endif
+#if defined(__CYGWIN32__) && !defined(WIN32)
+                /*
+                 * If vim is invoked by non-Cygwin tools, convert away any
+                 * DOS paths, so things like .swp files are created correctly.
+                 * Look for evidence of non-Cygwin paths before we bother.
+                 * This is only for when using the Unix files.
+                 */
+                if (strpbrk(p, "\\:") != NULL && !path_with_url(p))
+                {
+                char posix_path[PATH_MAX];
+
+# if CYGWIN_VERSION_DLL_MAJOR >= 1007
+                cygwin_conv_path(CCP_WIN_A_TO_POSIX, p, posix_path, PATH_MAX);
+# else
+                cygwin_conv_to_posix_path(p, posix_path);
+# endif
+                vim_free(p);
+                p = vim_strsave(posix_path);
+                if (p == NULL)
+                    mch_exit(2);
+                }
+#endif
+
+#ifdef USE_FNAME_CASE
+                /* Make the case of the file name match the actual file. */
+                fname_case(p, 0);
+#endif
+
+                while (p[(int)STRLEN(p) - 1] == '\n' || p[(int)STRLEN(p) - 1] == '\r')
+                    p[(int)STRLEN(p) - 1] = '\0';
+
+                alist_add(&global_alist, p,
+#if (!defined(UNIX) && !defined(__EMX__)) || defined(ARCHIE)
+                    parmp->literal ? 2 : 0	/* add buffer nr after exp. */
+#else
+                    2		/* add buffer number now and use curbuf */
+#endif
+                    );
+
+#if defined(FEAT_MBYTE) && defined(WIN32)
+                {
+                /* Remember this argument has been added to the argument list.
+                 * Needed when 'encoding' is changed. */
+                used_file_arg(p, parmp->literal, parmp->full_path,
+# ifdef FEAT_DIFF
+                                        parmp->diff_mode
+# else
+                                        FALSE
+# endif
+                                        );
+                }
+#endif
+                vim_free(p);
+                p = alloc(2000 * sizeof(char) + 1);
+            }
+            vim_free(p);
+            fclose(filesin[0]);
+            break;
+
 #ifdef FEAT_GUI_W32
 		case 'P':		/* "-P {parent title}" MDI parent */
 		    gui_mch_set_parent(argv[0]);
@@ -3249,6 +3351,7 @@
     main_msg(_("-s <scriptin>\tRead Normal mode commands from file <scriptin>"));
     main_msg(_("-w <scriptout>\tAppend all typed commands to file <scriptout>"));
     main_msg(_("-W <scriptout>\tWrite all typed commands to file <scriptout>"));
+    main_msg(_("-Y <filein>\t\tAppend file names from <filein> to edit file list"));
 #ifdef FEAT_CRYPT
     main_msg(_("-x\t\t\tEdit encrypted files"));
 #endif
