]> granicus.if.org Git - vim/commitdiff
patch 8.1.1498: ":write" increments b:changedtick even though nothing changed v8.1.1498
authorBram Moolenaar <Bram@vim.org>
Sat, 8 Jun 2019 16:07:21 +0000 (18:07 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 8 Jun 2019 16:07:21 +0000 (18:07 +0200)
Problem:    ":write" increments b:changedtick even though nothing changed.
            (Daniel Hahler)
Solution:   Only increment b:changedtick if the modified flag is reset.

runtime/doc/eval.txt
src/buffer.c
src/change.c
src/ex_cmds2.c
src/fileio.c
src/memline.c
src/proto/change.pro
src/undo.c
src/version.c

index 0b44e58e24db9792defa73f7f9db367cfa8b6076..85230a60a4fd0a3d152a1a05d5d8a318023ccbe5 100644 (file)
@@ -1504,8 +1504,10 @@ One local buffer variable is predefined:
                                        *b:changedtick* *changetick*
 b:changedtick  The total number of changes to the current buffer.  It is
                incremented for each change.  An undo command is also a change
-               in this case.  This can be used to perform an action only when
-               the buffer has changed.  Example: >
+               in this case.  Resetting 'modified' when writing the buffer is
+               also counted.
+               This can be used to perform an action only when the buffer has
+               changed.  Example: >
                    :if my_changedtick != b:changedtick
                    :   let my_changedtick = b:changedtick
                    :   call My_Update()
index 66f6fc654c79003de7a7adb847c4ceaf46210689..e6ae09d255588b2182c565128f167c6ce336c92e 100644 (file)
@@ -60,7 +60,9 @@ static char *e_auabort = N_("E855: Autocommands caused command to abort");
 /* Number of times free_buffer() was called. */
 static int     buf_free_count = 0;
 
-/* Read data from buffer for retrying. */
+/*
+ * Read data from buffer for retrying.
+ */
     static int
 read_buffer(
     int                read_stdin,         /* read file from stdin, otherwise fifo */
@@ -104,7 +106,7 @@ read_buffer(
        if (!readonlymode && !BUFEMPTY())
            changed();
        else if (retval == OK)
-           unchanged(curbuf, FALSE);
+           unchanged(curbuf, FALSE, TRUE);
 
        if (retval == OK)
        {
@@ -275,7 +277,7 @@ open_buffer(
        )
        changed();
     else if (retval == OK && !read_stdin && !read_fifo)
-       unchanged(curbuf, FALSE);
+       unchanged(curbuf, FALSE, TRUE);
     save_file_ff(curbuf);              /* keep this fileformat */
 
     /* Set last_changedtick to avoid triggering a TextChanged autocommand right
@@ -700,7 +702,7 @@ aucmd_abort:
 buf_clear_file(buf_T *buf)
 {
     buf->b_ml.ml_line_count = 1;
-    unchanged(buf, TRUE);
+    unchanged(buf, TRUE, TRUE);
     buf->b_shortname = FALSE;
     buf->b_p_eol = TRUE;
     buf->b_start_eol = TRUE;
index fcaa5708a98e59eed29909889c08864ca3ef1227..b928786eb03322a3fae8507a671d72ff6a4ba24f 100644 (file)
@@ -842,9 +842,11 @@ changed_lines(
 /*
  * Called when the changed flag must be reset for buffer "buf".
  * When "ff" is TRUE also reset 'fileformat'.
+ * When "always_inc_changedtick" is TRUE b:changedtick is incremented also when
+ * the changed flag was off.
  */
     void
-unchanged(buf_T *buf, int ff)
+unchanged(buf_T *buf, int ff, int always_inc_changedtick)
 {
     if (buf->b_changed || (ff && file_ff_differs(buf, FALSE)))
     {
@@ -857,8 +859,10 @@ unchanged(buf_T *buf, int ff)
 #ifdef FEAT_TITLE
        need_maketitle = TRUE;      // set window title later
 #endif
+       ++CHANGEDTICK(buf);
     }
-    ++CHANGEDTICK(buf);
+    else if (always_inc_changedtick)
+       ++CHANGEDTICK(buf);
 #ifdef FEAT_NETBEANS_INTG
     netbeans_unmodified(buf);
 #endif
index 66e5fca1282975f5c6c73d023f358e4d3143945a..3c73030e6b7b07f8d925d59fecef3d6d44ab856c 100644 (file)
@@ -1197,7 +1197,7 @@ dialog_changed(
     }
     else if (ret == VIM_NO)
     {
-       unchanged(buf, TRUE);
+       unchanged(buf, TRUE, FALSE);
     }
     else if (ret == VIM_ALL)
     {
@@ -1240,7 +1240,7 @@ dialog_changed(
         * mark all buffers as unchanged
         */
        FOR_ALL_BUFFERS(buf2)
-           unchanged(buf2, TRUE);
+           unchanged(buf2, TRUE, FALSE);
     }
 }
 #endif
index d746298a7c2ed3e3932af58561802a65d09cd190..e6fb6bfaee142bb59b7352c5136909c4e57afa26 100644 (file)
@@ -4908,8 +4908,8 @@ restore_backup:
            && !write_info.bw_conv_error
            && (overwriting || vim_strchr(p_cpo, CPO_PLUS) != NULL))
     {
-       unchanged(buf, TRUE);
-       /* b:changedtick is always incremented in unchanged() but that
+       unchanged(buf, TRUE, FALSE);
+       /* b:changedtick is may be incremented in unchanged() but that
         * should not trigger a TextChanged event. */
        if (buf->b_last_changedtick + 1 == CHANGEDTICK(buf))
            buf->b_last_changedtick = CHANGEDTICK(buf);
@@ -7081,7 +7081,7 @@ buf_reload(buf_T *buf, int orig_mode)
            else if (buf == curbuf)  /* "buf" still valid */
            {
                /* Mark the buffer as unmodified and free undo info. */
-               unchanged(buf, TRUE);
+               unchanged(buf, TRUE, TRUE);
                if ((flags & READ_KEEP_UNDO) == 0)
                {
                    u_blockfree(buf);
index 5ae99dfd95fe12dcbd69bcc704f0a076600dac31..e7ae6dfb5b941e3a019f67110c5d1a3d6ad84265 100644 (file)
@@ -1435,7 +1435,7 @@ ml_recover(int checkext)
        set_option_value((char_u *)"fenc", 0L, b0_fenc, OPT_LOCAL);
        vim_free(b0_fenc);
     }
-    unchanged(curbuf, TRUE);
+    unchanged(curbuf, TRUE, TRUE);
 
     bnum = 1;          /* start with block 1 */
     page_count = 1;    /* which is 1 page */
index 79306e30616ec86a27145147f862a168343a0cf3..de3a94a9d8baa681abfb75791192efb26636a6e2 100644 (file)
@@ -14,7 +14,7 @@ void appended_lines_mark(linenr_T lnum, long count);
 void deleted_lines(linenr_T lnum, long count);
 void deleted_lines_mark(linenr_T lnum, long count);
 void changed_lines(linenr_T lnum, colnr_T col, linenr_T lnume, long xtra);
-void unchanged(buf_T *buf, int ff);
+void unchanged(buf_T *buf, int ff, int always_inc_changedtick);
 void ins_bytes(char_u *p);
 void ins_bytes_len(char_u *p, int len);
 void ins_char(int c);
index cf3f866e815531b1a96e3eb62cd8fa9a60def73c..dd46670013c9bab439809864b7f52565a7b8e04c 100644 (file)
@@ -2805,7 +2805,7 @@ u_undoredo(int undo)
        /* per netbeans undo rules, keep it as modified */
        if (!isNetbeansModified(curbuf))
 #endif
-       unchanged(curbuf, FALSE);
+       unchanged(curbuf, FALSE, TRUE);
 
     /*
      * restore marks from before undo/redo
index 8aac5d5f668afa4ac200c5c24e6ee492d7f5f293..79b0d55ae422905f40c0efd93c9f8ab2dc379637 100644 (file)
@@ -767,6 +767,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1498,
 /**/
     1497,
 /**/