# HG changeset patch # User Bram Moolenaar # Date 1557083705 -7200 # Node ID 1302bc0b80db05ccbd70c49445c51a67daf2eb1d # Parent 46b6265c641ef004eb27dbafe0ff28a4379c81dc patch 8.1.1281: cannot specify a count with :chistory commit https://github.com/vim/vim/commit/8ffc7c8b5f004971cb6f2bdcfbe4f7123cce717c Author: Bram Moolenaar 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) diff --git a/runtime/doc/quickfix.txt b/runtime/doc/quickfix.txt --- 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* diff --git a/src/ex_cmds.h b/src/ex_cmds.h --- 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), diff --git a/src/quickfix.c b/src/quickfix.c --- 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 diff --git a/src/testdir/test_quickfix.vim b/src/testdir/test_quickfix.vim --- 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([]) diff --git a/src/version.c b/src/version.c --- 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,