diff --git a/ex.c b/ex.c
index 372a5688..f55b885a 100644
--- a/ex.c
+++ b/ex.c
@@ -1393,7 +1393,7 @@ void ex(void)
 	xgrec--;
 }
 
-void ex_init(char **files, int n)
+void ex_init(char **files, int n, char **cmds, int cmdnum)
 {
 	xbufsalloc = MAX(n, xbufsalloc);
 	ec_setbufsmax(NULL, NULL, "");
@@ -1406,4 +1406,6 @@ void ex_init(char **files, int n)
 	xvis &= ~8;
 	if ((s = getenv("EXINIT")))
 		ex_command(s)
+	for (int i = 0; i < cmdnum; i++)
+		ex_command(cmds[i])
 }
diff --git a/vi.c b/vi.c
index b83a1df9..cfb969ca 100644
--- a/vi.c
+++ b/vi.c
@@ -1782,7 +1782,8 @@ static int setup_signals(void)
 
 int main(int argc, char *argv[])
 {
-	int i, j;
+	int i, j, cmdnum = 0;
+	char *ex_cmds[argc - 1];
 	if (!setup_signals())
 		return EXIT_FAILURE;
 	dir_init();
@@ -1803,16 +1804,27 @@ int main(int argc, char *argv[])
 				xvis |= 8;
 			else if (argv[i][j] == 'v')
 				xvis &= ~4;
-			else {
+			else if (argv[i][j] == 'c') {
+				if (argv[i][j+1]) {
+					ex_cmds[cmdnum++] = argv[i] + j + 1;
+					break;
+				} else if (i + 1 < argc) {
+					ex_cmds[cmdnum++] = argv[++i];
+					break;
+				} else {
+					fprintf(stderr, "Missing argument for -c\n");
+					return EXIT_FAILURE;
+				}
+			} else {
 				fprintf(stderr, "Unknown option: -%c\n", argv[i][j]);
-				fprintf(stderr, "Nextvi-1.8 Usage: %s [-emsv] [file ...]\n", argv[0]);
+				fprintf(stderr, "Nextvi-1.8 Usage: %s [-emsv] [-c cmd] [file ...]\n", argv[0]);
 				return EXIT_FAILURE;
 			}
 		}
 	}
 	ibuf = emalloc(ibuf_sz);
 	term_init();
-	ex_init(argv + i, argc - i);
+	ex_init(argv + i, argc - i, ex_cmds, cmdnum);
 	if (xvis & 4)
 		ex();
 	else
diff --git a/vi.h b/vi.h
index 1bef0600..518c56c9 100644
--- a/vi.h
+++ b/vi.h
@@ -450,7 +450,7 @@ void *ex_exec(const char *ln);
 void ex_cprint(char *line, char *ft, int r, int c, int ln);
 #define ex_print(line, ft) \
 { preserve(int, xleft, xleft = 0;) RS(2, ex_cprint(line, ft, -1, 0, 1)); restore(xleft) }
-void ex_init(char **files, int n);
+void ex_init(char **files, int n, char** cmds, int cmdnum);
 void ex_bufpostfix(struct buf *p, int clear);
 int ex_krs(rset **krs, int *dir);
 void ex_krsset(char *kwd, int dir);
