1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2024-06-02 21:36:05 +02:00

45531: _sh: Complete options more accurately

Committing without handling of +x option variants (line 10) pending resolution
of workers/45422
This commit is contained in:
dana 2020-03-13 09:37:37 -05:00
parent 778f391a3b
commit 3f7b81e24e
2 changed files with 37 additions and 12 deletions

View File

@ -1,5 +1,8 @@
2020-03-13 dana <dana@dana.is> 2020-03-13 dana <dana@dana.is>
* 45531: Completion/Unix/Command/_sh: Complete options more
accurately
* 45537 (tweaked per 45550, needs 45536): Test/E02xtrace.ztst: * 45537 (tweaked per 45550, needs 45536): Test/E02xtrace.ztst:
Fix inconsistent function-name encoding in preserves-xtrace test Fix inconsistent function-name encoding in preserves-xtrace test

View File

@ -1,14 +1,36 @@
#compdef sh ash csh dash ksh ksh88 ksh93 mksh oksh pdksh rc tcsh yash #compdef sh ash csh dash ksh ksh88 ksh93 mksh oksh pdksh rc tcsh yash
if (( CURRENT == ${words[(i)-c]} + 1 )); then local bourne argv0
_cmdstring local -a args all_opts=( -{{0..9},{A..Z},{a..z}} )
else
local n=${words[(b:2:i)[^-]*]} [[ $service == (csh|?csh|fish|rc) ]] || bourne=1
if (( n <= CURRENT )); then
compset -n $n # Bourne-style shells support +x variants
_alternative \ # @todo Uncomment when workers/45422 is fixed
'files:file:_files' \ # (( bourne )) && all_opts+=( ${all_opts/#-/+} )
'commands:command:_normal' && return 0 # Bourne-style shells take argv[0] as the second argument to -c
fi (( bourne )) && argv0=':argv[0]:'
_default
fi # All of the recognised shells support at least these arguments
args=(
"(1 -)-c[execute specified command string]: :_cmdstring$argv0"
'-e[exit immediately on non-zero return]'
'-i[act as interactive shell]'
'-l[act as login shell]'
'-x[print command trace]'
'1:script file:_files'
'*:: :_files'
)
# Bourne-style shells support -o/+o option. Not all of them support -ooption in
# the same argument, but we'll allow it here for those that do
(( bourne )) && args+=(
'-o+[set specified option]:option:'
'+o+[unset specified option]:option:'
)
# Since this is a generic function we don't know what other options these shells
# support, but we don't want them to break the ones listed above, so we'll just
# ignore any other single-alphanumeric option. Obviously this doesn't account
# for long options
args+=( '!'${^${all_opts:#(${(~j<|>)${(@M)${(@M)args#(*[\*\)]|)[+-]?}%[+-]?}})}} )
_arguments -s -S -A '-*' : $args