summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOliver Kiddle <opk@zsh.org>2015-06-29 01:53:59 +0200
committerOliver Kiddle <opk@zsh.org>2015-06-29 01:54:44 +0200
commit44c56f3af57d93d5d92ce18893cb020f8f36e2f3 (patch)
tree0558165956fa23c7f9fabd364f58a37cf0e648d4
parentfbc97e72e8f3f0b9be9bd3f24f36a1e8e5a6701d (diff)
downloadzsh-44c56f3af57d93d5d92ce18893cb020f8f36e2f3.tar.gz
zsh-44c56f3af57d93d5d92ce18893cb020f8f36e2f3.zip
35627: make reverse-menu-complete start with the last match in
menu selection
-rw-r--r--ChangeLog4
-rw-r--r--Src/Zle/compcore.c6
-rw-r--r--Src/Zle/compctl.c2
-rw-r--r--Src/Zle/complete.c2
-rw-r--r--Src/Zle/complist.c1
-rw-r--r--Src/Zle/compresult.c83
-rw-r--r--Src/Zle/zle_tricky.c10
7 files changed, 40 insertions, 68 deletions
diff --git a/ChangeLog b/ChangeLog
index 2ea6492e5..9b5d7e247 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
2015-06-29 Oliver Kiddle <opk@zsh.org>
+ * 35627: Src/Zle/compcore.c, Src/Zle/compctl.c, Src/Zle/complete.c,
+ Src/Zle/complist.c, Src/Zle/compresult.c, Src/Zle/zle_tricky.c:
+ make reverse-menu-complete start with last match in menu selection
+
* 35623: Src/Zle/complist.c: fix menu-selection where initial
selection would not be displayed without scrolling
diff --git a/Src/Zle/compcore.c b/Src/Zle/compcore.c
index d4051bda0..ba538ca99 100644
--- a/Src/Zle/compcore.c
+++ b/Src/Zle/compcore.c
@@ -327,9 +327,7 @@ do_completion(UNUSED(Hookdef dummy), Compldat dat)
haspattern = 0;
complistmax = getiparam("LISTMAX");
zsfree(complastprompt);
- complastprompt = ztrdup(((isset(ALWAYSLASTPROMPT) && zmult == 1) ||
- (unset(ALWAYSLASTPROMPT) && zmult != 1)) ?
- "yes" : "");
+ complastprompt = ztrdup(isset(ALWAYSLASTPROMPT) ? "yes" : "");
dolastprompt = 1;
zsfree(complist);
complist = ztrdup(isset(LISTROWSFIRST) ?
@@ -975,7 +973,7 @@ makecomplist(char *s, int incmd, int lst)
mnum = 0;
unambig_mnum = -1;
isuf = NULL;
- insmnum = 1;
+ insmnum = zmult;
#if 0
/* group-numbers in compstate[insert] */
insgnum = 1;
diff --git a/Src/Zle/compctl.c b/Src/Zle/compctl.c
index 189582d22..bac533e7e 100644
--- a/Src/Zle/compctl.c
+++ b/Src/Zle/compctl.c
@@ -1803,7 +1803,7 @@ ccmakehookfn(UNUSED(Hookdef dummy), struct ccmakedat *dat)
mnum = 0;
unambig_mnum = -1;
isuf = NULL;
- insmnum = 1;
+ insmnum = zmult;
#if 0
/* group-numbers in compstate[insert] */
insgnum = 1;
diff --git a/Src/Zle/complete.c b/Src/Zle/complete.c
index ea5e41f5f..63e5b9184 100644
--- a/Src/Zle/complete.c
+++ b/Src/Zle/complete.c
@@ -1625,7 +1625,6 @@ boot_(Module m)
addhookfunc("before_complete", (Hookfn) before_complete);
addhookfunc("after_complete", (Hookfn) after_complete);
addhookfunc("accept_completion", (Hookfn) accept_last);
- addhookfunc("reverse_menu", (Hookfn) reverse_menu);
addhookfunc("list_matches", (Hookfn) list_matches);
addhookfunc("invalidate_list", (Hookfn) invalidate_list);
(void)addhookdefs(m, comphooks, sizeof(comphooks)/sizeof(*comphooks));
@@ -1640,7 +1639,6 @@ cleanup_(Module m)
deletehookfunc("before_complete", (Hookfn) before_complete);
deletehookfunc("after_complete", (Hookfn) after_complete);
deletehookfunc("accept_completion", (Hookfn) accept_last);
- deletehookfunc("reverse_menu", (Hookfn) reverse_menu);
deletehookfunc("list_matches", (Hookfn) list_matches);
deletehookfunc("invalidate_list", (Hookfn) invalidate_list);
(void)deletehookdefs(m, comphooks,
diff --git a/Src/Zle/complist.c b/Src/Zle/complist.c
index 18551d05d..f37a43231 100644
--- a/Src/Zle/complist.c
+++ b/Src/Zle/complist.c
@@ -2581,6 +2581,7 @@ domenuselect(Hookdef dummy, Chdata dat)
getk:
if (!do_last_key) {
+ zmult = 1;
cmd = getkeycmd();
if (mtab_been_reallocated) {
do_last_key = 1;
diff --git a/Src/Zle/compresult.c b/Src/Zle/compresult.c
index 9f383f4b8..7fec7c804 100644
--- a/Src/Zle/compresult.c
+++ b/Src/Zle/compresult.c
@@ -1220,25 +1220,39 @@ do_menucmp(int lst)
was_meta = 1;
/* Otherwise go to the next match in the array... */
- do {
- if (!*++(minfo.cur)) {
- do {
- if (!(minfo.group = (minfo.group)->next)) {
- minfo.group = amatches;
+ while (zmult) {
+ do {
+ if (zmult > 0) {
+ if (!*++(minfo.cur)) {
+ do {
+ if (!(minfo.group = (minfo.group)->next)) {
+ minfo.group = amatches;
#ifdef ZSH_HEAP_DEBUG
- if (memory_validate(minfo.group->heap_id)) {
- HEAP_ERROR(minfo.group->heap_id);
- }
+ if (memory_validate(minfo.group->heap_id)) {
+ HEAP_ERROR(minfo.group->heap_id);
+ }
#endif
+ }
+ } while (!(minfo.group)->mcount);
+ minfo.cur = minfo.group->matches;
}
- } while (!(minfo.group)->mcount);
- minfo.cur = minfo.group->matches;
- }
- } while ((menuacc &&
- !hasbrpsfx(*(minfo.cur), minfo.prebr, minfo.postbr)) ||
- ((*minfo.cur)->flags & CMF_DUMMY) ||
- (((*minfo.cur)->flags & (CMF_NOLIST | CMF_MULT)) &&
- (!(*minfo.cur)->str || !*(*minfo.cur)->str)));
+ } else {
+ if (minfo.cur == (minfo.group)->matches) {
+ do {
+ if (!(minfo.group = (minfo.group)->prev))
+ minfo.group = lmatches;
+ } while (!(minfo.group)->mcount);
+ minfo.cur = (minfo.group)->matches + (minfo.group)->mcount - 1;
+ } else
+ minfo.cur--;
+ }
+ } while ((menuacc &&
+ !hasbrpsfx(*(minfo.cur), minfo.prebr, minfo.postbr)) ||
+ ((*minfo.cur)->flags & CMF_DUMMY) ||
+ (((*minfo.cur)->flags & (CMF_NOLIST | CMF_MULT)) &&
+ (!(*minfo.cur)->str || !*(*minfo.cur)->str)));
+ zmult -= (0 < zmult) - (zmult < 0);
+ }
/* ... and insert it into the command line. */
do_single(*minfo.cur);
@@ -1246,43 +1260,6 @@ do_menucmp(int lst)
unmetafy_line();
}
-/**/
-int
-reverse_menu(UNUSED(Hookdef dummy), UNUSED(void *dummy2))
-{
- int was_meta;
-
- if (minfo.cur == NULL)
- return 1;
-
- do {
- if (minfo.cur == (minfo.group)->matches) {
- do {
- if (!(minfo.group = (minfo.group)->prev))
- minfo.group = lmatches;
- } while (!(minfo.group)->mcount);
- minfo.cur = (minfo.group)->matches + (minfo.group)->mcount - 1;
- } else
- minfo.cur--;
- } while ((menuacc &&
- !hasbrpsfx(*(minfo.cur), minfo.prebr, minfo.postbr)) ||
- ((*minfo.cur)->flags & CMF_DUMMY) ||
- (((*minfo.cur)->flags & (CMF_NOLIST | CMF_MULT)) &&
- (!(*minfo.cur)->str || !*(*minfo.cur)->str)));
- /* May already be metafied if called from within a selection */
- if (zlemetaline == NULL) {
- metafy_line();
- was_meta = 0;
- }
- else
- was_meta = 1;
- do_single(*(minfo.cur));
- if (!was_meta)
- unmetafy_line();
-
- return 0;
-}
-
/* Accepts the current completion and starts a new arg, *
* with the next completions. This gives you a way to *
* accept several selections from the list of matches. */
diff --git a/Src/Zle/zle_tricky.c b/Src/Zle/zle_tricky.c
index 7217abc7a..e8dc93e74 100644
--- a/Src/Zle/zle_tricky.c
+++ b/Src/Zle/zle_tricky.c
@@ -345,14 +345,8 @@ mod_export int
reversemenucomplete(char **args)
{
wouldinstab = 0;
- if (!menucmp) {
- menucomplete(args);
- /*
- * Drop through, since we are now on the first item instead of
- * the last. We've already updated the display, so this is a
- * bit inefficient, but it's simple and it works.
- */
- }
+ zmult = -zmult;
+ menucomplete(args);
runhookdef(REVERSEMENUHOOK, NULL);
return 0;