zsh-workers
 help / color / mirror / code / Atom feed
* [PATCH] Make _expand_alias more usable as a completer
@ 2021-05-28 21:59 Marlon Richert
  2021-06-02 23:23 ` Oliver Kiddle
  0 siblings, 1 reply; 14+ messages in thread
From: Marlon Richert @ 2021-05-28 21:59 UTC (permalink / raw)
  To: Zsh hackers list

[-- Attachment #1: Type: text/plain, Size: 494 bytes --]

When _expand_alias is invoked as a completer, if 'complete' is set to
'true', let _expand_alias always return 1. This is analogous to how
this style behaves when _expand_alias is invoked as a widget or when
the _expand completer's 'accept-exact' style is set to 'continue',
which allows you to put it at the start of the 'completer' list.

Additionally, tag alias expansions as 'expansions', rather than as
'aliases', to prevent aliases & alias expansion from being lumped into
the same group.

[-- Attachment #2: 0001-Make-_expand_alias-more-usable-as-a-completer.txt --]
[-- Type: text/plain, Size: 2590 bytes --]

From 7722347b8e408413f7b49af5e16b1b4a518c1aa9 Mon Sep 17 00:00:00 2001
From: Marlon Richert <marlon.richert@gmail.com>
Date: Sat, 29 May 2021 00:16:22 +0300
Subject: [PATCH] Make _expand_alias more usable as a completer

When _expand_alias is invoked as a completer, if 'complete' is
set to 'true', let _expand_alias always return 1. This is analogous to
how this style behaves when _expand_alias is invoked as a widget or when
the _expand completer's 'accept-exact' style is set to 'continue', which
allows you to put it at the start of the 'completer' list.

Additionally, tag alias expansions as 'expansions', rather than as
'aliases', to prevent aliases & alias expansion from being lumped into
the same group.
---
 Completion/Base/Completer/_expand_alias |  3 ++-
 Doc/Zsh/compsys.yo                      | 10 ++++++----
 2 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/Completion/Base/Completer/_expand_alias b/Completion/Base/Completer/_expand_alias
index 8240e4162..275da157c 100644
--- a/Completion/Base/Completer/_expand_alias
+++ b/Completion/Base/Completer/_expand_alias
@@ -59,7 +59,8 @@ if [[ -n $tmp ]]; then
     fi
   fi
   zstyle -T ":completion:${curcontext}:" add-space || suf=( -S '' )
-  $pre _wanted aliases expl alias compadd -UQ "$suf[@]" -- ${tmp%%[[:blank:]]##}
+  $pre _wanted expansions expl expansion compadd -UQ "$suf[@]" -- ${tmp%%[[:blank:]]##} &&
+      ! zstyle -t ":completion:${curcontext}:" complete
 elif (( $#pre )) && zstyle -t ":completion:${curcontext}:" complete; then
   $pre _aliases -s "$sel" -S ''
 else
diff --git a/Doc/Zsh/compsys.yo b/Doc/Zsh/compsys.yo
index 89b918d60..1b01f09a8 100644
--- a/Doc/Zsh/compsys.yo
+++ b/Doc/Zsh/compsys.yo
@@ -1295,10 +1295,12 @@ the two strings `tt(start)' and `tt(stop)'.
 )
 kindex(complete, completion style)
 item(tt(complete))(
-This is used by the tt(_expand_alias) function when invoked as a
-bindable command.  If set to `true' and the word on the command
-line is not the name of an alias, matching alias names will be
-completed.
+This is used by the tt(_expand_alias) function. When tt(_expand_alias) is 
+invoked as a bindable command, if tt(complete) is set to `true' and the word on 
+the command line is not the name of an alias, matching alias names will be 
+completed. When tt(_expand_alias) is invoked as a completer, if tt(complete) is 
+set to `true', tt(_expand_alias) will add the expansion as a match and the 
+completion system will also be allowed to continue.
 )
 kindex(complete-options, completion style)
 item(tt(complete-options))(
-- 
2.30.1 (Apple Git-130)


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] Make _expand_alias more usable as a completer
  2021-05-28 21:59 [PATCH] Make _expand_alias more usable as a completer Marlon Richert
@ 2021-06-02 23:23 ` Oliver Kiddle
  2021-06-03 21:42   ` Marlon Richert
  0 siblings, 1 reply; 14+ messages in thread
From: Oliver Kiddle @ 2021-06-02 23:23 UTC (permalink / raw)
  To: Zsh hackers list

On 29 May, Marlon Richert wrote:
> When _expand_alias is invoked as a completer, if 'complete' is set to
> 'true', let _expand_alias always return 1. This is analogous to how
> this style behaves when _expand_alias is invoked as a widget or when
> the _expand completer's 'accept-exact' style is set to 'continue',
> which allows you to put it at the start of the 'completer' list.

In practical tests, I'm not finding that this works too well, it ends up
removing the characters typed. From _expand_aliases, you end up with a
call to compadd -QU and later you get a compadd -Q. For testing play
around with the following:

  _foo() {
    compadd -QU 'ls -al'
    compadd -Q lsusb lsvfs
  }
  compdef _foo foo
  foo ls<tab>

I can see the motivation for the feature but it needs compstate[insert]=menu
to be usable, at least from my setup. Setting that tends to be applicable
wherever you're using -U to change what was typed so far.

It feels like a bug that this example can't recognise the unambiguous
"ls" prefix but aliases often expand to something quite different to the
initial alias name.

I also wonder if this would be better done from within _command_names
directly but I'm not sure.

Oliver


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] Make _expand_alias more usable as a completer
  2021-06-02 23:23 ` Oliver Kiddle
@ 2021-06-03 21:42   ` Marlon Richert
  2021-06-20 19:49     ` Lawrence Velázquez
  0 siblings, 1 reply; 14+ messages in thread
From: Marlon Richert @ 2021-06-03 21:42 UTC (permalink / raw)
  To: Oliver Kiddle; +Cc: Zsh hackers list

On Thu, Jun 3, 2021 at 2:24 AM Oliver Kiddle <opk@zsh.org> wrote:
> In practical tests, I'm not finding that this works too well, it ends up
> removing the characters typed.

I cannot reproduce that. Here's what I tried:

% cd $(mktemp -d)
% print "PS1='%# ' PS2='' RPS2='< %^'\nsetopt transientrprompt" > .zshrc
% exec env -i HOME=$PWD TERM=$TERM zsh -d
% autoload -Uz compinit
% compinit
% _foo() {
compadd -QU 'ls -al'
compadd -Q lsusb lsvfs
}
% compdef _foo foo
% foo <tab>
% foo ls<tab>
ls -al  lsusb   lsvfs

It inserts the unambiguous prefix and cycles through the three
choices, without removing any characters I've typed. Am I missing
something?

> I also wonder if this would be better done from within _command_names
> directly but I'm not sure.

Actually, I feel like it could instead be added to the _expand
completer. Would that be a better idea than what I presented in this
patch? I could, for example, move the actual business logic for
expanding aliases from _expand_alias to _expand, and then have
_expand_alias call _expand to do the work.


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] Make _expand_alias more usable as a completer
  2021-06-03 21:42   ` Marlon Richert
@ 2021-06-20 19:49     ` Lawrence Velázquez
  2021-06-20 21:08       ` Mikael Magnusson
  0 siblings, 1 reply; 14+ messages in thread
From: Lawrence Velázquez @ 2021-06-20 19:49 UTC (permalink / raw)
  To: zsh-workers; +Cc: Marlon Richert

On Thu, Jun 3, 2021, at 5:42 PM, Marlon Richert wrote:
> On Thu, Jun 3, 2021 at 2:24 AM Oliver Kiddle <opk@zsh.org> wrote:
> > In practical tests, I'm not finding that this works too well, it ends up
> > removing the characters typed.
> 
> I cannot reproduce that. [...] Am I missing something?
> 
> > I also wonder if this would be better done from within _command_names
> > directly but I'm not sure.
> 
> Actually, I feel like it could instead be added to the _expand
> completer. Would that be a better idea than what I presented in this
> patch?

Anyone have answers to Marlon's questions?

-- 
vq


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] Make _expand_alias more usable as a completer
  2021-06-20 19:49     ` Lawrence Velázquez
