diff src/fileio.c @ 179:7fd70926e2e1 v7.0055

updated for version 7.0055
author vimboss
date Fri, 04 Mar 2005 23:39:37 +0000
parents 84c21eb4fc40
children 041a413d626d
line wrap: on
line diff
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -1331,7 +1331,8 @@ retry:
 
 		/*
 		 * If there is conversion error or not enough room try using
-		 * another conversion.
+		 * another conversion.  Except for when there is no
+		 * alternative (help files).
 		 */
 		while ((iconv(iconv_fd, (void *)&fromp, &from_size,
 							       &top, &to_size)
@@ -2753,7 +2754,7 @@ buf_write(buf, fname, sfname, start, end
 	    if (!(did_cmd = apply_autocmds_exarg(EVENT_BUFWRITECMD,
 					 sfname, sfname, FALSE, curbuf, eap)))
 	    {
-		if (bt_nofile(curbuf))
+		if (overwriting && bt_nofile(curbuf))
 		    nofile_err = TRUE;
 		else
 		    apply_autocmds_exarg(EVENT_BUFWRITEPRE,
@@ -2765,7 +2766,7 @@ buf_write(buf, fname, sfname, start, end
 	    if (!(did_cmd = apply_autocmds_exarg(EVENT_FILEWRITECMD,
 					 sfname, sfname, FALSE, curbuf, eap)))
 	    {
-		if (bt_nofile(curbuf))
+		if (overwriting && bt_nofile(curbuf))
 		    nofile_err = TRUE;
 		else
 		    apply_autocmds_exarg(EVENT_FILEWRITEPRE,
@@ -5917,7 +5918,10 @@ buf_check_timestamp(buf, focus)
 #endif
 #ifdef FEAT_AUTOCMD
     static int	busy = FALSE;
-#endif
+    int		n;
+    char_u	*s;
+#endif
+    char	*reason;
 
     /* If there is no file name, the buffer is not loaded, 'buftype' is
      * set, we are in the middle of a save or being called recursively: ignore
@@ -5975,15 +5979,26 @@ buf_check_timestamp(buf, focus)
 	    reload = TRUE;
 	else
 	{
+	    if (stat_res < 0)
+		reason = "deleted";
+	    else if (bufIsChanged(buf))
+		reason = "conflict";
+	    else if (orig_size != buf->b_orig_size || buf_contents_changed(buf))
+		reason = "changed";
+	    else if (orig_mode != buf->b_orig_mode)
+		reason = "mode";
+	    else
+		reason = "time";
+
 #ifdef FEAT_AUTOCMD
-	    int n;
-
 	    /*
 	     * Only give the warning if there are no FileChangedShell
 	     * autocommands.
 	     * Avoid being called recursively by setting "busy".
 	     */
 	    busy = TRUE;
+	    set_vim_var_string(VV_FCS_REASON, (char_u *)reason, -1);
+	    set_vim_var_string(VV_FCS_CHOICE, (char_u *)"", -1);
 	    n = apply_autocmds(EVENT_FILECHANGEDSHELL,
 				      buf->b_fname, buf->b_fname, FALSE, buf);
 	    busy = FALSE;
@@ -5991,13 +6006,19 @@ buf_check_timestamp(buf, focus)
 	    {
 		if (!buf_valid(buf))
 		    EMSG(_("E246: FileChangedShell autocommand deleted buffer"));
-		return 2;
+		s = get_vim_var_str(VV_FCS_CHOICE);
+		if (STRCMP(s, "reload") == 0 && *reason != 'd')
+		    reload = TRUE;
+		else if (STRCMP(s, "ask") == 0)
+		    n = FALSE;
+		else
+		    return 2;
 	    }
-	    else
+	    if (!n)
 #endif
 	    {
-		if (stat_res < 0)
-		    mesg = _("E211: Warning: File \"%s\" no longer available");
+		if (*reason == 'd')
+		    mesg = _("E211: File \"%s\" no longer available");
 		else
 		{
 		    helpmesg = TRUE;
@@ -6010,13 +6031,22 @@ buf_check_timestamp(buf, focus)
 		     * checked out of CVS).  Always warn when the buffer was
 		     * changed.
 		     */
-		    if (bufIsChanged(buf))
+		    if (reason[2] == 'n')
+		    {
 			mesg = _("W12: Warning: File \"%s\" has changed and the buffer was changed in Vim as well");
-		    else if (orig_size != buf->b_orig_size
-			    || buf_contents_changed(buf))
+			mesg2 = _("See \":help W12\" for more info.");
+		    }
+		    else if (reason[1] == 'h')
+		    {
 			mesg = _("W11: Warning: File \"%s\" has changed since editing started");
-		    else if (orig_mode != buf->b_orig_mode)
+			mesg2 = _("See \":help W11\" for more info.");
+		    }
+		    else if (*reason == 'm')
+		    {
 			mesg = _("W16: Warning: Mode of file \"%s\" has changed since editing started");
+			mesg2 = _("See \":help W16\" for more info.");
+		    }
+		    /* Else: only timestamp changed, ignored */
 		}
 	    }
 	}
@@ -6038,9 +6068,7 @@ buf_check_timestamp(buf, focus)
 	path = home_replace_save(buf, buf->b_fname);
 	if (path != NULL)
 	{
-	    if (helpmesg)
-		mesg2 = _("See \":help W11\" for more info.");
-	    else
+	    if (!helpmesg)
 		mesg2 = "";
 	    tbuf = alloc((unsigned)(STRLEN(path) + STRLEN(mesg)
 							+ STRLEN(mesg2) + 2));