mirror of
https://github.com/vim/vim.git
synced 2025-09-07 22:03:36 -04:00
updated for version 7.0082
This commit is contained in:
parent
b765d63491
commit
631d6f6847
291
src/fileio.c
291
src/fileio.c
@ -6156,146 +6156,8 @@ buf_check_timestamp(buf, focus)
|
||||
}
|
||||
|
||||
if (reload)
|
||||
{
|
||||
exarg_T ea;
|
||||
pos_T old_cursor;
|
||||
linenr_T old_topline;
|
||||
int old_ro = buf->b_p_ro;
|
||||
buf_T *savebuf;
|
||||
int saved = OK;
|
||||
#ifdef FEAT_AUTOCMD
|
||||
aco_save_T aco;
|
||||
|
||||
/* set curwin/curbuf for "buf" and save some things */
|
||||
aucmd_prepbuf(&aco, buf);
|
||||
#else
|
||||
buf_T *save_curbuf = curbuf;
|
||||
|
||||
curbuf = buf;
|
||||
curwin->w_buffer = buf;
|
||||
#endif
|
||||
|
||||
/* We only want to read the text from the file, not reset the syntax
|
||||
* highlighting, clear marks, diff status, etc. Force the fileformat
|
||||
* and encoding to be the same. */
|
||||
if (prep_exarg(&ea, buf) == OK)
|
||||
{
|
||||
old_cursor = curwin->w_cursor;
|
||||
old_topline = curwin->w_topline;
|
||||
|
||||
/*
|
||||
* To behave like when a new file is edited (matters for
|
||||
* BufReadPost autocommands) we first need to delete the current
|
||||
* buffer contents. But if reading the file fails we should keep
|
||||
* 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())
|
||||
savebuf = NULL;
|
||||
else
|
||||
{
|
||||
/* Allocate a buffer without putting it in the buffer list. */
|
||||
savebuf = buflist_new(NULL, NULL, (linenr_T)1, BLN_DUMMY);
|
||||
if (savebuf != NULL)
|
||||
{
|
||||
/* Open the memline. */
|
||||
curbuf = savebuf;
|
||||
curwin->w_buffer = savebuf;
|
||||
saved = ml_open();
|
||||
curbuf = buf;
|
||||
curwin->w_buffer = buf;
|
||||
}
|
||||
if (savebuf == NULL || saved == FAIL
|
||||
|| move_lines(buf, savebuf) == FAIL)
|
||||
{
|
||||
EMSG2(_("E462: Could not prepare for reloading \"%s\""),
|
||||
buf->b_fname);
|
||||
saved = FAIL;
|
||||
}
|
||||
}
|
||||
|
||||
if (saved == OK)
|
||||
{
|
||||
curbuf->b_flags |= BF_CHECK_RO; /* check for RO again */
|
||||
#ifdef FEAT_AUTOCMD
|
||||
keep_filetype = TRUE; /* don't detect 'filetype' */
|
||||
#endif
|
||||
if (readfile(buf->b_ffname, buf->b_fname, (linenr_T)0,
|
||||
(linenr_T)0,
|
||||
(linenr_T)MAXLNUM, &ea, READ_NEW) == FAIL)
|
||||
{
|
||||
#if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
|
||||
if (!aborting())
|
||||
#endif
|
||||
EMSG2(_("E321: Could not reload \"%s\""), buf->b_fname);
|
||||
if (savebuf != NULL)
|
||||
{
|
||||
/* Put the text back from the save buffer. First
|
||||
* delete any lines that readfile() added. */
|
||||
while (!bufempty())
|
||||
if (ml_delete(curbuf->b_ml.ml_line_count, FALSE)
|
||||
== FAIL)
|
||||
break;
|
||||
(void)move_lines(savebuf, buf);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Mark the buffer as unmodified and free undo info. */
|
||||
unchanged(buf, TRUE);
|
||||
u_blockfree(buf);
|
||||
u_clearall(buf);
|
||||
}
|
||||
}
|
||||
vim_free(ea.cmd);
|
||||
|
||||
if (savebuf != NULL)
|
||||
wipe_buffer(savebuf, FALSE);
|
||||
|
||||
#ifdef FEAT_DIFF
|
||||
/* Invalidate diff info if necessary. */
|
||||
diff_invalidate();
|
||||
#endif
|
||||
|
||||
/* Restore the topline and cursor position and check it (lines may
|
||||
* have been removed). */
|
||||
if (old_topline > curbuf->b_ml.ml_line_count)
|
||||
curwin->w_topline = curbuf->b_ml.ml_line_count;
|
||||
else
|
||||
curwin->w_topline = old_topline;
|
||||
curwin->w_cursor = old_cursor;
|
||||
check_cursor();
|
||||
update_topline();
|
||||
#ifdef FEAT_AUTOCMD
|
||||
keep_filetype = FALSE;
|
||||
#endif
|
||||
#ifdef FEAT_FOLDING
|
||||
{
|
||||
win_T *wp;
|
||||
|
||||
/* Update folds unless they are defined manually. */
|
||||
FOR_ALL_WINDOWS(wp)
|
||||
if (wp->w_buffer == curwin->w_buffer
|
||||
&& !foldmethodIsManual(wp))
|
||||
foldUpdateAll(wp);
|
||||
}
|
||||
#endif
|
||||
/* If the mode didn't change and 'readonly' was set, keep the old
|
||||
* value; the user probably used the ":view" command. But don't
|
||||
* reset it, might have had a read error. */
|
||||
if (orig_mode == curbuf->b_orig_mode)
|
||||
curbuf->b_p_ro |= old_ro;
|
||||
}
|
||||
|
||||
#ifdef FEAT_AUTOCMD
|
||||
/* restore curwin/curbuf and a few other things */
|
||||
aucmd_restbuf(&aco);
|
||||
/* Careful: autocommands may have made "buf" invalid! */
|
||||
#else
|
||||
curwin->w_buffer = save_curbuf;
|
||||
curbuf = save_curbuf;
|
||||
#endif
|
||||
}
|
||||
/* Reload the buffer. */
|
||||
buf_reload(buf);
|
||||
|
||||
#ifdef FEAT_GUI
|
||||
/* restore this in case an autocommand has set it; it would break
|
||||
@ -6306,6 +6168,155 @@ buf_check_timestamp(buf, focus)
|
||||
return retval;
|
||||
}
|
||||
|
||||
/*
|
||||
* Reload a buffer that is already loaded.
|
||||
* Used when the file was changed outside of Vim.
|
||||
*/
|
||||
void
|
||||
buf_reload(buf)
|
||||
buf_T *buf;
|
||||
{
|
||||
exarg_T ea;
|
||||
pos_T old_cursor;
|
||||
linenr_T old_topline;
|
||||
int old_ro = buf->b_p_ro;
|
||||
int orig_mode = buf->b_orig_mode;
|
||||
buf_T *savebuf;
|
||||
int saved = OK;
|
||||
#ifdef FEAT_AUTOCMD
|
||||
aco_save_T aco;
|
||||
|
||||
/* set curwin/curbuf for "buf" and save some things */
|
||||
aucmd_prepbuf(&aco, buf);
|
||||
#else
|
||||
buf_T *save_curbuf = curbuf;
|
||||
|
||||
curbuf = buf;
|
||||
curwin->w_buffer = buf;
|
||||
#endif
|
||||
|
||||
/* We only want to read the text from the file, not reset the syntax
|
||||
* highlighting, clear marks, diff status, etc. Force the fileformat
|
||||
* and encoding to be the same. */
|
||||
if (prep_exarg(&ea, buf) == OK)
|
||||
{
|
||||
old_cursor = curwin->w_cursor;
|
||||
old_topline = curwin->w_topline;
|
||||
|
||||
/*
|
||||
* To behave like when a new file is edited (matters for
|
||||
* BufReadPost autocommands) we first need to delete the current
|
||||
* buffer contents. But if reading the file fails we should keep
|
||||
* 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())
|
||||
savebuf = NULL;
|
||||
else
|
||||
{
|
||||
/* Allocate a buffer without putting it in the buffer list. */
|
||||
savebuf = buflist_new(NULL, NULL, (linenr_T)1, BLN_DUMMY);
|
||||
if (savebuf != NULL)
|
||||
{
|
||||
/* Open the memline. */
|
||||
curbuf = savebuf;
|
||||
curwin->w_buffer = savebuf;
|
||||
saved = ml_open();
|
||||
curbuf = buf;
|
||||
curwin->w_buffer = buf;
|
||||
}
|
||||
if (savebuf == NULL || saved == FAIL
|
||||
|| move_lines(buf, savebuf) == FAIL)
|
||||
{
|
||||
EMSG2(_("E462: Could not prepare for reloading \"%s\""),
|
||||
buf->b_fname);
|
||||
saved = FAIL;
|
||||
}
|
||||
}
|
||||
|
||||
if (saved == OK)
|
||||
{
|
||||
curbuf->b_flags |= BF_CHECK_RO; /* check for RO again */
|
||||
#ifdef FEAT_AUTOCMD
|
||||
keep_filetype = TRUE; /* don't detect 'filetype' */
|
||||
#endif
|
||||
if (readfile(buf->b_ffname, buf->b_fname, (linenr_T)0,
|
||||
(linenr_T)0,
|
||||
(linenr_T)MAXLNUM, &ea, READ_NEW) == FAIL)
|
||||
{
|
||||
#if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
|
||||
if (!aborting())
|
||||
#endif
|
||||
EMSG2(_("E321: Could not reload \"%s\""), buf->b_fname);
|
||||
if (savebuf != NULL)
|
||||
{
|
||||
/* Put the text back from the save buffer. First
|
||||
* delete any lines that readfile() added. */
|
||||
while (!bufempty())
|
||||
if (ml_delete(curbuf->b_ml.ml_line_count, FALSE)
|
||||
== FAIL)
|
||||
break;
|
||||
(void)move_lines(savebuf, buf);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Mark the buffer as unmodified and free undo info. */
|
||||
unchanged(buf, TRUE);
|
||||
u_blockfree(buf);
|
||||
u_clearall(buf);
|
||||
}
|
||||
}
|
||||
vim_free(ea.cmd);
|
||||
|
||||
if (savebuf != NULL)
|
||||
wipe_buffer(savebuf, FALSE);
|
||||
|
||||
#ifdef FEAT_DIFF
|
||||
/* Invalidate diff info if necessary. */
|
||||
diff_invalidate();
|
||||
#endif
|
||||
|
||||
/* Restore the topline and cursor position and check it (lines may
|
||||
* have been removed). */
|
||||
if (old_topline > curbuf->b_ml.ml_line_count)
|
||||
curwin->w_topline = curbuf->b_ml.ml_line_count;
|
||||
else
|
||||
curwin->w_topline = old_topline;
|
||||
curwin->w_cursor = old_cursor;
|
||||
check_cursor();
|
||||
update_topline();
|
||||
#ifdef FEAT_AUTOCMD
|
||||
keep_filetype = FALSE;
|
||||
#endif
|
||||
#ifdef FEAT_FOLDING
|
||||
{
|
||||
win_T *wp;
|
||||
|
||||
/* Update folds unless they are defined manually. */
|
||||
FOR_ALL_WINDOWS(wp)
|
||||
if (wp->w_buffer == curwin->w_buffer
|
||||
&& !foldmethodIsManual(wp))
|
||||
foldUpdateAll(wp);
|
||||
}
|
||||
#endif
|
||||
/* If the mode didn't change and 'readonly' was set, keep the old
|
||||
* value; the user probably used the ":view" command. But don't
|
||||
* reset it, might have had a read error. */
|
||||
if (orig_mode == curbuf->b_orig_mode)
|
||||
curbuf->b_p_ro |= old_ro;
|
||||
}
|
||||
|
||||
#ifdef FEAT_AUTOCMD
|
||||
/* restore curwin/curbuf and a few other things */
|
||||
aucmd_restbuf(&aco);
|
||||
/* Careful: autocommands may have made "buf" invalid! */
|
||||
#else
|
||||
curwin->w_buffer = save_curbuf;
|
||||
curbuf = save_curbuf;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*ARGSUSED*/
|
||||
void
|
||||
buf_store_time(buf, st, fname)
|
||||
|
Loading…
x
Reference in New Issue
Block a user