changeset 16555:1302bc0b80db v8.1.1281

patch 8.1.1281: cannot specify a count with :chistory commit https://github.com/vim/vim/commit/8ffc7c8b5f004971cb6f2bdcfbe4f7123cce717c Author: Bram Moolenaar <Bram@vim.org> Date: Sun May 5 21:00:26 2019 +0200 patch 8.1.1281: cannot specify a count with :chistory Problem: Cannot specify a count with :chistory. Solution: Add a count to :chistory and :lhistory. (Yegappan Lakshmanan, closes #4344)
author Bram Moolenaar <Bram@vim.org>
date Sun, 05 May 2019 21:15:05 +0200
parents 46b6265c641e
children a6b49c751cac
files runtime/doc/quickfix.txt src/ex_cmds.h src/quickfix.c src/testdir/test_quickfix.vim src/version.c
diffstat 5 files changed, 75 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/quickfix.txt
+++ b/runtime/doc/quickfix.txt
@@ -139,8 +139,8 @@ processing a quickfix or location list c
 :[count]lab[ove]	Same as ":cabove", except the location list for the
 			current window is used instead of the quickfix list.
 
-							*:cbe* *:cbelow*
-:[count]cbe[low]	Go to the [count] error below the current line in the
+							*:cbel* *:cbelow*
+:[count]cbel[ow]	Go to the [count] error below the current line in the
 			current buffer.  If [count] is omitted, then 1 is
 			used.  If there are no errors, then an error message
 			is displayed.  Assumes that the entries in a quickfix
@@ -164,8 +164,8 @@ processing a quickfix or location list c
 			number of entries before the current position, then
 			the first error in the file is selected.
 
-							*:lbef* *:lbefore*
-:[count]lbef[ore]	Same as ":cbefore", except the location list for the
+							*:lbe* *:lbefore*
+:[count]lbe[fore]	Same as ":cbefore", except the location list for the
 			current window is used instead of the quickfix list.
 
 							*:caf* *:cafter*
@@ -536,6 +536,29 @@ EXECUTE A COMMAND IN ALL THE BUFFERS IN 
 				etc.
 <			Otherwise it works the same as `:ldo`.
 
+FILTERING A QUICKFIX OR LOCATION LIST:
+				    *cfilter-plugin* *:Cfilter* *:Lfilter*
+If you have too many entries in a quickfix list, you can use the cfilter
+plugin to reduce the number of entries.  Load the plugin with: >
+
+    packadd cfilter
+
+Then you can use the following commands to filter a quickfix/location list: >
+
+    :Cfilter[!] /{pat}/
+    :Lfilter[!] /{pat}/
+
+The |:Cfilter| command creates a new quickfix list from the entries matching
+{pat} in the current quickfix list. {pat} is a Vim |regular-expression|
+pattern. Both the file name and the text of the entries are matched against
+{pat}. If the optional ! is supplied, then the entries not matching {pat} are
+used. The pattern can be optionally enclosed using one of the following
+characters: ', ", /. If the pattern is empty, then the last used search
+pattern is used.
+
+The |:Lfilter| command does the same as |:Cfilter| but operates on the current
+location list.
+
 =============================================================================
 2. The error window					*quickfix-window*
 
@@ -822,14 +845,19 @@ lists.  They set one of the existing err
 			the current window instead of the quickfix list.
 
 						*:chistory* *:chi*
-:chi[story]		Show the list of error lists.  The current list is
+:[count]chi[story]	Show the list of error lists.  The current list is
 			marked with ">".  The output looks like:
 				  error list 1 of 3; 43 errors ~
 				> error list 2 of 3; 0 errors ~
 				  error list 3 of 3; 15 errors ~
 
+			When [count] is given, then the count'th quickfix
+			list is made the current list. Example: >
+				" Make the 4th quickfix list current
+				:4chistory
+<
 						*:lhistory* *:lhi*
-:lhi[story]		Show the list of location lists, otherwise like
+:[count]lhi[story]	Show the list of location lists, otherwise like
 			`:chistory`.
 
 When adding a new error list, it becomes the current list.
@@ -1641,22 +1669,6 @@ The backslashes before the pipe characte
 recognized as a command separator.  The backslash before each space is
 required for the set command.
 
