diff src/buffer.c @ 30751:9889ff80547e v9.0.0710

patch 9.0.0710: quitting/unloading/hiding a terminal does not work properly Commit: https://github.com/vim/vim/commit/4282633ba63f6e11f2fe42c4b7758dace184f30d Author: Yee Cheng Chin <ychin.git@gmail.com> Date: Mon Oct 10 11:46:16 2022 +0100 patch 9.0.0710: quitting/unloading/hiding a terminal does not work properly Problem: Quitting/unloading/hiding a terminal buffer does not always work properly. Solution: Avoid that ":q!" leaves an empty buffer behind. ":bunload!" also kills the job and unloads the buffer. ":hide" does not unload the buffer. (Yee Cheng Chin, closes #11323)
author Bram Moolenaar <Bram@vim.org>
date Mon, 10 Oct 2022 13:00:05 +0200
parents 58592b6af4e2
children c7983f593fa7
line wrap: on
line diff
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -538,7 +538,8 @@ close_buffer(
 	unload_buf = TRUE;
 
 #ifdef FEAT_TERMINAL
-    if (bt_terminal(buf) && (buf->b_nwindows == 1 || del_buf))
+    // depending on how we get here b_nwindows may already be zero
+    if (bt_terminal(buf) && (buf->b_nwindows <= 1 || del_buf))
     {
 	CHECK_CURBUF;
 	if (term_job_running(buf->b_term))
@@ -550,6 +551,11 @@ close_buffer(
 
 		// Wiping out or unloading a terminal buffer kills the job.
 		free_terminal(buf);
+
+		// A terminal buffer is wiped out when job has finished.
+		del_buf = TRUE;
+		unload_buf = TRUE;
+		wipe_buf = TRUE;
 	    }
 	    else
 	    {
@@ -565,10 +571,16 @@ close_buffer(
 	}
 	else
 	{
-	    // A terminal buffer is wiped out if the job has finished.
-	    del_buf = TRUE;
-	    unload_buf = TRUE;
-	    wipe_buf = TRUE;
+	    if (del_buf || unload_buf)
+	    {
+		// A terminal buffer is wiped out if the job has finished.
+		// We only do this when there's an intention to unload the
+		// buffer. This way, :hide and other similar commands won't
+		// wipe the buffer.
+		del_buf = TRUE;
+		unload_buf = TRUE;
+		wipe_buf = TRUE;
+	    }
 	}
 	CHECK_CURBUF;
     }