0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

patch 8.1.1498: ":write" increments b:changedtick even though nothing changed

Problem:    ":write" increments b:changedtick even though nothing changed.
            (Daniel Hahler)
Solution:   Only increment b:changedtick if the modified flag is reset.
This commit is contained in:
Bram Moolenaar 2019-06-08 18:07:21 +02:00
parent aef5c62a6f
commit c024b46678
9 changed files with 26 additions and 16 deletions

View File

@ -1504,8 +1504,10 @@ One local buffer variable is predefined:
*b:changedtick* *changetick* *b:changedtick* *changetick*
b:changedtick The total number of changes to the current buffer. It is b:changedtick The total number of changes to the current buffer. It is
incremented for each change. An undo command is also a change incremented for each change. An undo command is also a change
in this case. This can be used to perform an action only when in this case. Resetting 'modified' when writing the buffer is
the buffer has changed. Example: > also counted.
This can be used to perform an action only when the buffer has
changed. Example: >
:if my_changedtick != b:changedtick :if my_changedtick != b:changedtick
: let my_changedtick = b:changedtick : let my_changedtick = b:changedtick
: call My_Update() : call My_Update()

View File

@ -60,7 +60,9 @@ static char *e_auabort = N_("E855: Autocommands caused command to abort");
/* Number of times free_buffer() was called. */ /* Number of times free_buffer() was called. */
static int buf_free_count = 0; static int buf_free_count = 0;
/* Read data from buffer for retrying. */ /*
* Read data from buffer for retrying.
*/
static int static int
read_buffer( read_buffer(
int read_stdin, /* read file from stdin, otherwise fifo */ int read_stdin, /* read file from stdin, otherwise fifo */
@ -104,7 +106,7 @@ read_buffer(
if (!readonlymode && !BUFEMPTY()) if (!readonlymode && !BUFEMPTY())
changed(); changed();
else if (retval == OK) else if (retval == OK)
unchanged(curbuf, FALSE); unchanged(curbuf, FALSE, TRUE);
if (retval == OK) if (retval == OK)
{ {
@ -275,7 +277,7 @@ open_buffer(
) )
changed(); changed();
else if (retval == OK && !read_stdin && !read_fifo) else if (retval == OK && !read_stdin && !read_fifo)
unchanged(curbuf, FALSE); unchanged(curbuf, FALSE, TRUE);
save_file_ff(curbuf); /* keep this fileformat */ save_file_ff(curbuf); /* keep this fileformat */
/* Set last_changedtick to avoid triggering a TextChanged autocommand right /* Set last_changedtick to avoid triggering a TextChanged autocommand right
@ -700,7 +702,7 @@ aucmd_abort:
buf_clear_file(buf_T *buf) buf_clear_file(buf_T *buf)
{ {
buf->b_ml.ml_line_count = 1; buf->b_ml.ml_line_count = 1;
unchanged(buf, TRUE); unchanged(buf, TRUE, TRUE);
buf->b_shortname = FALSE; buf->b_shortname = FALSE;
buf->b_p_eol = TRUE; buf->b_p_eol = TRUE;
buf->b_start_eol = TRUE; buf->b_start_eol = TRUE;

View File

@ -842,9 +842,11 @@ changed_lines(
/* /*
* Called when the changed flag must be reset for buffer "buf". * Called when the changed flag must be reset for buffer "buf".
* When "ff" is TRUE also reset 'fileformat'. * 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 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))) if (buf->b_changed || (ff && file_ff_differs(buf, FALSE)))
{ {
@ -857,8 +859,10 @@ unchanged(buf_T *buf, int ff)
#ifdef FEAT_TITLE #ifdef FEAT_TITLE
need_maketitle = TRUE; // set window title later need_maketitle = TRUE; // set window title later
#endif #endif
++CHANGEDTICK(buf);
} }
++CHANGEDTICK(buf); else if (always_inc_changedtick)
++CHANGEDTICK(buf);
#ifdef FEAT_NETBEANS_INTG #ifdef FEAT_NETBEANS_INTG
netbeans_unmodified(buf); netbeans_unmodified(buf);
#endif #endif

View File

@ -1197,7 +1197,7 @@ dialog_changed(
} }
else if (ret == VIM_NO) else if (ret == VIM_NO)
{ {
unchanged(buf, TRUE); unchanged(buf, TRUE, FALSE);
} }
else if (ret == VIM_ALL) else if (ret == VIM_ALL)
{ {
@ -1240,7 +1240,7 @@ dialog_changed(
* mark all buffers as unchanged * mark all buffers as unchanged
*/ */
FOR_ALL_BUFFERS(buf2) FOR_ALL_BUFFERS(buf2)
unchanged(buf2, TRUE); unchanged(buf2, TRUE, FALSE);
} }
} }
#endif #endif

View File

@ -4908,8 +4908,8 @@ restore_backup:
&& !write_info.bw_conv_error && !write_info.bw_conv_error
&& (overwriting || vim_strchr(p_cpo, CPO_PLUS) != NULL)) && (overwriting || vim_strchr(p_cpo, CPO_PLUS) != NULL))
{ {
unchanged(buf, TRUE); unchanged(buf, TRUE, FALSE);
/* b:changedtick is always incremented in unchanged() but that /* b:changedtick is may be incremented in unchanged() but that
* should not trigger a TextChanged event. */ * should not trigger a TextChanged event. */
if (buf->b_last_changedtick + 1 == CHANGEDTICK(buf)) if (buf->b_last_changedtick + 1 == CHANGEDTICK(buf))
buf->b_last_changedtick = 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 */ else if (buf == curbuf) /* "buf" still valid */
{ {
/* Mark the buffer as unmodified and free undo info. */ /* Mark the buffer as unmodified and free undo info. */
unchanged(buf, TRUE); unchanged(buf, TRUE, TRUE);
if ((flags & READ_KEEP_UNDO) == 0) if ((flags & READ_KEEP_UNDO) == 0)
{ {
u_blockfree(buf); u_blockfree(buf);

View File

@ -1435,7 +1435,7 @@ ml_recover(int checkext)
set_option_value((char_u *)"fenc", 0L, b0_fenc, OPT_LOCAL); set_option_value((char_u *)"fenc", 0L, b0_fenc, OPT_LOCAL);
vim_free(b0_fenc); vim_free(b0_fenc);
} }
unchanged(curbuf, TRUE); unchanged(curbuf, TRUE, TRUE);
bnum = 1; /* start with block 1 */ bnum = 1; /* start with block 1 */
page_count = 1; /* which is 1 page */ page_count = 1; /* which is 1 page */

View 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(linenr_T lnum, long count);
void deleted_lines_mark(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 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(char_u *p);
void ins_bytes_len(char_u *p, int len); void ins_bytes_len(char_u *p, int len);
void ins_char(int c); void ins_char(int c);

View File

@ -2805,7 +2805,7 @@ u_undoredo(int undo)
/* per netbeans undo rules, keep it as modified */ /* per netbeans undo rules, keep it as modified */
if (!isNetbeansModified(curbuf)) if (!isNetbeansModified(curbuf))
#endif #endif
unchanged(curbuf, FALSE); unchanged(curbuf, FALSE, TRUE);
/* /*
* restore marks from before undo/redo * restore marks from before undo/redo

View File

@ -767,6 +767,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1498,
/**/ /**/
1497, 1497,
/**/ /**/