changeset 19069:e14feba578f1 v8.2.0095

patch 8.2.0095: cannot specify exit code for :cquit Commit: https://github.com/vim/vim/commit/1860bde9d31bbb0ba857f6284f6332a7134030dd Author: Bram Moolenaar <Bram@vim.org> Date: Mon Jan 6 21:47:21 2020 +0100 patch 8.2.0095: cannot specify exit code for :cquit Problem: Cannot specify exit code for :cquit. Solution: Add optional argument. (Thinca, Yegappan Lakshmanan, closes https://github.com/vim/vim/issues/5442)
author Bram Moolenaar <Bram@vim.org>
date Mon, 06 Jan 2020 22:00:06 +0100
parents ef88c759f4a0
children 996e917b1edb
files runtime/doc/quickfix.txt src/ex_cmds.h src/ex_docmd.c src/testdir/test_quickfix.vim src/version.c
diffstat 5 files changed, 41 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/quickfix.txt
+++ b/runtime/doc/quickfix.txt
@@ -229,8 +229,17 @@ processing a quickfix or location list c
 			current window is used instead of the quickfix list.
 
 							*:cq* *:cquit*
-:cq[uit][!]		Quit Vim with an error code, so that the compiler
-			will not compile the same file again.
+:cq[uit][!]
+:{N}cq[uit][!]
+:cq[uit][!] {N}		Quit Vim with error code {N}.  {N} defaults to one.
+			Useful when Vim is called from another program:
+			e.g., a compiler will not compile the same file again,
+			`git commit` will abort the committing process, `fc`
+			(built-in for shells like bash and zsh) will not
+			execute the command, etc.  will not compile the same
+			file again.
+			{N} can also be zero, in which case Vim exits
+			normally.
 			WARNING: All changes in files are lost!  Also when the
 			[!] is not used.  It works like ":qall!" |:qall|,
 			except that Vim returns a non-zero exit code.
--- a/src/ex_cmds.h
+++ b/src/ex_cmds.h
@@ -407,7 +407,7 @@ EXCMD(CMD_cpfile,	"cpfile",	ex_cnext,
 	EX_RANGE|EX_COUNT|EX_TRLBAR|EX_BANG,
 	ADDR_OTHER),
 EXCMD(CMD_cquit,	"cquit",	ex_cquit,
-	EX_TRLBAR|EX_BANG,
+	EX_RANGE|EX_COUNT|EX_ZEROR|EX_TRLBAR|EX_BANG,
 	ADDR_NONE),
 EXCMD(CMD_crewind,	"crewind",	ex_cc,
 	EX_RANGE|EX_COUNT|EX_TRLBAR|EX_BANG,
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -4920,8 +4920,8 @@ ex_quit(exarg_T *eap)
     static void
 ex_cquit(exarg_T *eap UNUSED)
 {
-    getout(1);	// this does not always pass on the exit code to the Manx
-		// compiler. why?
+    // this does not always pass on the exit code to the Manx compiler. why?
+    getout(eap->addr_count > 0 ? (int)eap->line2 : EXIT_FAILURE);
 }
 
 /*
--- a/src/testdir/test_quickfix.vim
+++ b/src/testdir/test_quickfix.vim
@@ -4674,4 +4674,29 @@ func Test_search_in_dirstack()
   call delete('Xtestdir', 'rf')
 endfunc
 
+" Test for :cquit
+func Test_cquit()
+  " Exit Vim with a non-zero value
+  if RunVim([], ["cquit 7"], '')
+    call assert_equal(7, v:shell_error)
+  endif
+
+  if RunVim([], ["50cquit"], '')
+    call assert_equal(50, v:shell_error)
+  endif
+
+  " Exit Vim with default value
+  if RunVim([], ["cquit"], '')
+    call assert_equal(1, v:shell_error)
+  endif
+
+  " Exit Vim with zero value
+  if RunVim([], ["cquit 0"], '')
+    call assert_equal(0, v:shell_error)
+  endif
+
+  " Exit Vim with negative value
+  call assert_fails('-3cquit', 'E16:')
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
--- a/src/version.c
+++ b/src/version.c
@@ -743,6 +743,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    95,
+/**/
     94,
 /**/
     93,