vi: don't touch file with :x when modified_count == 0
authorDenys Vlasenko <vda.linux@googlemail.com>
Mon, 13 Mar 2017 19:50:42 +0000 (20:50 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Mon, 13 Mar 2017 19:50:42 +0000 (20:50 +0100)
Along with it, there are other changes

 - Check for uppercase X is removed as the expression will be always false and
   :X itself is another totally different command in standard vim
 - The status line will show number of written lines instead of lines requested
   by the colon command.  This is also how the standard vim is doing, though
   the difference is that '!' has to be explicitly specified in vim to allow
   partial writes

Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
editors/vi.c

index bbaac50df6c1e91d18e7ce28af2ee0d14862291d..1e39b52ff72540f813f199470b8e15f2a56f5113 100644 (file)
@@ -1034,7 +1034,9 @@ static void colon(char *buf)
         || strncmp(p, "wn", cnt) == 0
         || (p[0] == 'x' && !p[1])
        ) {
-               cnt = file_write(current_filename, text, end - 1);
+               if (modified_count != 0 || p[0] != 'x') {
+                       cnt = file_write(current_filename, text, end - 1);
+               }
                if (cnt < 0) {
                        if (cnt == -1)
                                status_line_bold("Write error: %s", strerror(errno));
@@ -1045,8 +1047,9 @@ static void colon(char *buf)
                                current_filename,
                                count_lines(text, end - 1), cnt
                        );
-                       if (p[0] == 'x' || p[1] == 'q' || p[1] == 'n'
-                        || p[0] == 'X' || p[1] == 'Q' || p[1] == 'N'
+                       if (p[0] == 'x'
+                        || p[1] == 'q' || p[1] == 'n'
+                        || p[1] == 'Q' || p[1] == 'N'
                        ) {
                                editing = 0;
                        }
@@ -1476,16 +1479,19 @@ static void colon(char *buf)
                        goto ret;
                }
 #endif
-               // how many lines in text[]?
-               li = count_lines(q, r);
-               size = r - q + 1;
                //if (useforce) {
                        // if "fn" is not write-able, chmod u+w
                        // sprintf(syscmd, "chmod u+w %s", fn);
                        // system(syscmd);
                        // forced = TRUE;
                //}
-               l = file_write(fn, q, r);
+               if (modified_count != 0 || cmd[0] != 'x') {
+                       size = r - q + 1;
+                       l = file_write(fn, q, r);
+               } else {
+                       size = 0;
+                       l = 0;
+               }
                //if (useforce && forced) {
                        // chmod u-w
                        // sprintf(syscmd, "chmod u-w %s", fn);
@@ -1496,17 +1502,20 @@ static void colon(char *buf)
                        if (l == -1)
                                status_line_bold_errno(fn);
                } else {
+                       // how many lines written
+                       li = count_lines(q, q + l - 1);
                        status_line("'%s' %dL, %dC", fn, li, l);
-                       if (q == text && r == end - 1 && l == size) {
-                               modified_count = 0;
-                               last_modified_count = -1;
-                       }
-                       if ((cmd[0] == 'x' || cmd[1] == 'q' || cmd[1] == 'n'
-                           || cmd[0] == 'X' || cmd[1] == 'Q' || cmd[1] == 'N'
-                           )
-                        && l == size
-                       ) {
-                               editing = 0;
+                       if (l == size) {
+                               if (q == text && q + l == end) {
+                                       modified_count = 0;
+                                       last_modified_count = -1;
+                               }
+                               if (cmd[0] == 'x'
+                                || cmd[1] == 'q' || cmd[1] == 'n'
+                                || cmd[1] == 'Q' || cmd[1] == 'N'
+                               ) {
+                                       editing = 0;
+                               }
                        }
                }
 #if ENABLE_FEATURE_VI_YANKMARK