Add the 'undoreload' option to be able to undo a file reload.
diff --git a/src/fileio.c b/src/fileio.c
index aa3143e..1c0ac85 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -219,6 +219,7 @@
* READ_BUFFER read from curbuf instead of a file (converting after reading
* stdin)
* READ_DUMMY read into a dummy buffer (to check if file contents changed)
+ * READ_KEEP_UNDO don't clear undo info or read it from a file
*
* return FAIL for failure, OK otherwise
*/
@@ -1195,8 +1196,12 @@
conv_restlen = 0;
#endif
#ifdef FEAT_PERSISTENT_UNDO
- read_undo_file = (newfile && curbuf->b_ffname != NULL && curbuf->b_p_udf
- && !filtering && !read_stdin && !read_buffer);
+ read_undo_file = (newfile && (flags & READ_KEEP_UNDO) == 0
+ && curbuf->b_ffname != NULL
+ && curbuf->b_p_udf
+ && !filtering
+ && !read_stdin
+ && !read_buffer);
if (read_undo_file)
sha256_start(&sha_ctx);
#endif
@@ -7077,6 +7082,7 @@
buf_T *savebuf;
int saved = OK;
aco_save_T aco;
+ int flags = READ_NEW;
/* set curwin/curbuf for "buf" and save some things */
aucmd_prepbuf(&aco, buf);
@@ -7089,6 +7095,15 @@
old_cursor = curwin->w_cursor;
old_topline = curwin->w_topline;
+ if (saved == OK && (p_ur < 0 || curbuf->b_ml.ml_line_count <= p_ur))
+ {
+ /* Save all the text, so that the reload can be undone.
+ * Sync first so that this is a separate undo-able action. */
+ u_sync(FALSE);
+ saved = u_savecommon(0, curbuf->b_ml.ml_line_count + 1, 0, TRUE);
+ flags |= READ_KEEP_UNDO;
+ }
+
/*
* To behave like when a new file is edited (matters for
* BufReadPost autocommands) we first need to delete the current
@@ -7096,7 +7111,7 @@
* the old contents. Can't use memory only, the file might be
* too big. Use a hidden buffer to move the buffer contents to.
*/
- if (bufempty())
+ if (bufempty() || saved == FAIL)
savebuf = NULL;
else
{
@@ -7128,7 +7143,7 @@
#endif
if (readfile(buf->b_ffname, buf->b_fname, (linenr_T)0,
(linenr_T)0,
- (linenr_T)MAXLNUM, &ea, READ_NEW) == FAIL)
+ (linenr_T)MAXLNUM, &ea, flags) == FAIL)
{
#if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
if (!aborting())
@@ -7144,12 +7159,18 @@
(void)move_lines(savebuf, buf);
}
}
- else if (buf == curbuf)
+ else if (buf == curbuf) /* "buf" still valid */
{
/* Mark the buffer as unmodified and free undo info. */
unchanged(buf, TRUE);
- u_blockfree(buf);
- u_clearall(buf);
+ if ((flags & READ_KEEP_UNDO) == 0)
+ {
+ u_blockfree(buf);
+ u_clearall(buf);
+ }
+ else
+ /* Mark all undo states as changed. */
+ u_unchanged(curbuf);
}
}
vim_free(ea.cmd);