[git commit] vi: add ":prev" command support

Denys Vlasenko vda.linux at googlemail.com
Tue Jan 31 13:12:38 UTC 2012


commit: http://git.busybox.net/busybox/commit/?id=c0657e0d0a3a818e2c857f99f0b0ddf936324fdb
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

function                                             old     new   delta
colon                                               2844    2891     +47
vi_main                                              243     255     +12
text_yank                                             54      56      +2
refresh                                              780     774      -6

Signed-off-by: Dennis Groenen <tj.groenen at gmail.com>
Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 editors/vi.c |   29 ++++++++++++++++++-----------
 1 files changed, 18 insertions(+), 11 deletions(-)

diff --git a/editors/vi.c b/editors/vi.c
index f7b9f38..b4ad12e 100644
--- a/editors/vi.c
+++ b/editors/vi.c
@@ -278,7 +278,6 @@ struct globals {
 	smallint cmd_mode;       // 0=command  1=insert 2=replace
 	int file_modified;       // buffer contents changed (counter, not flag!)
 	int last_file_modified;  // = -1;
-	int fn_start;            // index of first cmd line file name
 	int save_argc;           // how many file names on cmd line
 	int cmdcnt;              // repetition count
 	unsigned rows, columns;	 // the terminal screen is this size
@@ -363,7 +362,6 @@ struct globals {
 #define cmd_mode                (G.cmd_mode           )
 #define file_modified           (G.file_modified      )
 #define last_file_modified      (G.last_file_modified )
-#define fn_start                (G.fn_start           )
 #define save_argc               (G.save_argc          )
 #define cmdcnt                  (G.cmdcnt             )
 #define rows                    (G.rows               )
@@ -599,9 +597,10 @@ int vi_main(int argc, char **argv)
 	}
 
 	// The argv array can be used by the ":next"  and ":rewind" commands
-	// save optind.
-	fn_start = optind;	// remember first file name for :next and :rew
+	argv += optind;
+	argc -= optind;
 	save_argc = argc;
+	optind = 0;
 
 	//----- This is the main file handling loop --------------
 	while (1) {
@@ -1021,7 +1020,7 @@ static void colon(char *buf)
 	} else if (strncmp(cmd, "edit", i) == 0) {	// Edit a file
 		// don't edit, if the current file has been modified
 		if (file_modified && !useforce) {
-			status_line_bold("No write since last change (:edit! overrides)");
+			status_line_bold("No write since last change (:%s! overrides)", cmd);
 			goto ret;
 		}
 		if (args[0]) {
@@ -1111,11 +1110,12 @@ static void colon(char *buf)
 		Hit_Return();
 	} else if (strncmp(cmd, "quit", i) == 0 // quit
 	        || strncmp(cmd, "next", i) == 0 // edit next file
+	        || strncmp(cmd, "prev", i) == 0 // edit previous file
 	) {
 		int n;
 		if (useforce) {
-			// force end of argv list
 			if (*cmd == 'q') {
+				// force end of argv list
 				optind = save_argc;
 			}
 			editing = 0;
@@ -1123,8 +1123,7 @@ static void colon(char *buf)
 		}
 		// don't exit if the file been modified
 		if (file_modified) {
-			status_line_bold("No write since last change (:%s! overrides)",
-				 (*cmd == 'q' ? "quit" : "next"));
+			status_line_bold("No write since last change (:%s! overrides)", cmd);
 			goto ret;
 		}
 		// are there other file to edit
@@ -1137,6 +1136,14 @@ static void colon(char *buf)
 			status_line_bold("No more files to edit");
 			goto ret;
 		}
+		if (*cmd == 'p') {
+			// are there previous files to edit
+			if (optind < 1) {
+				status_line_bold("No previous files to edit");
+				goto ret;
+			}
+			optind -= 2;
+		}
 		editing = 0;
 	} else if (strncmp(cmd, "read", i) == 0) {	// read file into text[]
 		fn = args;
@@ -1172,10 +1179,10 @@ static void colon(char *buf)
 		}
 	} else if (strncmp(cmd, "rewind", i) == 0) {	// rewind cmd line args
 		if (file_modified && !useforce) {
-			status_line_bold("No write since last change (:rewind! overrides)");
+			status_line_bold("No write since last change (:%s! overrides)", cmd);
 		} else {
 			// reset the filenames to edit
-			optind = fn_start - 1;
+			optind = -1; /* start from 0th file */
 			editing = 0;
 		}
 #if ENABLE_FEATURE_VI_SET
@@ -3507,7 +3514,7 @@ static void do_cmd(int c)
 		 || strncmp(p, "q!", cnt) == 0   // delete lines
 		) {
 			if (file_modified && p[1] != '!') {
-				status_line_bold("No write since last change (:quit! overrides)");
+				status_line_bold("No write since last change (:%s! overrides)", p);
 			} else {
 				editing = 0;
 			}


More information about the busybox-cvs mailing list