From 5803ae6c076b1d61381afe27fcdedac61dd2cda9 Mon Sep 17 00:00:00 2001
From: Bram Moolenaar <Bram@vim.org>
Date: Sun, 23 Mar 2014 16:04:02 +0100
Subject: [PATCH] updated for version 7.4.213 Problem:    It's not possible to
 open a new buffer without creating a swap             file. Solution:   Add
 the ":noswapfile" modifier. (Christian Brabandt)

---
 runtime/doc/recover.txt |  9 ++++++++-
 src/ex_cmds.h           |  2 ++
 src/ex_docmd.c          | 28 +++++++++++++++++++---------
 src/memline.c           |  7 +++++--
 src/structs.h           |  1 +
 src/version.c           |  2 ++
 6 files changed, 37 insertions(+), 12 deletions(-)

diff --git a/runtime/doc/recover.txt b/runtime/doc/recover.txt
index 5fc09c0e7..650feb208 100644
--- a/runtime/doc/recover.txt
+++ b/runtime/doc/recover.txt
@@ -81,7 +81,14 @@ the amount of memory used to be higher than given with 'maxmem' or
 'maxmemtot'.  And when making a change to a read-only file, the swap file is
 created anyway.
 
-The 'swapfile' option can be reset to avoid creating a swapfile.
+The 'swapfile' option can be reset to avoid creating a swapfile.  And the
+|:noswapfile| modifier can be used to not create a swapfile for a new buffer.
+
+:noswap[file]   {command}			*:noswap* *:noswapfile*
+		Execute {command}. If it contains a command that loads a new
+		buffer, it will be loaded without creating a swapfile and the
+		'swapfile' option will be reset.  If a buffer already had a
+		swapfile it is not removed and 'swapfile' is not reset.
 
 
 Detecting an existing swap file ~
diff --git a/src/ex_cmds.h b/src/ex_cmds.h
index fc3763c08..41d3a642d 100644
--- a/src/ex_cmds.h
+++ b/src/ex_cmds.h
@@ -655,6 +655,8 @@ EX(CMD_noreabbrev,	"noreabbrev",	ex_abbreviate,
 			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
 EX(CMD_noremenu,	"noremenu",	ex_menu,
 			RANGE|NOTADR|ZEROR|BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+EX(CMD_noswapfile,	"noswapfile",	ex_wrongmodifier,
+			NEEDARG|EXTRA|NOTRLCOM),
 EX(CMD_normal,		"normal",	ex_normal,
 			RANGE|BANG|EXTRA|NEEDARG|NOTRLCOM|USECTRLV|SBOXOK|CMDWIN),
 EX(CMD_number,		"number",	ex_print,
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 507de7d15..95c699d98 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -1874,18 +1874,23 @@ do_one_cmd(cmdlinep, sourcing,
 #endif
 			continue;
 
-	    case 'n':	if (!checkforcmd(&ea.cmd, "noautocmd", 3))
-			    break;
-#ifdef FEAT_AUTOCMD
-			if (cmdmod.save_ei == NULL)
+	    case 'n':	if (checkforcmd(&ea.cmd, "noautocmd", 3))
 			{
-			    /* Set 'eventignore' to "all". Restore the
-			     * existing option value later. */
-			    cmdmod.save_ei = vim_strsave(p_ei);
-			    set_string_option_direct((char_u *)"ei", -1,
+#ifdef FEAT_AUTOCMD
+			    if (cmdmod.save_ei == NULL)
+			    {
+				/* Set 'eventignore' to "all". Restore the
+				 * existing option value later. */
+				cmdmod.save_ei = vim_strsave(p_ei);
+				set_string_option_direct((char_u *)"ei", -1,
 					 (char_u *)"all", OPT_FREE, SID_NONE);
-			}
+			    }
 #endif
+			    continue;
+			}
+			if (!checkforcmd(&ea.cmd, "noswapfile", 6))
+			    break;
+			cmdmod.noswapfile = TRUE;
 			continue;
 
 	    case 'r':	if (!checkforcmd(&ea.cmd, "rightbelow", 6))
@@ -2596,6 +2601,8 @@ do_one_cmd(cmdlinep, sourcing,
 	    case CMD_lua:
 	    case CMD_match:
 	    case CMD_mzscheme:
+	    case CMD_noautocmd:
+	    case CMD_noswapfile:
 	    case CMD_perl:
 	    case CMD_psearch:
 	    case CMD_python:
@@ -3099,6 +3106,7 @@ static struct cmdmod
     {"leftabove", 5, FALSE},
     {"lockmarks", 3, FALSE},
     {"noautocmd", 3, FALSE},
+    {"noswapfile", 3, FALSE},
     {"rightbelow", 6, FALSE},
     {"sandbox", 3, FALSE},
     {"silent", 3, FALSE},
@@ -3611,6 +3619,8 @@ set_one_cmd_context(xp, buff)
 	case CMD_keeppatterns:
 	case CMD_leftabove:
 	case CMD_lockmarks:
+	case CMD_noautocmd:
+	case CMD_noswapfile:
 	case CMD_rightbelow:
 	case CMD_sandbox:
 	case CMD_silent:
diff --git a/src/memline.c b/src/memline.c
index 8f6c0e01e..fb438d273 100644
--- a/src/memline.c
+++ b/src/memline.c
@@ -289,6 +289,9 @@ ml_open(buf)
     buf->b_ml.ml_chunksize = NULL;
 #endif
 
+    if (cmdmod.noswapfile)
+	buf->b_p_swf = FALSE;
+
     /*
      * When 'updatecount' is non-zero swap file may be opened later.
      */
@@ -606,7 +609,7 @@ ml_setname(buf)
 	 * When 'updatecount' is 0 and 'noswapfile' there is no swap file.
 	 * For help files we will make a swap file now.
 	 */
-	if (p_uc != 0)
+	if (p_uc != 0 && !cmdmod.noswapfile)
 	    ml_open_file(buf);	    /* create a swap file */
 	return;
     }
@@ -719,7 +722,7 @@ ml_open_file(buf)
     char_u	*dirp;
 
     mfp = buf->b_ml.ml_mfp;
-    if (mfp == NULL || mfp->mf_fd >= 0 || !buf->b_p_swf)
+    if (mfp == NULL || mfp->mf_fd >= 0 || !buf->b_p_swf || cmdmod.noswapfile)
 	return;		/* nothing to do */
 
 #ifdef FEAT_SPELL
diff --git a/src/structs.h b/src/structs.h
index 7a3d69219..9bb35ceec 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -545,6 +545,7 @@ typedef struct
     int		keepjumps;		/* TRUE when ":keepjumps" was used */
     int		lockmarks;		/* TRUE when ":lockmarks" was used */
     int		keeppatterns;		/* TRUE when ":keeppatterns" was used */
+    int		noswapfile;		/* TRUE when ":noswapfile" was used */
 # ifdef FEAT_AUTOCMD
     char_u	*save_ei;		/* saved value of 'eventignore' */
 # endif
diff --git a/src/version.c b/src/version.c
index 36ff41f22..d8106a431 100644
--- a/src/version.c
+++ b/src/version.c
@@ -734,6 +734,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    213,
 /**/
     212,
 /**/
-- 
2.40.0