1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-09-04 22:51:42 +02:00

35627: make reverse-menu-complete start with the last match in

menu selection
This commit is contained in:
Oliver Kiddle 2015-06-29 01:53:59 +02:00
parent fbc97e72e8
commit 44c56f3af5
7 changed files with 40 additions and 68 deletions

View file

@ -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

View file

@ -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;

View file

@ -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;

View file

@ -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,

View file

@ -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;

View file

@ -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. */

View file

@ -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;