@ 2021-06-20 21:08       ` Mikael Magnusson
  2021-06-20 22:24         ` Marlon Richert
  0 siblings, 1 reply; 14+ messages in thread
From: Mikael Magnusson @ 2021-06-20 21:08 UTC (permalink / raw)
  To: Lawrence Velázquez; +Cc: zsh-workers, Marlon Richert

On 6/20/21, Lawrence Velázquez <larryv@zsh.org> wrote:
> On Thu, Jun 3, 2021, at 5:42 PM, Marlon Richert wrote:
>> On Thu, Jun 3, 2021 at 2:24 AM Oliver Kiddle <opk@zsh.org> wrote:
>> > In practical tests, I'm not finding that this works too well, it ends
>> > up
>> > removing the characters typed.
>>
>> I cannot reproduce that. [...] Am I missing something?
>>
>> > I also wonder if this would be better done from within _command_names
>> > directly but I'm not sure.
>>
>> Actually, I feel like it could instead be added to the _expand
>> completer. Would that be a better idea than what I presented in this
>> patch?
>
> Anyone have answers to Marlon's questions?

If it helps, I disagree with conflating _expand_alias (expanding
aliases) and _expand (filename expansion).

-- 
Mikael Magnusson


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] Make _expand_alias more usable as a completer
  2021-06-20 21:08       ` Mikael Magnusson
@ 2021-06-20 22:24         ` Marlon Richert
  2021-07-18 23:34           ` Lawrence Velázquez
  0 siblings, 1 reply; 14+ messages in thread
From: Marlon Richert @ 2021-06-20 22:24 UTC (permalink / raw)
  To: Mikael Magnusson; +Cc: Lawrence Velázquez, Zsh hackers list

On Mon, Jun 21, 2021 at 12:08 AM Mikael Magnusson <mikachu@gmail.com> wrote:
>
> On 6/20/21, Lawrence Velázquez <larryv@zsh.org> wrote:
> > On Thu, Jun 3, 2021, at 5:42 PM, Marlon Richert wrote:
> >> On Thu, Jun 3, 2021 at 2:24 AM Oliver Kiddle <opk@zsh.org> wrote:
> >>
> >> > I also wonder if this would be better done from within _command_names
> >> > directly but I'm not sure.
> >>
> >> Actually, I feel like it could instead be added to the _expand
> >> completer. Would that be a better idea than what I presented in this
> >> patch?
> >
> > Anyone have answers to Marlon's questions?
>
> If it helps, I disagree with conflating _expand_alias (expanding
> aliases) and _expand (filename expansion).

_expand already handles a lot more than just "filename expansion"
(which it actually does not handle at all). A quick test going through
all forms of expansion listed at
https://zsh.sourceforge.io/Doc/Release/Expansion.html shows that
_expand currently handles all of the following:
* parameter expansion
* command substitution
* arithmetic expansion
* brace expansion
* filename generation
(but not history expansion, alias expansion, process substitution or
filename expansion).

Since alias expansion is in fact listed at
https://zsh.sourceforge.io/Doc/Release/Expansion.html, I don't think
it would be too weird to add it to the _expand completer.


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] Make _expand_alias more usable as a completer
  2021-06-20 22:24         ` Marlon Richert
