* Dynamic named directories and completion
@ 2018-02-22 22:54 Scott Frazer
2018-02-23 0:29 ` [RFC PATCH] _path_files: teach zsh_directory_name Takeshi Banse
2018-02-23 8:01 ` Dynamic named directories and completion Vincent Bernat
0 siblings, 2 replies; 19+ messages in thread
From: Scott Frazer @ 2018-02-22 22:54 UTC (permalink / raw)
To: zsh-users
I'm trying to use dynamic named directories and have subsequent completion work.
Here is my (perhaps naive) attempt:
zsh_directory_name ()
{
emulate -L zsh
setopt extendedglob
local -a seg;
seg=(${(s:/:)PWD%/*})
if [[ $1 = n ]]; then
typeset -ga reply
reply=( /${(j:/:)seg[1,(I)$2]} )
elif [[ $1 = c ]]; then
local expl
_wanted values expl 'parent dirs' compadd -S\] -a seg
else
return 1
fi
return 0
}
Suppose I am in directory /aaa/bbb/ccc/ddd/eee and want to go up to directory
ccc and then down into another directory. If I do:
cd ~[c<TAB>
it correctly completes to:
cd ~[ccc]
If I hit enter at this point I go to /aaa/bbb/ccc. So far so good. If I
try to start completion, like so:
cd ~[ccc]/<TAB>
zsh doesn't give me options for directories under ccc, it thinks '/' is
the command I'm trying to complete. Is there a way to make this work?
Thanks,
Scott
^ permalink raw reply [flat|nested] 19+ messages in thread
* [RFC PATCH] _path_files: teach zsh_directory_name
2018-02-22 22:54 Dynamic named directories and completion Scott Frazer
@ 2018-02-23 0:29 ` Takeshi Banse
2018-02-23 1:19 ` _path_files: fix copy paste error Takeshi Banse
2018-02-23 1:30 ` _path_files: fix copy paste error (2/2) Takeshi Banse
2018-02-23 8:01 ` Dynamic named directories and completion Vincent Bernat
1 sibling, 2 replies; 19+ messages in thread
From: Takeshi Banse @ 2018-02-23 0:29 UTC (permalink / raw)
To: zsh-users; +Cc: zsh-workers, Takeshi Banse
Signed-off-by: Takeshi Banse <thb@laafc.net>
---
Hi, I want this feature, too. It is necessary to tweak _path_files function
as far as I can tell. So, I wrote a patch.
To zsh-workers:
This `elif` clause could be merged with the following `elif` clause because
it starts with \~, too. But it may break something, so I did prepend the
separate `elif` clause for \~\[*.
Completion/Unix/Type/_path_files | 70 ++++++++++++++++++++++++++++++++++++++++
Test/Y01completion.ztst | 30 +++++++++++++++++
2 files changed, 100 insertions(+)
diff --git a/Completion/Unix/Type/_path_files b/Completion/Unix/Type/_path_files
index 9fa6ae9fc..8fbc21ffa 100644
--- a/Completion/Unix/Type/_path_files
+++ b/Completion/Unix/Type/_path_files
@@ -274,6 +274,76 @@ if [[ "$pre" = [^][*?#^\|\<\>\\]#(\`[^\`]#\`|\$)*/* && "$compstate[quote]" != \'
orig="${orig[1,(in:i:)/][1,-2]}"
donepath=
prepaths=( '' )
+elif [[ "$pre" = \~\[* && "$compstate[quote]" = (|\`) ]]; then
+ (($+functions[zsh_directory_name] || $+zsh_directory_name_functions)) &&
+ () {
+ # It begins with `~[', so the characters from `$pre[3]' to before the
+ # first `]' represent the dynamic directory name. Otherwise, it may fall
+ # through to the following elif/else clauses.
+
+ local name=
+ () {
+ local -i i=3 n=$#pre sq=0 dq=0
+ local c=
+ while ((i<=n)); do
+ c=$pre[i++]
+ case $c in
+ (\')
+ if ((sq)); then
+ ((sq=0))
+ elif ((dq==0)); then
+ ((sq=1))
+ fi
+ ;;
+ (\")
+ if [[ "$name[-1]" != '\' ]]; then
+ if ((dq)); then
+ ((dq=0))
+ elif ((sq==0)); then
+ ((dq=1))
+ fi
+ fi
+ ;;
+ (\;) ;&
+ (])
+ repeat 1; do
+ ((sq || dq)) && break
+ [[ "$name[-1]" == '\' ]] && break
+ [[ "$c" == ';' ]] && return 1
+ return 0
+ done
+ ;;
+ esac
+ name+="$c"
+ done
+ return 1
+ } &&
+ () {
+ local -a reply
+ local -i ret=1
+ if (($+functions[zsh_directory_name])); then
+ zsh_directory_name n "$name"
+ ret=$?
+ fi
+ if ((ret != 0)); then
+ local func=
+ for func in "${zsh_directory_name_functions[@]-}"; do
+ "$func" n "$name"
+ ret=$?
+ ((ret == 0)) && break
+ done
+ fi
+ if ((ret == 0)); then
+ realpath="$reply[1]/"
+ linepath="$pre[1,$#name+2+1]/"
+ fi
+ return ret
+ }
+ } then
+ pre="${pre#${linepath}}"
+ orig="${orig#${linepath}}"
+ donepath=
+ prepaths=( '' )
elif [[ "$pre[1]" = \~ && "$compstate[quote]" = (|\`) ]]; then
# It begins with `~', so remember anything before the first slash to be able
diff --git a/Test/Y01completion.ztst b/Test/Y01completion.ztst
index b1c0e40e5..cbfbb75d7 100644
--- a/Test/Y01completion.ztst
+++ b/Test/Y01completion.ztst
@@ -36,6 +36,36 @@
>line: {: dir1/}{}
>line: {: dir2/}{}
+ comptesteval 'zsh_directory_name () {
+ case "$1" in
+ (d)
+ return 1
+ ;;
+ (n)
+ reply=("$2")
+ ;;
+ (c)
+ local expl
+ _wanted dynamic-dirs expl dynamic compadd -S\] -Q -- ./
+ ;;
+ esac
+ }'
+ comptest $': ~[\t/\t\t\t\t\t\t\t'
+0:tilde with zsh_directory_name
+>line: {: ~[./]}{}
+>line: {: ~[./]/}{}
+>DESCRIPTION:{file}
+>DI:{dir1}
+>DI:{dir2}
+>FI:{file1}
+>FI:{file2}
+>line: {: ~[./]/dir1/}{}
+>line: {: ~[./]/dir2/}{}
+>line: {: ~[./]/file1}{}
+>line: {: ~[./]/file2}{}
+>line: {: ~[./]/dir1/}{}
+>line: {: ~[./]/dir2/}{}
+
comptesteval '_users () { compadd user1 user2 }'
comptest $': ~\t\t\t\t\t'
0:tilde
--
2.16.1
^ permalink raw reply [flat|nested] 19+ messages in thread
* _path_files: fix copy paste error
2018-02-23 0:29 ` [RFC PATCH] _path_files: teach zsh_directory_name Takeshi Banse
@ 2018-02-23 1:19 ` Takeshi Banse
2018-02-23 1:30 ` _path_files: fix copy paste error (2/2) Takeshi Banse
1 sibling, 0 replies; 19+ messages in thread
From: Takeshi Banse @ 2018-02-23 1:19 UTC (permalink / raw)
To: zsh-users; +Cc: zsh-workers, Takeshi Banse
Signed-off-by: Takeshi Banse <thb@laafc.net>
---
I'm very sorry! I fixed the copy paste error in the previous patch.
Completion/Unix/Type/_path_files | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Completion/Unix/Type/_path_files b/Completion/Unix/Type/_path_files
index 8fbc21ffa..6a869defa 100644
--- a/Completion/Unix/Type/_path_files
+++ b/Completion/Unix/Type/_path_files
@@ -274,7 +274,7 @@ if [[ "$pre" = [^][*?#^\|\<\>\\]#(\`[^\`]#\`|\$)*/* && "$compstate[quote]" != \'
orig="${orig[1,(in:i:)/][1,-2]}"
donepath=
prepaths=( '' )
-elif [[ "$pre" = \~\[* && "$compstate[quote]" = (|\`) ]]; then
+elif [[ "$pre" = \~\[* && "$compstate[quote]" = (|\`) ]] &&
(($+functions[zsh_directory_name] || $+zsh_directory_name_functions)) &&
() {
# It begins with `~[', so the characters from `$pre[3]' to before the
--
2.16.1
^ permalink raw reply [flat|nested] 19+ messages in thread
* _path_files: fix copy paste error (2/2)
2018-02-23 0:29 ` [RFC PATCH] _path_files: teach zsh_directory_name Takeshi Banse
2018-02-23 1:19 ` _path_files: fix copy paste error Takeshi Banse
@ 2018-02-23 1:30 ` Takeshi Banse
1 sibling, 0 replies; 19+ messages in thread
From: Takeshi Banse @ 2018-02-23 1:30 UTC (permalink / raw)
To: zsh-users; +Cc: zsh-workers, Takeshi Banse
Signed-off-by: Takeshi Banse <thb@laafc.net>
---
I'm sorry! This fixes the copy paste error eventually.
Completion/Unix/Type/_path_files | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Completion/Unix/Type/_path_files b/Completion/Unix/Type/_path_files
index 6a869defa..9c55df418 100644
--- a/Completion/Unix/Type/_path_files
+++ b/Completion/Unix/Type/_path_files
@@ -339,7 +339,7 @@ elif [[ "$pre" = \~\[* && "$compstate[quote]" = (|\`) ]] &&
fi
return ret
}
- } then
+ }; then
pre="${pre#${linepath}}"
orig="${orig#${linepath}}"
donepath=
--
2.16.1
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: Dynamic named directories and completion
2018-02-22 22:54 Dynamic named directories and completion Scott Frazer
2018-02-23 0:29 ` [RFC PATCH] _path_files: teach zsh_directory_name Takeshi Banse
@ 2018-02-23 8:01 ` Vincent Bernat
2018-02-23 14:41 ` Scott Frazer
2018-02-23 14:42 ` Scott Frazer
1 sibling, 2 replies; 19+ messages in thread
From: Vincent Bernat @ 2018-02-23 8:01 UTC (permalink / raw)
To: Scott Frazer; +Cc: zsh-users
❦ 22 février 2018 17:54 -0500, Scott Frazer <frazer.scott@gmail.com> :
> zsh_directory_name ()
> {
> emulate -L zsh
> setopt extendedglob
> local -a seg;
> seg=(${(s:/:)PWD%/*})
> if [[ $1 = n ]]; then
> typeset -ga reply
> reply=( /${(j:/:)seg[1,(I)$2]} )
> elif [[ $1 = c ]]; then
> local expl
> _wanted values expl 'parent dirs' compadd -S\] -a seg
> else
> return 1
> fi
> return 0
> }
>
> Suppose I am in directory /aaa/bbb/ccc/ddd/eee and want to go up to directory
> ccc and then down into another directory. If I do:
>
> cd ~[c<TAB>
>
> it correctly completes to:
>
> cd ~[ccc]
>
> If I hit enter at this point I go to /aaa/bbb/ccc. So far so good. If I
> try to start completion, like so:
>
> cd ~[ccc]/<TAB>
>
> zsh doesn't give me options for directories under ccc, it thinks '/' is
> the command I'm trying to complete. Is there a way to make this work?
I don't see anything wrong in your code and for me, it works as you
expect (zsh 5.4.2). Does "echo ~[ccc]" returns the right value?
--
This was the most unkindest cut of all.
-- William Shakespeare, "Julius Caesar"
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: Dynamic named directories and completion
2018-02-23 8:01 ` Dynamic named directories and completion Vincent Bernat
@ 2018-02-23 14:41 ` Scott Frazer
2018-02-23 15:02 ` Takeshi Banse
2018-02-23 14:42 ` Scott Frazer
1 sibling, 1 reply; 19+ messages in thread
From: Scott Frazer @ 2018-02-23 14:41 UTC (permalink / raw)
To: zsh-users; +Cc: zsh-users
On 2/23/18 3:01 AM, Vincent Bernat wrote:
> ❦ 22 février 2018 17:54 -0500, Scott Frazer <frazer.scott@gmail.com> :
>
>> zsh_directory_name ()
>> {
>> emulate -L zsh
>> setopt extendedglob
>> local -a seg;
>> seg=(${(s:/:)PWD%/*})
>> if [[ $1 = n ]]; then
>> typeset -ga reply
>> reply=( /${(j:/:)seg[1,(I)$2]} )
>> elif [[ $1 = c ]]; then
>> local expl
>> _wanted values expl 'parent dirs' compadd -S\] -a seg
>> else
>> return 1
>> fi
>> return 0
>> }
>>
>> Suppose I am in directory /aaa/bbb/ccc/ddd/eee and want to go up to directory
>> ccc and then down into another directory. If I do:
>>
>> cd ~[c<TAB>
>>
>> it correctly completes to:
>>
>> cd ~[ccc]
>>
>> If I hit enter at this point I go to /aaa/bbb/ccc. So far so good. If I
>> try to start completion, like so:
>>
>> cd ~[ccc]/<TAB>
>>
>> zsh doesn't give me options for directories under ccc, it thinks '/' is
>> the command I'm trying to complete. Is there a way to make this work?
>
> I don't see anything wrong in your code and for me, it works as you
> expect (zsh 5.4.2). Does "echo ~[ccc]" returns the right value?
>
Yes, "echo ~[ccc]" works correctly. I'm using zsh 5.3 so maybe there is some
difference there. Perhaps there is some difference in options/modules/etc. If
I cut my .zshrc down to a minimum:
autoload -Uz compinit
compinit
zstyle ':completion:*' verbose yes
zstyle ':completion:*' menu select=2
zstyle ':completion:*:messages' format '%d'
zstyle ':completion:*' group-name ''
zstyle ':completion:*' squeeze-slashes true
zstyle ':completion:*:descriptions' format "%UCompleting %d:%u"
zstyle ':completion:*:warnings' format "No matches for: %d"
(with the above zsh_directory_name() too of course), plain ~[whatever] works
but ~[whatever]/ will not complete paths. Do you have anything non-standard
in your completion?
Scott
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: Dynamic named directories and completion
2018-02-23 8:01 ` Dynamic named directories and completion Vincent Bernat
2018-02-23 14:41 ` Scott Frazer
@ 2018-02-23 14:42 ` Scott Frazer
2018-02-24 19:34 ` Peter Stephenson
1 sibling, 1 reply; 19+ messages in thread
From: Scott Frazer @ 2018-02-23 14:42 UTC (permalink / raw)
To: zsh-users
On 2/23/18 3:01 AM, Vincent Bernat wrote:
> ❦ 22 février 2018 17:54 -0500, Scott Frazer <frazer.scott@gmail.com> :
>
>> zsh_directory_name ()
>> {
>> emulate -L zsh
>> setopt extendedglob
>> local -a seg;
>> seg=(${(s:/:)PWD%/*})
>> if [[ $1 = n ]]; then
>> typeset -ga reply
>> reply=( /${(j:/:)seg[1,(I)$2]} )
>> elif [[ $1 = c ]]; then
>> local expl
>> _wanted values expl 'parent dirs' compadd -S\] -a seg
>> else
>> return 1
>> fi
>> return 0
>> }
>>
>> Suppose I am in directory /aaa/bbb/ccc/ddd/eee and want to go up to directory
>> ccc and then down into another directory. If I do:
>>
>> cd ~[c<TAB>
>>
>> it correctly completes to:
>>
>> cd ~[ccc]
>>
>> If I hit enter at this point I go to /aaa/bbb/ccc. So far so good. If I
>> try to start completion, like so:
>>
>> cd ~[ccc]/<TAB>
>>
>> zsh doesn't give me options for directories under ccc, it thinks '/' is
>> the command I'm trying to complete. Is there a way to make this work?
>
> I don't see anything wrong in your code and for me, it works as you
> expect (zsh 5.4.2). Does "echo ~[ccc]" returns the right value?
>
Yes, "echo ~[ccc]" works correctly. I'm using zsh 5.3 so maybe there is some
difference there. Perhaps there is some difference in options/modules/etc. If
I cut my .zshrc down to a minimum:
autoload -Uz compinit
compinit
zstyle ':completion:*' verbose yes
zstyle ':completion:*' menu select=2
zstyle ':completion:*:messages' format '%d'
zstyle ':completion:*' group-name ''
zstyle ':completion:*' squeeze-slashes true
zstyle ':completion:*:descriptions' format "%UCompleting %d:%u"
zstyle ':completion:*:warnings' format "No matches for: %d"
(with the above zsh_directory_name() too of course), plain ~[whatever] works
but ~[whatever]/ will not complete paths. Do you have anything non-standard
in your completion?
Scott
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: Dynamic named directories and completion
2018-02-23 14:41 ` Scott Frazer
@ 2018-02-23 15:02 ` Takeshi Banse
0 siblings, 0 replies; 19+ messages in thread
From: Takeshi Banse @ 2018-02-23 15:02 UTC (permalink / raw)
To: zsh-users
Hi,
* Scott Frazer <frazer.scott@gmail.com> [2018-02-23 23:41]:
> (with the above zsh_directory_name() too of course), plain ~[whatever] works
> but ~[whatever]/ will not complete paths.
I would like to do this feature, too.
It is necessary to tweak `_path_files` function as far as I can tell.
Here are the patch:
http://www.zsh.org/mla/users/2018/msg00119.html
Or,
http://www.zsh.org/mla/workers/2018/msg00198.html
I sent these mails with different subjects, sorry for the inconvenience!
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: Dynamic named directories and completion
2018-02-23 14:42 ` Scott Frazer
@ 2018-02-24 19:34 ` Peter Stephenson
2018-02-24 19:49 ` Mikael Magnusson
2018-02-26 13:53 ` Scott Frazer
0 siblings, 2 replies; 19+ messages in thread
From: Peter Stephenson @ 2018-02-24 19:34 UTC (permalink / raw)
To: zsh-users
On Fri, 23 Feb 2018 09:42:37 -0500
Scott Frazer <frazer.scott@gmail.com> wrote:
> >> cd ~[ccc]/<TAB>
> >>
> >> zsh doesn't give me options for directories under ccc, it thinks '/' is
> >> the command I'm trying to complete. Is there a way to make this work?
> >
> > I don't see anything wrong in your code and for me, it works as you
> > expect (zsh 5.4.2). Does "echo ~[ccc]" returns the right value?
> >
>
> Yes, "echo ~[ccc]" works correctly. I'm using zsh 5.3 so maybe there is some
> difference there. Perhaps there is some difference in options/modules/etc. If
> I cut my .zshrc down to a minimum:
There's something screwy here, certainly. I don't think it should be
necessary to modify _path_files in 5.3, though, there are certainly
cases where you get the right answer, and I think the logic that currently
handles ~ at the start should do the right thing here.
I've a theory it's down to the completion widget in use, i.e. how
completion gets started up. If instead of hitting tab, you type <Esc>x
complete-word<Enter> --- or instead bind that widget,
bindkey '^i' complete-word
and then use tab --- does it start working? The default is
expand-or-complete, and I believe the expand bit is nixing the
completion in this case. (Except we don't really have the word "nix"
this side of the Atlantic, so I may be talking nonsense, but it sounded
good.)
pws
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: Dynamic named directories and completion
2018-02-24 19:34 ` Peter Stephenson
@ 2018-02-24 19:49 ` Mikael Magnusson
2018-02-24 20:12 ` Peter Stephenson
2018-02-26 13:53 ` Scott Frazer
1 sibling, 1 reply; 19+ messages in thread
From: Mikael Magnusson @ 2018-02-24 19:49 UTC (permalink / raw)
To: Peter Stephenson; +Cc: Zsh Users
On Sat, Feb 24, 2018 at 8:34 PM, Peter Stephenson
<p.w.stephenson@ntlworld.com> wrote:
> On Fri, 23 Feb 2018 09:42:37 -0500
> Scott Frazer <frazer.scott@gmail.com> wrote:
>> >> cd ~[ccc]/<TAB>
>> >>
>> >> zsh doesn't give me options for directories under ccc, it thinks '/' is
>> >> the command I'm trying to complete. Is there a way to make this work?
>> >
>> > I don't see anything wrong in your code and for me, it works as you
>> > expect (zsh 5.4.2). Does "echo ~[ccc]" returns the right value?
>> >
>>
>> Yes, "echo ~[ccc]" works correctly. I'm using zsh 5.3 so maybe there is some
>> difference there. Perhaps there is some difference in options/modules/etc. If
>> I cut my .zshrc down to a minimum:
>
> There's something screwy here, certainly. I don't think it should be
> necessary to modify _path_files in 5.3, though, there are certainly
> cases where you get the right answer, and I think the logic that currently
> handles ~ at the start should do the right thing here.
>
> I've a theory it's down to the completion widget in use, i.e. how
> completion gets started up. If instead of hitting tab, you type <Esc>x
> complete-word<Enter> --- or instead bind that widget,
>
> bindkey '^i' complete-word
>
> and then use tab --- does it start working? The default is
> expand-or-complete, and I believe the expand bit is nixing the
> completion in this case. (Except we don't really have the word "nix"
> this side of the Atlantic, so I may be talking nonsense, but it sounded
> good.)
I have some patches I was working on related to this, but I assume
there was still some problem, or I would have committed them...
There's two patches in this thread,
http://www.zsh.org/mla/workers/2015/msg01439.html and then I think I
never sent the third one,
diff --git a/Completion/Unix/Type/_files b/Completion/Unix/Type/_files
index 2b0c5580a5..067f68d9d9 100644
--- a/Completion/Unix/Type/_files
+++ b/Completion/Unix/Type/_files
@@ -103,7 +103,7 @@ for def in "$pats[@]"; do
if [[ -n "$end" ]]; then
if _path_files -g "$pat" "$opts[@]" "$expl[@]"; then
ret=0
- elif [[ $PREFIX$SUFFIX != */* ]] && zstyle -a
":completion:${curcontext}:$tag" recursive-files rfiles; then
+ elif [[ ${${:-$PREFIX$SUFFIX}#\~\[[^]]#]} != */* ]] && zstyle
-a ":completion:${curcontext}:$tag" recursive-files rfiles; then
local subtree
for rfile in $rfiles; do
if [[ $PWD/ = ${~rfile} ]]; then
--
Mikael Magnusson
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: Dynamic named directories and completion
2018-02-24 19:49 ` Mikael Magnusson
@ 2018-02-24 20:12 ` Peter Stephenson
2018-02-26 14:31 ` Scott Frazer
0 siblings, 1 reply; 19+ messages in thread
From: Peter Stephenson @ 2018-02-24 20:12 UTC (permalink / raw)
To: Zsh Users
On Sat, 24 Feb 2018 20:49:14 +0100
Mikael Magnusson <mikachu@gmail.com> wrote:
> I have some patches I was working on related to this, but I assume
> there was still some problem, or I would have committed them...
> There's two patches in this thread,
> http://www.zsh.org/mla/workers/2015/msg01439.html and then I think I
> never sent the third one,
This is all quite complicated so I can well believe it's useful; I don't
think it fixes the behaviour I was seeing (but I may be getting
confused).
On the same theme, I think the following is useful for those of us
using the _expand completer, which may well have nothing whatsoever to
do with the original problem.
pws
diff --git a/Completion/Base/Completer/_expand b/Completion/Base/Completer/_expand
index a6e30e8..ee3681b 100644
--- a/Completion/Base/Completer/_expand
+++ b/Completion/Base/Completer/_expand
@@ -43,7 +43,8 @@ zstyle -s ":completion:${curcontext}:" accept-exact tmp ||
if [[ "$tmp" != (yes|true|on|1) ]]; then
{ [[ "$word" = \~(|[-+]) ||
- ( "$word" = \~[-+][1-9]## && $word[3,-1] -le $#dirstack ) ]] && return 1 }
+ ( "$word" = \~[-+][1-9]## && $word[3,-1] -le $#dirstack ) ||
+ $word = \~\[*\]/* ]] && return 1 }
{ [[ ( "$word" = \~* && ${#userdirs[(I)${word[2,-1]}*]}+${#nameddirs[(I)${word[2,-1]}*]} -gt 1 ) ||
( "$word" = *\$[a-zA-Z0-9_]## &&
${#parameters[(I)${word##*\$}*]} -ne 1 ) ]] && continue=1 }
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: Dynamic named directories and completion
2018-02-24 19:34 ` Peter Stephenson
2018-02-24 19:49 ` Mikael Magnusson
@ 2018-02-26 13:53 ` Scott Frazer
2018-02-26 14:47 ` Peter Stephenson
1 sibling, 1 reply; 19+ messages in thread
From: Scott Frazer @ 2018-02-26 13:53 UTC (permalink / raw)
To: zsh-users
On 2/24/18 2:34 PM, Peter Stephenson wrote:
> On Fri, 23 Feb 2018 09:42:37 -0500
> Scott Frazer <frazer.scott@gmail.com> wrote:
>>>> cd ~[ccc]/<TAB>
>>>>
>>>> zsh doesn't give me options for directories under ccc, it thinks '/' is
>>>> the command I'm trying to complete. Is there a way to make this work?
>>>
>>> I don't see anything wrong in your code and for me, it works as you
>>> expect (zsh 5.4.2). Does "echo ~[ccc]" returns the right value?
>>>
>>
>> Yes, "echo ~[ccc]" works correctly. I'm using zsh 5.3 so maybe there is some
>> difference there. Perhaps there is some difference in options/modules/etc. If
>> I cut my .zshrc down to a minimum:
>
> There's something screwy here, certainly. I don't think it should be
> necessary to modify _path_files in 5.3, though, there are certainly
> cases where you get the right answer, and I think the logic that currently
> handles ~ at the start should do the right thing here.
>
> I've a theory it's down to the completion widget in use, i.e. how
> completion gets started up. If instead of hitting tab, you type <Esc>x
> complete-word<Enter> --- or instead bind that widget,
>
> bindkey '^i' complete-word
>
> and then use tab --- does it start working? The default is
> expand-or-complete, and I believe the expand bit is nixing the
> completion in this case. (Except we don't really have the word "nix"
> this side of the Atlantic, so I may be talking nonsense, but it sounded
> good.)
>
> pws
>
Yes, M-x complete-word does indeed work! I still need to try some of the
patches from later in this thread ...
Scott
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: Dynamic named directories and completion
2018-02-24 20:12 ` Peter Stephenson
@ 2018-02-26 14:31 ` Scott Frazer
0 siblings, 0 replies; 19+ messages in thread
From: Scott Frazer @ 2018-02-26 14:31 UTC (permalink / raw)
To: zsh-users
On 2/24/18 3:12 PM, Peter Stephenson wrote:
> On Sat, 24 Feb 2018 20:49:14 +0100
> Mikael Magnusson <mikachu@gmail.com> wrote:
>> I have some patches I was working on related to this, but I assume
>> there was still some problem, or I would have committed them...
>> There's two patches in this thread,
>> http://www.zsh.org/mla/workers/2015/msg01439.html and then I think I
>> never sent the third one,
>
> This is all quite complicated so I can well believe it's useful; I don't
> think it fixes the behaviour I was seeing (but I may be getting
> confused).
>
> On the same theme, I think the following is useful for those of us
> using the _expand completer, which may well have nothing whatsoever to
> do with the original problem.
>
> pws
>
> diff --git a/Completion/Base/Completer/_expand b/Completion/Base/Completer/_expand
> index a6e30e8..ee3681b 100644
> --- a/Completion/Base/Completer/_expand
> +++ b/Completion/Base/Completer/_expand
> @@ -43,7 +43,8 @@ zstyle -s ":completion:${curcontext}:" accept-exact tmp ||
>
> if [[ "$tmp" != (yes|true|on|1) ]]; then
> { [[ "$word" = \~(|[-+]) ||
> - ( "$word" = \~[-+][1-9]## && $word[3,-1] -le $#dirstack ) ]] && return 1 }
> + ( "$word" = \~[-+][1-9]## && $word[3,-1] -le $#dirstack ) ||
> + $word = \~\[*\]/* ]] && return 1 }
> { [[ ( "$word" = \~* && ${#userdirs[(I)${word[2,-1]}*]}+${#nameddirs[(I)${word[2,-1]}*]} -gt 1 ) ||
> ( "$word" = *\$[a-zA-Z0-9_]## &&
> ${#parameters[(I)${word##*\$}*]} -ne 1 ) ]] && continue=1 }
>
Just this patch does not fix the completion issue (I even upgraded to 5.4.2
just to be sure). Since M-x complete-word does work, I may try looking at
expand-or-complete to see if I can figure out what is happening. I'm no
zsh expert though, so I will likely need help not breaking something else.
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: Dynamic named directories and completion
2018-02-26 13:53 ` Scott Frazer
@ 2018-02-26 14:47 ` Peter Stephenson
2018-02-26 16:44 ` Scott Frazer
2018-02-26 17:49 ` Mikael Magnusson
0 siblings, 2 replies; 19+ messages in thread
From: Peter Stephenson @ 2018-02-26 14:47 UTC (permalink / raw)
To: zsh-users
On Mon, 26 Feb 2018 08:53:00 -0500
Scott Frazer <frazer.scott@gmail.com> wrote:
> Yes, M-x complete-word does indeed work! I still need to try some of the
> patches from later in this thread ...
Glad it's not totally shrouded in obscurity...
Would generally recommend the combination of complete-word as binding
for tab + use of the expand completer (which I fixed somewhere else in
this thread but am still to commit) as this is much more configurable.
To turn it on you'd do something like
zstyle ':completion:*' completer _expand _complete _ignored
bindkey '^i' complete-word
but there are many more exotic possibilities.
I'll have a look at expand-or-complete word, too.
(Ideally, in fact, whether or not we expand ~[whatever] needs
configuring --- because this is dynamic completion you might decide to
expand it to freeze the path for future use. I'll look at that if I get
the chance. This is the sort of reason for using the expand completer
I'm talking about.)
pws
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: Dynamic named directories and completion
2018-02-26 14:47 ` Peter Stephenson
@ 2018-02-26 16:44 ` Scott Frazer
2018-02-26 20:08 ` Peter Stephenson
2018-02-26 17:49 ` Mikael Magnusson
1 sibling, 1 reply; 19+ messages in thread
From: Scott Frazer @ 2018-02-26 16:44 UTC (permalink / raw)
To: zsh-users
On 2/26/18 9:47 AM, Peter Stephenson wrote:
> On Mon, 26 Feb 2018 08:53:00 -0500
> Scott Frazer <frazer.scott@gmail.com> wrote:
>> Yes, M-x complete-word does indeed work! I still need to try some of the
>> patches from later in this thread ...
>
> Glad it's not totally shrouded in obscurity...
>
> Would generally recommend the combination of complete-word as binding
> for tab + use of the expand completer (which I fixed somewhere else in
> this thread but am still to commit) as this is much more configurable.
>
> To turn it on you'd do something like
>
> zstyle ':completion:*' completer _expand _complete _ignored
> bindkey '^i' complete-word
>
> but there are many more exotic possibilities.
>
> I'll have a look at expand-or-complete word, too.
>
> (Ideally, in fact, whether or not we expand ~[whatever] needs
> configuring --- because this is dynamic completion you might decide to
> expand it to freeze the path for future use. I'll look at that if I get
> the chance. This is the sort of reason for using the expand completer
> I'm talking about.)
>
> pws
>
This plus the small patch you sent earlier for _expand works, thanks!
I feel like expand-or-complete should work too, but as long as the
_expand patch makes it into the final code I'm happy.
Thanks again,
Scott
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: Dynamic named directories and completion
2018-02-26 14:47 ` Peter Stephenson
2018-02-26 16:44 ` Scott Frazer
@ 2018-02-26 17:49 ` Mikael Magnusson
2018-02-26 17:55 ` Peter Stephenson
1 sibling, 1 reply; 19+ messages in thread
From: Mikael Magnusson @ 2018-02-26 17:49 UTC (permalink / raw)
To: Peter Stephenson; +Cc: Zsh Users
On Mon, Feb 26, 2018 at 3:47 PM, Peter Stephenson
<p.stephenson@samsung.com> wrote:
> On Mon, 26 Feb 2018 08:53:00 -0500
> Scott Frazer <frazer.scott@gmail.com> wrote:
>> Yes, M-x complete-word does indeed work! I still need to try some of the
>> patches from later in this thread ...
>
> Glad it's not totally shrouded in obscurity...
>
> Would generally recommend the combination of complete-word as binding
> for tab + use of the expand completer (which I fixed somewhere else in
> this thread but am still to commit) as this is much more configurable.
>
> To turn it on you'd do something like
>
> zstyle ':completion:*' completer _expand _complete _ignored
> bindkey '^i' complete-word
>
> but there are many more exotic possibilities.
>
> I'll have a look at expand-or-complete word, too.
>
> (Ideally, in fact, whether or not we expand ~[whatever] needs
> configuring --- because this is dynamic completion you might decide to
> expand it to freeze the path for future use. I'll look at that if I get
> the chance. This is the sort of reason for using the expand completer
> I'm talking about.)
In this type of situation I usually explicitly press expand-word (^X*
by default I believe).
--
Mikael Magnusson
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: Dynamic named directories and completion
2018-02-26 17:49 ` Mikael Magnusson
@ 2018-02-26 17:55 ` Peter Stephenson
0 siblings, 0 replies; 19+ messages in thread
From: Peter Stephenson @ 2018-02-26 17:55 UTC (permalink / raw)
To: Zsh Users
On Mon, 26 Feb 2018 18:49:01 +0100
Mikael Magnusson <mikachu@gmail.com> wrote:
> > (Ideally, in fact, whether or not we expand ~[whatever] needs
> > configuring --- because this is dynamic completion you might decide to
> > expand it to freeze the path for future use. I'll look at that if I get
> > the chance. This is the sort of reason for using the expand completer
> > I'm talking about.)
>
> In this type of situation I usually explicitly press expand-word (^X*
> by default I believe).
Yep, ideally as far as the internal and therefore non-configurable
widgets are concerned, I think we want expand-word to expand this and
expand-or-complete not to. That's what happens with normal ~, so this
should be doable.
pws
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: Dynamic named directories and completion
2018-02-26 16:44 ` Scott Frazer
@ 2018-02-26 20:08 ` Peter Stephenson
2018-02-26 21:22 ` Peter Stephenson
0 siblings, 1 reply; 19+ messages in thread
From: Peter Stephenson @ 2018-02-26 20:08 UTC (permalink / raw)
To: zsh-users
On Mon, 26 Feb 2018 11:44:14 -0500
Scott Frazer <frazer.scott@gmail.com> wrote:
> This plus the small patch you sent earlier for _expand works, thanks!
I've pushed that as is. Whether or not tilde forms are expanded are
already configurable --- setting the accept-exact style in the
completer's context would control this.
(Off topic, but I'm not 100% convinced that the REC_EXACT shell option
should have that effect in this completer, as it currently does, since
it's a rather gross and uncontrllable setting that wasn't really
intended for expansion. But I think all its uses are usurped by the
accept-exact style in the completion system anyway, so probably no big
deal.)
> I feel like expand-or-complete should work too, but as long as the
> _expand patch makes it into the final code I'm happy.
Yes, me too, particularly now Mikael has pointed out ^X*: I'll look
at this separately.
pws
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: Dynamic named directories and completion
2018-02-26 20:08 ` Peter Stephenson
@ 2018-02-26 21:22 ` Peter Stephenson
0 siblings, 0 replies; 19+ messages in thread
From: Peter Stephenson @ 2018-02-26 21:22 UTC (permalink / raw)
To: zsh-users
On Mon, 26 Feb 2018 20:08:21 +0000
Peter Stephenson <p.w.stephenson@ntlworld.com> wrote:
> > I feel like expand-or-complete should work too, but as long as the
> > _expand patch makes it into the final code I'm happy.
>
> Yes, me too, particularly now Mikael has pointed out ^X*: I'll look
> at this separately.
I think this works.
What was happening was as a last search for something to expand the code
looked wildcards, and the square brackets triggered that.
pws
diff --git a/Src/Zle/zle_tricky.c b/Src/Zle/zle_tricky.c
index caeef76..22c3812 100644
--- a/Src/Zle/zle_tricky.c
+++ b/Src/Zle/zle_tricky.c
@@ -456,6 +456,7 @@ checkparams(char *p)
static int
cmphaswilds(char *str)
{
+ char *ptr;
if ((*str == Inbrack || *str == Outbrack) && !str[1])
return 0;
@@ -465,6 +466,14 @@ cmphaswilds(char *str)
if (str[0] == '%' && str[1] ==Quest)
str += 2;
+ /*
+ * In ~[foo], the square brackets are not wild cards.
+ * This test matches the master one in filesubstr().
+ */
+ if (*str == Tilde && str[1] == Inbrack &&
+ (ptr = strchr(str+2, Outbrack)))
+ str = ptr + 1;
+
for (; *str;) {
if (*str == String || *str == Qstring) {
/* A parameter expression. */
^ permalink raw reply [flat|nested] 19+ messages in thread
end of thread, other threads:[~2018-02-26 21:23 UTC | newest]
Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-02-22 22:54 Dynamic named directories and completion Scott Frazer
2018-02-23 0:29 ` [RFC PATCH] _path_files: teach zsh_directory_name Takeshi Banse
2018-02-23 1:19 ` _path_files: fix copy paste error Takeshi Banse
2018-02-23 1:30 ` _path_files: fix copy paste error (2/2) Takeshi Banse
2018-02-23 8:01 ` Dynamic named directories and completion Vincent Bernat
2018-02-23 14:41 ` Scott Frazer
2018-02-23 15:02 ` Takeshi Banse
2018-02-23 14:42 ` Scott Frazer
2018-02-24 19:34 ` Peter Stephenson
2018-02-24 19:49 ` Mikael Magnusson
2018-02-24 20:12 ` Peter Stephenson
2018-02-26 14:31 ` Scott Frazer
2018-02-26 13:53 ` Scott Frazer
2018-02-26 14:47 ` Peter Stephenson
2018-02-26 16:44 ` Scott Frazer
2018-02-26 20:08 ` Peter Stephenson
2018-02-26 21:22 ` Peter Stephenson
2018-02-26 17:49 ` Mikael Magnusson
2018-02-26 17:55 ` Peter Stephenson
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).