Imported Upstream version 8.0.586
[platform/upstream/vim.git] / src / buffer.c
index 8b1bceb..ac0f1e6 100644 (file)
@@ -111,18 +111,21 @@ read_buffer(
     {
        /* 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;
@@ -294,7 +297,7 @@ open_buffer(
 #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 */
 
@@ -328,7 +331,7 @@ open_buffer(
 # endif
 #endif
 
-    if (retval != FAIL)
+    if (retval == OK)
     {
 #ifdef FEAT_AUTOCMD
        /*
@@ -870,6 +873,25 @@ free_buffer(buf_T *buf)
 }
 
 /*
+ * 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
@@ -886,8 +908,14 @@ free_buffer_stuff(
 #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 */
@@ -1412,7 +1440,7 @@ do_buffer(
 # 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;
@@ -1931,7 +1959,7 @@ buflist_new(
            && 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
@@ -1976,6 +2004,7 @@ buflist_new(
        }
        init_var_dict(buf->b_vars, &buf->b_bufvar, VAR_SCOPE);
 #endif
+       init_changedtick(buf);
     }
 
     if (ffname != NULL)
@@ -2150,6 +2179,7 @@ free_buf_options(
 #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
@@ -2225,6 +2255,9 @@ free_buf_options(
     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
 }
 
 /*
@@ -2301,7 +2334,7 @@ buflist_getfile(
        /* 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();
@@ -2966,7 +2999,7 @@ buflist_findlnum(buf_T *buf)
 
 #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)
@@ -4858,8 +4891,8 @@ do_arg_all(
            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
            {
@@ -4984,7 +5017,7 @@ do_arg_all(
 #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
@@ -5140,7 +5173,7 @@ ex_buffer_all(exarg_T *eap)
                        : 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
@@ -5988,7 +6021,7 @@ sign_list_placed(buf_T *rbuf)
        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)