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:
parent
aef5c62a6f
commit
c024b46678
@ -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()
|
||||||
|
10
src/buffer.c
10
src/buffer.c
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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 */
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user