@ 2021-07-18 23:34           ` Lawrence Velázquez
  2021-07-28  3:23             ` Bart Schaefer
  0 siblings, 1 reply; 14+ messages in thread
From: Lawrence Velázquez @ 2021-07-18 23:34 UTC (permalink / raw)
  To: zsh-workers; +Cc: Marlon Richert

On Sun, Jun 20, 2021, at 6:24 PM, Marlon Richert wrote:
> On Mon, Jun 21, 2021 at 12:08 AM Mikael Magnusson <mikachu@gmail.com> wrote:
> >
> > On 6/20/21, Lawrence Velázquez <larryv@zsh.org> wrote:
> > > On Thu, Jun 3, 2021, at 5:42 PM, Marlon Richert wrote:
> > >> On Thu, Jun 3, 2021 at 2:24 AM Oliver Kiddle <opk@zsh.org> wrote:
> > >>
> > >> > I also wonder if this would be better done from within _command_names
> > >> > directly but I'm not sure.
> > >>
> > >> Actually, I feel like it could instead be added to the _expand
> > >> completer. Would that be a better idea than what I presented in this
> > >> patch?
> > >
> > > Anyone have answers to Marlon's questions?
> >
> > If it helps, I disagree with conflating _expand_alias (expanding
> > aliases) and _expand (filename expansion).
> 
> _expand already handles a lot more than just "filename expansion"
> (which it actually does not handle at all). A quick test going through
> all forms of expansion listed at
> https://zsh.sourceforge.io/Doc/Release/Expansion.html shows that
> _expand currently handles all of the following:
> * parameter expansion
> * command substitution
> * arithmetic expansion
> * brace expansion
> * filename generation
> (but not history expansion, alias expansion, process substitution or
> filename expansion).
> 
> Since alias expansion is in fact listed at
> https://zsh.sourceforge.io/Doc/Release/Expansion.html, I don't think
> it would be too weird to add it to the _expand completer.

Any other feedback on 48946?

-- 
vq


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] Make _expand_alias more usable as a completer
  2021-07-18 23:34           ` Lawrence Velázquez
@ 2021-07-28  3:23             ` Bart Schaefer
  2021-08-01 18:50               ` [PATCH] Make _expand handle aliases (was Re: [PATCH] Make _expand_alias more usable as a completer) Marlon Richert
  0 siblings, 1 reply; 14+ messages in thread
From: Bart Schaefer @ 2021-07-28  3:23 UTC (permalink / raw)
  To: Zsh hackers list; +Cc: Marlon Richert

On Sun, Jul 18, 2021 at 4:35 PM Lawrence Velázquez <larryv@zsh.org> wrote:
>
> On Sun, Jun 20, 2021, at 6:24 PM, Marlon Richert wrote:
> > On Mon, Jun 21, 2021 at 12:08 AM Mikael Magnusson <mikachu@gmail.com> wrote:
> > >
> > > On 6/20/21, Lawrence Velázquez <larryv@zsh.org> wrote:
> > > > On Thu, Jun 3, 2021, at 5:42 PM, Marlon Richert wrote:
> > > >> On Thu, Jun 3, 2021 at 2:24 AM Oliver Kiddle <opk@zsh.org> wrote:
> > > >>
> > > >> > I also wonder if this would be better done from within _command_names
> > > >> > directly but I'm not sure.

Handling it in _command_names would not be sufficient for global
aliases.  That said, I haven't actually investigated the use of
_expand_alias for global aliases.

> > > >> Actually, I feel like it could instead be added to the _expand
> > > >> completer. Would that be a better idea than what I presented in this
> > > >> patch?
> > > >
> > > > Anyone have answers to Marlon's questions?
> > >
> > > If it helps, I disagree with conflating _expand_alias (expanding
> > > aliases) and _expand (filename expansion).
> >
> > _expand already handles a lot more than just "filename expansion"
> > (which it actually does not handle at all).

Naming has always been a bit strange here.  Yes, strictly per the
docs, "filename expansion" refers to replacing a leading tilde with a
path prefix, and "filename generation" is a fancy term for globbing
but is considered a form of expansion.  I've forgotten why we couldn't
just stick with "tilde expansion" and "globbing" and leave "filename"
out of it entirely, but there you are.  In any event I think it's
likely that Mikael was referring to globbing.

> > Since alias expansion is in fact listed at
> > https://zsh.sourceforge.io/Doc/Release/Expansion.html, I don't think
> > it would be too weird to add it to the _expand completer.

I think it's actually a bit weird to allow _expand_alias to work as a
completer at all, because the completion system generally functions
very badly when the matches do not consist of single words, and
aliases don't usually have one-word replacements.  As soon as you
introduce something that contains spaces, completion gets very
confused (unless you force it directly into menu completion or
selection); if (otherwise) you attempt to press TAB twice to enter
menu completion, it'll instead start a new completion based on the
word after the rightmost space that is still to the left of the
cursor.  This is especially true when using compadd -U.

I suspect this may be where Oliver's tests and Marlon's attempt to
reproduce, went astray from one another.  In any case, I'm fairly sure
this is the reason that _expand_alias (before the patch) does not
allow other completers to run, and similarly it's why the user is
admonished to place _expand before _complete in the zstyle.

> Any other feedback on 48946?

Looking independently at the two questions, my feeling is I'd avoid
the patch as-is, but it wouldn't be unreasonable for _expand to handle
aliases (under control of a zstyle).


^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH] Make _expand handle aliases (was Re: [PATCH] Make _expand_alias more usable as a completer)
  2021-07-28  3:23             ` Bart Schaefer
