1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2024-05-05 23:26:38 +02:00

51758: Make dynamic dir completion easier to implement

This commit is contained in:
Marlon Richert 2023-05-18 23:44:54 +03:00 committed by Oliver Kiddle
parent a95198e268
commit bb441f77a7
4 changed files with 56 additions and 35 deletions

View File

@ -1,3 +1,9 @@
2023-05-21 Oliver Kiddle <opk@zsh.org>
* Marlon Richert: 51758: Test/Y01completion.ztst, Doc/Zsh/expn.yo,
Completion/Zsh/Context/_dynamic_directory_name: Make dynamic dir
completion easier to implement
2023-05-13 Peter Stephenson <p.w.stephenson@ntlworld.com>
* 51722: Src/Modules/parameter.c: Add safety to extracting

View File

@ -1,15 +1,29 @@
#autoload
local -a dirfuncs=(
${(k)functions[zsh_directory_name]}
$zsh_directory_name_functions
)
local descr='dynamically named directory'
local func
integer ret=1
if (( $#dirfuncs )); then
local -a expl
local -i ret
local func suf tag=dynamically-named-directories
if [[ -n $functions[zsh_directory_name] || \
${+zsh_directory_name_functions} -ne 0 ]] ; then
[[ -n $functions[zsh_directory_name] ]] && zsh_directory_name c && ret=0
for func in $zsh_directory_name_functions; do
$func c && ret=0
[[ $ISUFFIX != \]* ]] &&
suf=-S]
_tags "$tag"
while _tags; do
while _next_label "$tag" expl "$descr" $suf; do
for func in $dirfuncs; do
$func c && ret=0
done
done
(( ret )) || break
done
return ret
else
_message 'dynamic directory name: implemented as zsh_directory_name c'
_message "${descr}: implement as zsh_directory_name c"
fi

View File

@ -2066,34 +2066,24 @@ tt(/home/pws/perforce). In this simple case a static name for the
directory would be just as effective.
example(zsh_directory_name+LPAR()RPAR() {
emulate -L zsh
setopt extendedglob
emulate -L zsh -o extendedglob
local -a match mbegin mend
if [[ $1 = d ]]; then
# turn the directory into a name
if [[ $2 = (#b)(/home/pws/perforce/)([^/]##)* ]]; then
typeset -ga reply
reply=(p:$match[2] $(( ${#match[1]} + ${#match[2]} )) )
else
return 1
fi
elif [[ $1 = n ]]; then
# turn the name into a directory
[[ $2 != (#b)p:(?*) ]] && return 1
typeset -ga reply
reply=(/home/pws/perforce/$match[1])
elif [[ $1 = c ]]; then
# complete names
local expl
local -a dirs
dirs=(/home/pws/perforce/*(/:t))
dirs=(p:${^dirs})
_wanted dynamic-dirs expl 'dynamic directory' compadd -S\] -a dirs
return
else
return 1
fi
return 0
local base=/home/pws/perforce
case $1 in
( d ) # Turn the directory into a name.
[[ $2 == (#b)($base/)([^/]##)* ]] &&
reply=( p:$match[2] $(( $#match[1] + $#match[2] )) )
;;
( n ) # Turn the name into a directory.
[[ $2 == (#b)p:(?*) ]] &&
reply=( $base/$match[1] )
;;
( c ) # Complete names.
local -a dirs=( $base/*(/:t) )
# Completion system populates $expl with flags for compadd.
compadd "$expl[@]" p:$^dirs
;;
esac
})
texinode(Static named directories)(`=' expansion)(Dynamic named directories)(Filename Expansion)

View File

@ -75,6 +75,17 @@
>line: {: ~user2}{}
>line: {: ~user1}{}
comptesteval 'zsh_directory_name() { compadd "$expl[@]" -- name1 name2 }'
comptest $': ~[\t\t\t\t'
0:dynamic directory names after ~[
>line: {: ~[name}{}
>line: {: ~[name}{}
>DESCRIPTION:{dynamically named directory}
>NO:{name1}
>NO:{name2}
>line: {: ~[name1]}{}
>line: {: ~[name2]}{}
comptest $'echo ;:\C-b\C-b\t'
0:directories and files before separator
>line: {echo }{;:}