-				    *cfilter-plugin* *:Cfilter* *:Lfilter*
-If you have too many matching messages, you can use the cfilter plugin to
-reduce the number of entries.  Load the plugin with: >
-   packadd cfilter
-
-Then you can use these command: >
-   :Cfilter[!] /{pat}/
-   :Lfilter[!] /{pat}/
-
-:Cfilter creates a new quickfix list from entries matching {pat} in the
-current quickfix list. Both the file name and the text of the entries are
-matched against {pat}. If ! is supplied, then entries not matching {pat} are
-used.
-
-:Lfilter does the same as :Cfilter but operates on the current location list.
-
 =============================================================================
 8. The directory stack				*quickfix-directory-stack*
 
--- a/src/ex_cmds.h
+++ b/src/ex_cmds.h
@@ -336,8 +336,8 @@ EX(CMD_checktime,	"checktime",	ex_checkt
 			RANGE|BUFNAME|COUNT|EXTRA|TRLBAR,
 			ADDR_OTHER),
 EX(CMD_chistory,	"chistory",	qf_history,
-			TRLBAR,
-			ADDR_NONE),
+			RANGE|COUNT|TRLBAR,
+			ADDR_UNSIGNED),
 EX(CMD_clist,		"clist",	qf_list,
 			BANG|EXTRA|TRLBAR|CMDWIN,
 			ADDR_NONE),
@@ -828,8 +828,8 @@ EX(CMD_lhelpgrep,	"lhelpgrep",	ex_helpgr
 			EXTRA|NOTRLCOM|NEEDARG,
 			ADDR_NONE),
 EX(CMD_lhistory,	"lhistory",	qf_history,
-			TRLBAR,
-			ADDR_NONE),
+			RANGE|COUNT|TRLBAR,
+			ADDR_UNSIGNED),
 EX(CMD_ll,		"ll",		ex_cc,
 			RANGE|COUNT|TRLBAR|BANG,
 			ADDR_QUICKFIX),
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -3742,6 +3742,27 @@ qf_history(exarg_T *eap)
     qf_info_T	*qi = qf_cmd_get_stack(eap, FALSE);
     int		i;
 
+    if (eap->addr_count > 0)
+    {
+	if (qi == NULL)
+	{
+	    emsg(_(e_loclist));
+	    return;
+	}
+
+	// Jump to the specified quickfix list
+	if (eap->line2 > 0 && eap->line2 <= qi->qf_listcount)
+	{
+	    qi->qf_curlist = eap->line2 - 1;
+	    qf_msg(qi, qi->qf_curlist, "");
+	    qf_update_buffer(qi, NULL);
+	}
+	else
+	    emsg(_(e_invrange));
+
+	return;
+    }
+
     if (qf_stack_empty(qi))
 	msg(_("No entries"));
     else
--- a/src/testdir/test_quickfix.vim
+++ b/src/testdir/test_quickfix.vim
@@ -1831,9 +1831,23 @@ func HistoryTest(cchar)
   call assert_equal('  error list 2 of 3; 2 ' . common, res[1])
   call assert_equal('> error list 3 of 3; 3 ' . common, res[2])
 
+  " Test for changing the quickfix lists
+  call assert_equal(3, g:Xgetlist({'nr' : 0}).nr)
+  exe '1' . a:cchar . 'hist'
+  call assert_equal(1, g:Xgetlist({'nr' : 0}).nr)
+  exe '3' . a:cchar . 'hist'
+  call assert_equal(3, g:Xgetlist({'nr' : 0}).nr)
+  call assert_fails('-2' . a:cchar . 'hist', 'E16:')
+  call assert_fails('4' . a:cchar . 'hist', 'E16:')
+
   call g:Xsetlist([], 'f')
   let l = split(execute(a:cchar . 'hist'), "\n")
   call assert_equal('No entries', l[0])
+  if a:cchar == 'c'
+    call assert_fails('4chist', 'E16:')
+  else
+    call assert_fails('4lhist', 'E776:')
+  endif
 
   " An empty list should still show the stack history
   call g:Xsetlist([])
--- a/src/version.c
+++ b/src/version.c
@@ -768,6 +768,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1281,
+/**/
     1280,
 /**/
     1279,