@ 2021-08-01 18:50               ` Marlon Richert
  2022-03-31 22:35                 ` Lawrence Velázquez
  0 siblings, 1 reply; 14+ messages in thread
From: Marlon Richert @ 2021-08-01 18:50 UTC (permalink / raw)
  To: Bart Schaefer; +Cc: Zsh hackers list, Oliver Kiddle

[-- Attachment #1: Type: text/plain, Size: 1696 bytes --]

On Wed, Jul 28, 2021 at 6:23 AM Bart Schaefer <schaefer@brasslantern.com> wrote:
>
> I think it's actually a bit weird to allow _expand_alias to work as a
> completer at all, because the completion system generally functions
> very badly when the matches do not consist of single words, and
> aliases don't usually have one-word replacements.  As soon as you
> introduce something that contains spaces, completion gets very
> confused (unless you force it directly into menu completion or
> selection); if (otherwise) you attempt to press TAB twice to enter
> menu completion, it'll instead start a new completion based on the
> word after the rightmost space that is still to the left of the
> cursor.  This is especially true when using compadd -U.
>
> I suspect this may be where Oliver's tests and Marlon's attempt to
> reproduce, went astray from one another.  In any case, I'm fairly sure
> this is the reason that _expand_alias (before the patch) does not
> allow other completers to run, and similarly it's why the user is
> admonished to place _expand before _complete in the zstyle.
>
> Looking independently at the two questions, my feeling is I'd avoid
> the patch as-is, but it wouldn't be unreasonable for _expand to handle
> aliases (under control of a zstyle).

Alright, here's a new patch, which moves the alias expansion code from
_expand_alias to _expand (and refactors it) and deprecates
_expand_alias's use as a completer. I also updated the documentation
and added tests.

Note that I reused the zstyle names from _expand_alias in _alias. I
think their names are less than optimal in _expand, but renaming them
would break people's existing zstyle config for _expand_alias.

[-- Attachment #2: 0001-Make-_expand-handle-aliases.txt --]
[-- Type: text/plain, Size: 12629 bytes --]

From 7467abb482824650913636340844919be4bcf212 Mon Sep 17 00:00:00 2001
From: Marlon Richert <marlonrichert@users.noreply.github.com>
Date: Sun, 1 Aug 2021 21:40:01 +0300
Subject: [PATCH] Make _expand handle aliases

This deprecates _expand_alias's use as a completer.
---
 Completion/Base/Completer/_expand       | 74 ++++++++++++++++++++++++-
 Completion/Base/Completer/_expand_alias | 70 +++--------------------
 Doc/Zsh/compsys.yo                      | 62 +++++++++------------
 Test/Y01completion.ztst                 | 16 +++++-
 4 files changed, 120 insertions(+), 102 deletions(-)

diff --git a/Completion/Base/Completer/_expand b/Completion/Base/Completer/_expand
index 86b4ac6e4..7a24f8aa1 100644
--- a/Completion/Base/Completer/_expand
+++ b/Completion/Base/Completer/_expand
@@ -11,11 +11,12 @@ setopt localoptions nonomatch
 
 [[ _matcher_num -gt 1 ]] && return 1
 
-local exp word sort expr expl subd pref suf=" " force opt asp tmp opre pre epre
-local continue=0
+local -a exp subd tmpa match mbegin mend
+local -i continue=0
+local word sort expl pref suf=' ' force opt asp tmp opre pre epre
 
 (( $# )) &&
-    while getopts gsco opt; do
+    while getopts agsco opt; do
       force="$force$opt"
     done
 
@@ -25,6 +26,73 @@ else
   word="$IPREFIX$PREFIX$SUFFIX$ISUFFIX"
 fi
 
+# Alias expansion:
+() {
+
+  if { (( CURRENT == 1 )) && zstyle -T ":completion:${curcontext}:" regular } ||
+      zstyle -t ":completion:${curcontext}:" regular always; then 
+    exp=( $aliases[$word] )
+    if [[ -n "$exp" ]]; then
+      # If the first shell word in the expansion is the same as the alias, then 
+      # escape it, so it doesn't get re-expanded on execution.
+      [[ "${${(z)exp}[1]}" = "$word" ]] &&
+          exp=( "${(S)exp/#(#b)(*)$word/$match[1]\\$word}" )
+      return 0
+    fi
+  fi
+
+  if zstyle -T ":completion:${curcontext}:" global; then
+    exp=( $galiases[$word] )
+    if [[ -n "$exp" ]]; then
+      # Escape all occurences of the global alias in its expansion, so these 
+      # don't get re-expanded on execution.
+      tmp="$exp"
+      tmpa=( ${(z)tmp} )
+      exp=()
+      while (( ${#tmpa[@]} )); do
+        exp[1]+="${(M)tmp#*$tmpa[1]}"
+        tmp="${tmp#*$tmpa[1]}"
+        [[ "$tmpa[1]" == "$word" ]] &&
+            exp[1]="${exp/%$word/\\$word}"
+        shift tmpa
+      done
+      exp[1]+="$tmp"
+      tmp=
+      return 0
+    fi
+  fi
+
+  if zstyle -t ":completion:${curcontext}:" disabled; then
+    exp=( $dis_aliases[$word] )
+    [[ -n "$exp" ]] && 
+        return
+  fi
+
+  if zstyle -T ":completion:${curcontext}:" global && 
+      zstyle -t ":completion:${curcontext}:" disabled; then
+    exp=( $dis_galiases[$word] )
+    [[ -n "$exp" ]] &&
+        return
+  fi
+
+  return 1
+
+} && {
+  zstyle -T ":completion:${curcontext}:" add-space true yes on 1 &&
+      tmpa=( -S ' ' )
+  _description expansions expl expansions "o:$word"
+
+  if compadd "$expl[@]" -UQ $tmpa[@] -- $exp; then
+    ! zstyle -t ":completion:${curcontext}:" accept-exact continue
+    return
+  fi
+
+}
+
+# If we've been called with `-a`, then don't expand anything else than aliases.
+[[ "$force" = *a* ]] &&
+    return 1
+
 [[ "$word" = *\$(|\{[^\}]#) ||
    ( "$word" = *\$[a-zA-Z0-9_]## && $+parameters[${word##*\$}] -eq 0 ) ]] &&
     return 1
diff --git a/Completion/Base/Completer/_expand_alias b/Completion/Base/Completer/_expand_alias
index 8240e4162..c588dfadb 100644
--- a/Completion/Base/Completer/_expand_alias
+++ b/Completion/Base/Completer/_expand_alias
@@ -1,67 +1,15 @@
-#compdef -K _expand_alias complete-word \C-xa
+#compdef -K _expand_alias complete-word \C-Xa
 
-local word expl tmp pre sel what
-local -a tmpa suf
-
-eval "$_comp_setup"
-
-if [[ -n $funcstack[2] ]]; then
-  if [[ "$funcstack[2]" = _prefix ]]; then
-    word="$IPREFIX$PREFIX$SUFFIX"
-  else
-    word="$IPREFIX$PREFIX$SUFFIX$ISUFFIX"
-  fi
-  pre=()
+if (( ${funcstack[(I)_main_complete]} )); then
+  compstate[to_end]=match
+  _main_complete _expand_alias
 else
-  local curcontext="$curcontext"
 
-  if [[ -z "$curcontext" ]]; then
-    curcontext="expand-alias-word:::"
-  else
-    curcontext="expand-alias-word:${curcontext#*:}"
+  if _expand -a; then
+    compstate[insert]=1
+    return
   fi
 
-  word="$IPREFIX$PREFIX$SUFFIX$ISUFFIX"
-  pre=(_main_complete - aliases)
-fi
-
-zstyle -s ":completion:${curcontext}:" regular tmp || tmp=yes
-case $tmp in
-always) sel=r;;
-yes|1|true|on) [[ CURRENT -eq 1 ]] && sel=r;;
-esac
-zstyle -T ":completion:${curcontext}:" global && sel="g$sel"
-zstyle -t ":completion:${curcontext}:" disabled && sel="${sel}${(U)sel}"
-
-tmp=
-[[ $sel = *r* ]] && tmp=$aliases[$word]
-[[ -z $tmp && $sel = *g* ]] && tmp=$galiases[$word]
-[[ -z $tmp && $sel = *R* ]] && tmp=$dis_aliases[$word]
-[[ -z $tmp && $sel = *G* ]] && tmp=$dis_galiases[$word]
-
-if [[ -n $tmp ]]; then
-  # We used to remove the quoting from the value in the parameter.
-  # That was probably just an oversight: an alias is always replaced
-  # literally.
-  tmp=${tmp%%[[:blank:]]##}
-  if [[ $tmp[1] = [[:alnum:]_] ]]; then
-    tmpa=(${(z)tmp})
-    if [[ $tmpa[1] = $word && $tmp = $aliases[$word] ]]; then
-      # This is an active regular alias and the first word in the result
-      # is the same as what was on the line already.  Quote it so
-      # that it doesn't get reexanded on execution.
-      #
-      # Strictly we also need to check if the original word matches
-      # a later word in the expansion and the previous words are
-      # all aliases where the expansion ends in " ", but I'm
-      # too lazy.
-      tmp="\\$tmp"
-    fi
-  fi
-  zstyle -T ":completion:${curcontext}:" add-space || suf=( -S '' )
-  $pre _wanted aliases expl alias compadd -UQ "$suf[@]" -- ${tmp%%[[:blank:]]##}
-elif (( $#pre )) && zstyle -t ":completion:${curcontext}:" complete; then
-  $pre _aliases -s "$sel" -S ''
-else
-  return 1
+  zstyle -t ":completion:${curcontext}:" complete &&
+      _main_complete - expand-alias _aliases
 fi
diff --git a/Doc/Zsh/compsys.yo b/Doc/Zsh/compsys.yo
index 89b918d60..88a368608 100644
--- a/Doc/Zsh/compsys.yo
+++ b/Doc/Zsh/compsys.yo
@@ -1179,10 +1179,10 @@ style (see below) to `false'.
 )
 kindex(add-space, completion style)
 item(tt(add-space))(
-This style is used by the tt(_expand) completer.  If it is `true' (the
-default), a space will be inserted after all words resulting from the 
-expansion, or a slash in the case of directory names.  If the value
-is `tt(file)', the completer will only add a space
+This style is used by the tt(_expand) completer and the tt(_expand_alias) 
+bindable command.  If it is `true' (the default), a space will be inserted 
+after all words resulting from the expansion, or a slash in the case of 
+directory names.  If the value is `tt(file)', the completer will only add a space
 to names of existing files.  Either a boolean `true' or the value
 `tt(file)' may be combined with `tt(subst)', in which case the completer
 will not add a space to words generated from the expansion of a
@@ -1295,10 +1295,9 @@ the two strings `tt(start)' and `tt(stop)'.
 )
 kindex(complete, completion style)
 item(tt(complete))(
-This is used by the tt(_expand_alias) function when invoked as a
-bindable command.  If set to `true' and the word on the command
-line is not the name of an alias, matching alias names will be
-completed.
+When the tt(_expand_alias) bindable command is invoked, if tt(complete) is set 
+to `true' and the word on the command line is not the name of an alias, 
+matching alias names will be completed.
 )
 kindex(complete-options, completion style)
 item(tt(complete-options))(
@@ -1362,8 +1361,8 @@ may be empty to force a delimiter to be typed.
 )
 kindex(disabled, completion style)
 item(tt(disabled))(
-If this is set to `true', the tt(_expand_alias) completer and bindable 
-command will try to expand disabled aliases, too.  The default is
+If this is set to `true', the tt(_expand) completer and the tt(_expand_alias) 
+bindable command will try to expand disabled aliases, too.  The default is
 `false'.
 )
 kindex(domains, completion style)
@@ -1656,8 +1655,8 @@ style) or else the original string from the line.
 )
 kindex(global, completion style)
 item(tt(global))(
-If this is set to `true' (the default), the tt(_expand_alias)
-completer and bindable command will try to expand global aliases.
+If this is set to `true' (the default), the tt(_expand) completer and the 
+tt(_expand_alias) bindable command will try to expand global aliases.
 )
 kindex(group-name, completion style)
 item(tt(group-name))(
@@ -2480,11 +2479,11 @@ tt(zle_tr<TAB>) can be completed to tt(Zle/zle_tricky.c).
 )
 kindex(regular, completion style)
 item(tt(regular))(
-This style is used by the tt(_expand_alias) completer and bindable 
-command.  If set to `true' (the default), regular aliases will be
-expanded but only in command position.  If it is set to `false',
-regular aliases will never be expanded.   If it is set to `tt(always)',
-regular aliases will be expanded even if not in command position.
+This style is used by the tt(_expand) completer and the tt(_expand_alias) 
+bindable command.  If set to `true' (the default), regular aliases will be
+expanded but only in command position.  If it is set to `false', regular 
+aliases will never be expanded.   If it is set to `tt(always)', regular aliases 
+will be expanded even if not in command position.
 )
 kindex(rehash, completion style)
 item(tt(rehash))(
@@ -3173,17 +3172,8 @@ tt(glob) and tt(subst-globs-only) styles.
 
 It is also possible to call tt(_expand) as a function, in which case the
 different modes may be selected with options: tt(-s) for
-tt(substitute), tt(-g) for tt(glob) and tt(-o) for tt(subst-globs-only).
-)
-findex(_expand_alias)
-item(tt(_expand_alias))(
-If the word the cursor is on is an alias, it is expanded and no other
-completers are called.  The types of aliases which are to be expanded can
-be controlled with the styles tt(regular), tt(global) and tt(disabled).
-
-This function is also a bindable command, see
-ifzman(the section `Bindable Commands' below)\
-ifnzman(noderef(Bindable Commands)).
+tt(substitute), tt(-g) for tt(glob) and tt(-o) for tt(subst-globs-only). 
+Alternatively, if called with tt(-a), tt(_expand) will do alias expansion only.
 )
 findex(_extensions)
 item(tt(_extensions))(
@@ -3406,17 +3396,15 @@ then calls the tt(_correct) completer.
 )
 findex(_expand_alias (^Xa))
 item(tt(_expand_alias) (tt(^Xa)))(
-This function can be used as a completer and as a bindable command.
-It expands the word the cursor is on if it is an alias.  The types of
-alias expanded can be controlled with the styles tt(regular), tt(global)
+This function expands the word the cursor is on if it is an alias.  The types 
+of alias expanded can be controlled with the styles tt(regular), tt(global)
 and tt(disabled).
 
-When used as a bindable command there is one additional feature that
-can be selected by setting the tt(complete) style to `true'.  In this
-case, if the word is not the name of an alias, tt(_expand_alias) tries
-to complete the word to a full alias name without expanding it.  It
-leaves the cursor directly after the completed word so that invoking
-tt(_expand_alias) once more will expand the now-complete alias name.
+Additionally, if the tt(complete) style is set to `true' and the word is not 
+the name of an alias, then tt(_expand_alias) tries to complete the word to a 
+full alias name without expanding it.  It leaves the cursor directly after the 
+completed word so that invoking tt(_expand_alias) once more will expand the 
+now-complete alias name.
 )
 findex(_expand_word (^Xe))
 item(tt(_expand_word) (tt(^Xe)))(
diff --git a/Test/Y01completion.ztst b/Test/Y01completion.ztst
index 882a0adc4..ed7f6738d 100644
--- a/Test/Y01completion.ztst
+++ b/Test/Y01completion.ztst
@@ -44,8 +44,22 @@
 >line: {: dir1/}{}
 >line: {: dir2/}{}
 
+  comptesteval "alias \*=' * * \$\$ tst'"
+  comptesteval "alias -g '\$\$'=' * \$\$ \$\$ tst'"
+  comptest $' *\C-D'
+0:_expand substitutes regular aliases and escapes them, if necessary
+>DESCRIPTION:{expansions}
+>NO:{ \* * $$ tst}
+
+  comptest $': $$\C-D'
+0:_expand can substitutes global aliases and escapes them, if necessary
+>DESCRIPTION:{expansions}
+>NO:{ * \$$ \$$ tst}
+
+  comptesteval "zstyle '*' regular no"
+  comptesteval "zstyle '*' global no"
   comptest $': *\t\t\t\t\t\t'
-0:_expand shows file types
+0:_expand shows file types (and does not substitute aliases, when this is disabled)
 >line: {: dir1/}{}
 >DESCRIPTION:{expansions}
 >DI:{dir1}
-- 
2.30.1 (Apple Git-130)


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] Make _expand handle aliases (was Re: [PATCH] Make _expand_alias more usable as a completer)
  2021-08-01 18:50               ` [PATCH] Make _expand handle aliases (was Re: [PATCH] Make _expand_alias more usable as a completer) Marlon Richert
@ 2022-03-31 22:35                 ` Lawrence Velázquez
  2022-04-01  0:37                   ` Bart Schaefer
  0 siblings, 1 reply; 14+ messages in thread
From: Lawrence Velázquez @ 2022-03-31 22:35 UTC (permalink / raw)
  To: zsh-workers; +Cc: Marlon Richert

On Sun, Aug 1, 2021, at 2:50 PM, Marlon Richert wrote:
> Alright, here's a new patch, which moves the alias expansion code from
> _expand_alias to _expand (and refactors it) and deprecates
> _expand_alias's use as a completer. I also updated the documentation
> and added tests.
>
> Note that I reused the zstyle names from _expand_alias in _alias. I
> think their names are less than optimal in _expand, but renaming them
> would break people's existing zstyle config for _expand_alias.
>
> Attachments:
> * 0001-Make-_expand-handle-aliases.txt

*bump*

-- 
vq


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] Make _expand handle aliases (was Re: [PATCH] Make _expand_alias more usable as a completer)
  2022-03-31 22:35                 ` Lawrence Velázquez
@ 2022-04-01  0:37                   ` Bart Schaefer
  2022-05-06  5:57                     ` Marlon Richert
  0 siblings, 1 reply; 14+ messages in thread
From: Bart Schaefer @ 2022-04-01  0:37 UTC (permalink / raw)
  To: Lawrence Velázquez; +Cc: Zsh hackers list, Marlon Richert

On Thu, Mar 31, 2022 at 3:36 PM Lawrence Velázquez <larryv@zsh.org> wrote:
>
> On Sun, Aug 1, 2021, at 2:50 PM, Marlon Richert wrote:
> > Alright, here's a new patch, which moves the alias expansion code from
> > _expand_alias to _expand (and refactors it) and deprecates
> > _expand_alias's use as a completer. I also updated the documentation
> > and added tests.
>
> *bump*

I'm uncomfortable with the change that expanding aliases in command
position is the default behavior of _expand.  It never did this
before.  It means that if there is an alias that is the prefix of
another command name, expanding that alias will take precedence over
completing the suffix, which i think is an undesirable effect as a new
default.

Furthermore, the behavior is a bit odd.  With the patch, given an
alias named "xyz", and completer style _expand _complete, if you type
TAB after "xy" you get "xyz " (with trailing space).  Since TAB after
"xyz" yields the the value of the alias, the added space feels wrong;
the first TAB should stop before the space is appended so a second TAB
can do the expanding.  Perhaps there's a combination of the supported
styles that provides this behavior, I didn't dig into it very far.


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] Make _expand handle aliases (was Re: [PATCH] Make _expand_alias more usable as a completer)
  2022-04-01  0:37                   ` Bart Schaefer
@ 2022-05-06  5:57                     ` Marlon Richert
  2022-05-07 20:39                       ` Bart Schaefer
  0 siblings, 1 reply; 14+ messages in thread
From: Marlon Richert @ 2022-05-06  5:57 UTC (permalink / raw)
  To: Bart Schaefer; +Cc: Lawrence Velázquez, Zsh hackers list

On Fri, Apr 1, 2022 at 3:37 AM Bart Schaefer <schaefer@brasslantern.com> wrote:
> I'm uncomfortable with the change that expanding aliases in command
> position is the default behavior of _expand.  It never did this
> before.  It means that if there is an alias that is the prefix of
> another command name, expanding that alias will take precedence over
> completing the suffix, which i think is an undesirable effect as a new
> default.

Yes, I agree; that is indeed a problem. I hadn't considered that.

> Furthermore, the behavior is a bit odd.  With the patch, given an
> alias named "xyz", and completer style _expand _complete, if you type
> TAB after "xy" you get "xyz " (with trailing space).  Since TAB after
> "xyz" yields the the value of the alias, the added space feels wrong;
> the first TAB should stop before the space is appended so a second TAB
> can do the expanding.  Perhaps there's a combination of the supported
> styles that provides this behavior, I didn't dig into it very far.

I don't like the way the space is added either, but it worked like
that before, too. I didn't want to change the logic. I think that's
better left to a separate patch.

In any case, perhaps moving alias expansion into _expand is not such a
good idea after all. I suppose it's better to be offered as part of
completing aliases, but listed separately, after the actual alias
completions.

Would it make more sense to fold alias expansion into _aliases?


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] Make _expand handle aliases (was Re: [PATCH] Make _expand_alias more usable as a completer)
  2022-05-06  5:57                     ` Marlon Richert
@ 2022-05-07 20:39                       ` Bart Schaefer
  2022-05-11  7:32                         ` Marlon Richert
  0 siblings, 1 reply; 14+ messages in thread
From: Bart Schaefer @ 2022-05-07 20:39 UTC (permalink / raw)
  To: Marlon Richert; +Cc: Lawrence Velázquez, Zsh hackers list

[-- Attachment #1: Type: text/plain, Size: 1202 bytes --]

On Thu, May 5, 2022 at 10:58 PM Marlon Richert <marlon.richert@gmail.com>
wrote:

> On Fri, Apr 1, 2022 at 3:37 AM Bart Schaefer <schaefer@brasslantern.com>
> wrote:
> > Furthermore, the behavior is a bit odd.  With the patch, given an
> > alias named "xyz", and completer style _expand _complete, if you type
> > TAB after "xy" you get "xyz " (with trailing space).  Since TAB after
> > "xyz" yields the the value of the alias, the added space feels wrong;
>
> I don't like the way the space is added either, but it worked like
> that before, too.


But before it was arguably correct, because you're completing a command,
not performing an expansion; theoretically there's nothing left to do to
the word after it completes.


> I suppose it's better to be offered as part of
> completing aliases, but listed separately, after the actual alias
> completions.
>

This is tricky, because if you complete (rather than expand) to a value
that has multiple shell words, you can't enter normal menu completion --
the next TAB will find that the line has new words on it and start a new
completion in that context.  Which might be the behavior you want here, but
would definitely need to be a style setting.

[-- Attachment #2: Type: text/html, Size: 1827 bytes --]

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] Make _expand handle aliases (was Re: [PATCH] Make _expand_alias more usable as a completer)
  2022-05-07 20:39                       ` Bart Schaefer
@ 2022-05-11  7:32                         ` Marlon Richert
  0 siblings, 0 replies; 14+ messages in thread
From: Marlon Richert @ 2022-05-11  7:32 UTC (permalink / raw)
  To: Bart Schaefer; +Cc: Lawrence Velázquez, Zsh hackers list

On Sat, May 7, 2022 at 11:39 PM Bart Schaefer <schaefer@brasslantern.com> wrote:
>> I suppose it's better to be offered as part of
>> completing aliases, but listed separately, after the actual alias
>> completions.
>
> This is tricky, because if you complete (rather than expand) to a value that has multiple shell words, you can't enter normal menu completion -- the next TAB will find that the line has new words on it and start a new completion in that context.

I tested menu completion with multi-word entries and it works fine.

> Which might be the behavior you want here, but would definitely need to be a style setting.

I agree.

I've also been thinking about adding a zstyle extra-verbose for
showing what each alias stands for, but I'll leave that to a separate
patch.


^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2022-05-11  7:33 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-28 21:59 [PATCH] Make _expand_alias more usable as a completer Marlon Richert
2021-06-02 23:23 ` Oliver Kiddle
2021-06-03 21:42   ` Marlon Richert
2021-06-20 19:49     ` Lawrence Velázquez
2021-06-20 21:08       ` Mikael Magnusson
2021-06-20 22:24         ` Marlon Richert
2021-07-18 23:34           ` Lawrence Velázquez
2021-07-28  3:23             ` Bart Schaefer
2021-08-01 18:50               ` [PATCH] Make _expand handle aliases (was Re: [PATCH] Make _expand_alias more usable as a completer) Marlon Richert
2022-03-31 22:35                 ` Lawrence Velázquez
2022-04-01  0:37                   ` Bart Schaefer
2022-05-06  5:57                     ` Marlon Richert
2022-05-07 20:39                       ` Bart Schaefer
2022-05-11  7:32                         ` Marlon Richert

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).