{
/* Set or reset 'modified' before executing autocommands, so that
* it can be changed there. */
- if (!readonlymode && !bufempty())
+ if (!readonlymode && !BUFEMPTY())
changed();
- else if (retval != FAIL)
+ else if (retval == OK)
unchanged(curbuf, FALSE);
#ifdef FEAT_AUTOCMD
+ if (retval == OK)
+ {
# ifdef FEAT_EVAL
- apply_autocmds_retval(EVENT_STDINREADPOST, NULL, NULL, FALSE,
+ apply_autocmds_retval(EVENT_STDINREADPOST, NULL, NULL, FALSE,
curbuf, &retval);
# else
- apply_autocmds(EVENT_STDINREADPOST, NULL, NULL, FALSE, curbuf);
+ apply_autocmds(EVENT_STDINREADPOST, NULL, NULL, FALSE, curbuf);
# endif
+ }
#endif
}
return retval;
#endif
)
changed();
- else if (retval != FAIL && !read_stdin && !read_fifo)
+ else if (retval == OK && !read_stdin && !read_fifo)
unchanged(curbuf, FALSE);
save_file_ff(curbuf); /* keep this fileformat */
# endif
#endif
- if (retval != FAIL)
+ if (retval == OK)
{
#ifdef FEAT_AUTOCMD
/*
}
/*
+ * Initializes b:changedtick.
+ */
+ static void
+init_changedtick(buf_T *buf)
+{
+ dictitem_T *di = (dictitem_T *)&buf->b_ct_di;
+
+ di->di_flags = DI_FLAGS_FIX | DI_FLAGS_RO;
+ di->di_tv.v_type = VAR_NUMBER;
+ di->di_tv.v_lock = VAR_FIXED;
+ di->di_tv.vval.v_number = 0;
+
+#ifdef FEAT_EVAL
+ STRCPY(buf->b_ct_di.di_key, "changedtick");
+ (void)dict_add(buf->b_vars, di);
+#endif
+}
+
+/*
* Free stuff in the buffer for ":bdel" and when wiping out the buffer.
*/
static void
#endif
}
#ifdef FEAT_EVAL
- vars_clear(&buf->b_vars->dv_hashtab); /* free all internal variables */
- hash_init(&buf->b_vars->dv_hashtab);
+ {
+ varnumber_T tick = CHANGEDTICK(buf);
+
+ vars_clear(&buf->b_vars->dv_hashtab); /* free all buffer variables */
+ hash_init(&buf->b_vars->dv_hashtab);
+ init_changedtick(buf);
+ CHANGEDTICK(buf) = tick;
+ }
#endif
#ifdef FEAT_USR_CMDS
uc_clear(&buf->b_ucmds); /* clear local user commands */
# ifdef FEAT_AUTOCMD
&& !(curwin->w_closing || curwin->w_buffer->b_locked > 0)
# endif
- && (firstwin != lastwin || first_tabpage->tp_next != NULL))
+ && (!ONE_WINDOW || first_tabpage->tp_next != NULL))
{
if (win_close(curwin, FALSE) == FAIL)
break;
&& curbuf != NULL
&& curbuf->b_ffname == NULL
&& curbuf->b_nwindows <= 1
- && (curbuf->b_ml.ml_mfp == NULL || bufempty()))
+ && (curbuf->b_ml.ml_mfp == NULL || BUFEMPTY()))
{
buf = curbuf;
#ifdef FEAT_AUTOCMD
}
init_var_dict(buf->b_vars, &buf->b_bufvar, VAR_SCOPE);
#endif
+ init_changedtick(buf);
}
if (ffname != NULL)
#if defined(FEAT_CRYPT)
clear_string_option(&buf->b_p_cm);
#endif
+ clear_string_option(&buf->b_p_fp);
#if defined(FEAT_EVAL)
clear_string_option(&buf->b_p_fex);
#endif
clear_string_option(&buf->b_p_lw);
#endif
clear_string_option(&buf->b_p_bkc);
+#ifdef FEAT_MBYTE
+ clear_string_option(&buf->b_p_menc);
+#endif
}
/*
/* If 'switchbuf' contains "split", "vsplit" or "newtab" and the
* current buffer isn't empty: open new tab or window */
if (wp == NULL && (swb_flags & (SWB_VSPLIT | SWB_SPLIT | SWB_NEWTAB))
- && !bufempty())
+ && !BUFEMPTY())
{
if (swb_flags & SWB_NEWTAB)
tabpage_new();
#if defined(FEAT_LISTCMDS) || defined(PROTO)
/*
- * List all know file names (for :files and :buffers command).
+ * List all known file names (for :files and :buffers command).
*/
void
buflist_list(exarg_T *eap)
wpnext = wp->w_next;
buf = wp->w_buffer;
if (buf->b_ffname == NULL
- || (!keep_tabs && buf->b_nwindows > 1)
- || wp->w_width != Columns)
+ || (!keep_tabs && (buf->b_nwindows > 1
+ || wp->w_width != Columns)))
i = opened_len;
else
{
#ifdef FEAT_WINDOWS
/* ":drop all" should re-use an empty window to avoid "--remote-tab"
* leaving an empty tab page when executed locally. */
- if (keep_tabs && bufempty() && curbuf->b_nwindows == 1
+ if (keep_tabs && BUFEMPTY() && curbuf->b_nwindows == 1
&& curbuf->b_ffname == NULL && !curbuf->b_changed)
use_firstwin = TRUE;
#endif
: wp->w_width != Columns)
|| (had_tab > 0 && wp != firstwin)
#endif
- ) && firstwin != lastwin
+ ) && !ONE_WINDOW
#ifdef FEAT_AUTOCMD
&& !(wp->w_closing || wp->w_buffer->b_locked > 0)
#endif
if (buf->b_signlist != NULL)
{
vim_snprintf(lbuf, BUFSIZ, _("Signs for %s:"), buf->b_fname);
- MSG_PUTS_ATTR(lbuf, hl_attr(HLF_D));
+ MSG_PUTS_ATTR(lbuf, HL_ATTR(HLF_D));
msg_putchar('\n');
}
for (p = buf->b_signlist; p != NULL && !got_int; p = p->next)