1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-10-13 11:21:13 +02:00

30466: Add prompt format and printf format completion.

This commit is contained in:
Mikael Magnusson 2012-05-14 15:32:26 +00:00
parent 2a7c994ed4
commit c435a8cc61
4 changed files with 197 additions and 29 deletions

View file

@ -2,6 +2,12 @@
* 30468: Functions/Prompts/prompt_fade_setup: add missing $.
* 30466: Completion/Unix/Type/.distfiles,
Completion/Unix/Type/_ps1234, Completion/Zsh/Command/_print:
Add new completer for prompt format specifiers and hook it up
to print -P and assigning to the various prompt parameters.
Add completion for printf and print -f formats.
2012-05-08 Barton E. Schaefer <schaefer@zsh.org>
* unposted, see users/17062: Doc/Zsh/contrib.yo: Briefly describe
@ -16294,5 +16300,5 @@
*****************************************************
* This is used by the shell to define $ZSH_PATCHLEVEL
* $Revision: 1.5651 $
* $Revision: 1.5652 $
*****************************************************

View file

@ -36,6 +36,7 @@ _pids
_ports
_printers
_ps
_ps1234
_pspdf
_services
_signals

View file

@ -0,0 +1,109 @@
#compdef -value-,PROMPT,-default- -value-,PROMPT2,-default- -value-,PROMPT3,-default- -value-,PROMPT4,-default- -value-,RPROMPT,-default- -value-,RPROMPT2,-default- -value-,PS1,-default- -value-,PS2,-default- -value-,PS3,-default- -value-,PS4,-default- -value-,RPS1,-default- -value-,RPS2,-default- -value-,SPROMPT,-default-
local -a specs
local expl paren
if [[ -n $compstate[quote] ]]; then
paren='('
else
paren='\('
fi
if [[ $PREFIX == *%(-|)<-># ]]; then
specs=(
'm:hostname up to first .'
'_:status of parser'
'd:current working directory'
'/:current working directory'
'~:current working directory, with ~ replacement'
'N:name of current script or shell function'
'x:name of file containing code being executed'
'c:deprecated'
'.:deprecated'
'C:deprecated'
'F:start using fg color'
'K:start using bg color'
'G:counts as extra character inside %{...%}'
)
if [[ $PREFIX == *% ]]; then
if [[ $service == -value-,SPROMPT,* ]]; then
specs+=(
'r:suggested correction'
'R:corrected string'
)
fi
specs+=(
'%:A %'
'):A )'
'l:current line (tty) with /dev/tty stripped'
'M:full hostname'
'n:username'
'y:current line (tty)'
'#:a # when root, % otherwise'
'?:return status of last command'
'h:current history event number'
'!:current history event number'
'i:current line number'
'I:current source line number'
'j:number of jobs'
'L:$SHLVL'
'D:date in yy-mm-dd format'
'T:current time of day, 24-hour format'
't:current time of day, 12-hour am/pm format'
'@:current time of day, 12-hour am/pm format'
'*:current time of day, 24-hour format with seconds'
'w:the date in day-dd format'
'W:the date in mm/dd/yy format'
'D{}:format string like strftime'
'B:start bold'
'b:stop bold'
'E:clear to end of line'
'U:start underline'
'u:stop underline'
'S:start standout'
's:stop standout'
'f:reset fg color'
'k:reset bg color'
'{:start literal escape sequence'
'}:stop literal escape sequence'
'v:value from $psvar array'
'(:ternary expression %(x.true-string.false-string)'
'<<:truncation from left %len<string<'
'>>:truncation from right %len>string>'
'[]:truncation from who knows where'
)
fi
compset -P "*"
_describe -t prompt-format-specifier 'prompt format specifier' specs -S ''
_message -e prompt-format-specifier number
elif [[ $PREFIX == *%$paren(-|)<-># ]]; then
specs=(
'!:running with privileges'
'#:effective uid'
'?:exit status'
'_:at least n shell constructs started'
'C:at least n path elements'
'/:at least n path elements'
'.:at least n path elements'
'c:at least n path elements'
'~:at least n path elements'
'D:month'
'd:day of month'
'g:effective gid'
'j:number of jobs'
'L:SHLVL'
'l:number of characters already printed'
'S:SECONDS parameter at least n'
'T:current hour'
't:current minute'
'v:psvar has at least n elements'
'V:element n of psvar is set and non-empty'
'w:day of week (Sunday = 0)'
)
compset -P "*"
_describe -t ternary-prompt-expression 'ternary prompt format test character' specs -S ''
_message -e ternary-prompt-expression number
else
_describe -t prompt-format-specifier 'prompt format specifier' '(%)' -S ''
_default "$@"
fi

View file

@ -1,32 +1,84 @@
#compdef print
#compdef print printf
local state expl line eflag pflag
local state expl line eflag pflag rest ret=1
# -e flag available only after -R
eflag="${words[1,CURRENT-1][(r)-*R*]:+-e[enable escapes]}"
if [[ $service = print ]]; then
# -e flag available only after -R
eflag="${words[1,CURRENT-1][(r)-*R*]:+-e[enable escapes]}"
# -p flag only relevant if we have a coprocess
(:>&p) 2>/dev/null &&
pflag='(-s -u -z)-p[print arguments to input of coprocess]'
# -p flag only relevant if we have a coprocess
(:>&p) 2>/dev/null &&
pflag='(-s -u -z)-p[print arguments to input of coprocess]'
_arguments -C -s -A "-*" -S \
'(-f)-r[ignore escape conventions of echo]' \
'(-r -b -f -m -s -l -N -o -O -i -c -u -p -z -D -P)-R[emulate BSD echo (no escapes, -n & -e flags only)]' \
'-b[recognise bindkey escape sequences]' \
'-m[remove arguments matching specified pattern]' \
'(-r -n -R -l -N -c)-f+[print arguments as for the printf builtin]:format' \
'(-u -p -z)-s[place results in the history list]' \
'(-c -f)-n[do not add a newline to the result]' \
'(-N -c -f)-l[print arguments separated by newlines]' \
'(-n -l -c -f)-N[print arguments separated and terminated by nulls]' \
'(-O)-o[sort arguments in ascending order]' \
'(-o)-O[sort arguments in descending order]' \
'-i[case-insensitive sorting]' \
'(-n -l -N -f -s -z)-a[with -c/-C, print arguments across before down]' \
'(-n -l -N -f -C -s -z)-c[print arguments in columns]' \
'(-n -l -N -f -c -s -z)-C+[print arguments in specified number of columns]:columns' \
'(-s -p -z)-u+[specify file descriptor to print arguments to]:file descriptor:_file_descriptors' \
'(-s -p -u)-z[push arguments onto editing buffer stack]' \
'-D[substitute any arguments which are named directories using ~ notation]' \
'-P[perform prompt expansion]' \
$pflag $eflag '*:default:_default'
if [[ -n ${words[1,CURRENT][(r)-*P*]} ]]; then
rest='*: :_ps1234'
else
rest='*: :_default'
fi
_arguments -C -s -A "-*" -S \
'(-f)-r[ignore escape conventions of echo]' \
'(-r -b -f -m -s -l -N -o -O -i -c -u -p -z -D -P)-R[emulate BSD echo (no escapes, -n & -e flags only)]' \
'-b[recognise bindkey escape sequences]' \
'-m[remove arguments matching specified pattern]' \
'(-r -n -R -l -N -c)-f+[print arguments as for the printf builtin]:format:->printfformat' \
'(-u -p -z)-s[place results in the history list]' \
'(-c -f)-n[do not add a newline to the result]' \
'(-N -c -f)-l[print arguments separated by newlines]' \
'(-n -l -c -f)-N[print arguments separated and terminated by nulls]' \
'(-O)-o[sort arguments in ascending order]' \
'(-o)-O[sort arguments in descending order]' \
'-i[case-insensitive sorting]' \
'(-n -l -N -f -s -z)-a[with -c/-C, print arguments across before down]' \
'(-n -l -N -f -C -s -z)-c[print arguments in columns]' \
'(-n -l -N -f -c -s -z)-C+[print arguments in specified number of columns]:columns' \
'(-s -p -z)-u+[specify file descriptor to print arguments to]:file descriptor:_file_descriptors' \
'(-s -p -u)-z[push arguments onto editing buffer stack]' \
'-D[substitute any arguments which are named directories using ~ notation]' \
'-P[perform prompt expansion]' \
$pflag $eflag $rest && ret=0
elif [[ $service = printf ]]; then
state=printf
fi
if [[ $state = printf ]]; then
_arguments -C -s -S \
'1:format:->printfformat' \
'*: :_default' && ret=0
fi
if [[ $state = printfformat ]]; then
if [[ ${(Q)PREFIX} = *%((-|)<->|[-#0 +*.])# ]]; then
local -a specs
specs=(
'#:alternate form'
'0:zeropad to length n'
'-:left adjust result'
' :leave one space in front of positive number from signed conversion'
'+:always place sign before a number from signed conversion'
'*:field width in next argument'
'.:precision'
'c:print the first character of the argument'
's:print the argument as a string'
{d,i}':signed decimal number or with leading " numeric value of following character'
'o:unsigned octal number'
'u:unsigned decimal number'
{x,X}':unsigned hexadecimal number, letters capitalized as x'
{e,E}':double number in scientific notation'
'f:double number'
{g,G}':double number as %f or %e depending on size'
'%:a percent sign'
'n:store number of printed bytes in parameter specified by argument'
'b:as %s but interpret escape sequences in argument'
'q:as %s but shell quote result'
)
compset -P "*"
_describe -t print-format-specifier 'print format specifier' specs -S ''
_message -e print-format-specifier 'number'
else
_describe -t print-format-specifier 'print format specifier' '(%)' -S ''
fi
ret=0
fi
return ret