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

42175 + 42177 + 42178: avoid localized output from external commands

_call_program and '_arguments --' will call _comp_locale before
calling external command for easier analysis of the output.
This is disabled by passing an option '-l'.
This commit is contained in:
Jun-ichi Takimoto 2017-12-28 11:35:34 +09:00
parent 24152f766f
commit d303dfa7f5
8 changed files with 62 additions and 19 deletions

View file

@ -1,3 +1,13 @@
2017-12-28 Jun-ichi Takimoto <takimoto-j@kba.biglobe.ne.jp>
* 42175 + 42177 (+ 24178 by Daniel):
Completion/Base/Utility/_arguments,
Completion/Base/Utility/_call_program,
Completion/Debian/Command/_aptitude, Completion/Unix/Command/_a2ps,
Completion/Unix/Command/_subversion, Completion/Unix/Command/_tar,
Doc/Zsh/compsys.yo: avoid localized output from external commands
for easier analysys by the completion system.
2017-12-27 Jun-ichi Takimoto <takimoto-j@kba.biglobe.ne.jp>
* 42176: Completion/Unix/Command/_tar: update long options

View file

@ -43,7 +43,7 @@ if (( long )); then
name="${name//[^a-zA-Z0-9_]/_}"
if (( ! ${(P)+name} )); then
local iopts sopts pattern tmpo dir cur cache
local iopts sopts lflag pattern tmpo dir cur cache
typeset -Ua lopts
cache=()
@ -55,7 +55,12 @@ if (( long )); then
iopts=()
sopts=()
while [[ "$1" = -[is]* ]]; do
while [[ "$1" = -[lis]* ]]; do
if [[ "$1" = -l ]]; then
lflag='-l'
shift
continue
fi
if [[ "$1" = -??* ]]; then
tmp="${1[3,-1]}"
cur=1
@ -88,7 +93,8 @@ if (( long )); then
# option up to the end.
tmp=()
_call_program options ${~words[1]} --help 2>&1 | while IFS= read -r opt; do
_call_program $lflag options ${~words[1]} --help 2>&1 |
while IFS= read -r opt; do
if (( ${#tmp} )); then
# Previous line had no comment. Is the current one suitable?
# It's hard to be sure, but if it there was nothing on the

View file

@ -1,6 +1,6 @@
#autoload +X
local curcontext="${curcontext}" tmp err_fd=-1
local curcontext="${curcontext}" tmp err_fd=-1 clocale='_comp_locale;'
local -a prefix
if [[ "$1" = -p ]]; then
@ -10,6 +10,9 @@ if [[ "$1" = -p ]]; then
zstyle -t ":completion:${curcontext}:${1}" gain-privileges &&
prefix=( $_comp_priv_prefix )
fi
elif [[ "$1" = -l ]]; then
shift
clocale=''
fi
if (( ${debug_fd:--1} > 2 )) || [[ ! -t 2 ]]
@ -21,12 +24,12 @@ fi
if zstyle -s ":completion:${curcontext}:${1}" command tmp; then
if [[ "$tmp" = -* ]]; then
eval "$tmp[2,-1]" "$argv[2,-1]"
eval $clocale "$tmp[2,-1]" "$argv[2,-1]"
else
eval $prefix "$tmp"
eval $clocale $prefix "$tmp"
fi
else
eval $prefix "$argv[2,-1]"
eval $clocale $prefix "$argv[2,-1]"
fi 2>&$err_fd
} always {

View file

@ -80,7 +80,7 @@ _arguments -C \
case $state in
cmds)
cmds=( ${${(M)${(f)"$(LC_ALL=C _call_program commands aptitude -h 2>/dev/null)"}:# [^- ][^ ]## *}/(#b) ([^ ]##) ##(- )#([^- ]*)/$match[1]:$match[3]:l})
cmds=( ${${(M)${(f)"$(_call_program commands aptitude -h 2>/dev/null)"}:# [^- ][^ ]## *}/(#b) ([^ ]##) ##(- )#([^- ]*)/$match[1]:$match[3]:l})
_describe -t commands 'aptitude command' cmds && ret=0
;;

View file

@ -7,7 +7,7 @@ if [[ "$words[1]" != "$_cache_a2ps_cmd" ]]; then
_cache_a2ps_cmd="$words[1]"
descr=( "${(@)${(f@)$(_call_program features LC_ALL=C $words[1] --list=features)//
descr=( "${(@)${(f@)$(_call_program features $words[1] --list=features)//
/ }:#}" )
_cache_a2ps_values=(

View file

@ -34,7 +34,7 @@ _svn () {
typeset -gHA _svn_cmds
if _cache_invalid svn-cmds || ! _retrieve_cache svn-cmds; then
_svn_cmds=(
${=${(f)${${"$(_comp_locale; _call_program commands svn help)"#l#*Available subcommands:}%%Subversion is a tool*}}/(#s)[[:space:]]#(#b)([a-z]##)[[:space:]]#(\([a-z, ?]##\))#/$match[1] :$match[1]${match[2]:+:${${match[2]//[(),]}// /:}}:}
${=${(f)${${"$(_call_program commands svn help)"#l#*Available subcommands:}%%Subversion is a tool*}}/(#s)[[:space:]]#(#b)([a-z]##)[[:space:]]#(\([a-z, ?]##\))#/$match[1] :$match[1]${match[2]:+:${${match[2]//[(),]}// /:}}:}
)
if (( $? == 0 )); then
_store_cache svn-cmds _svn_cmds
@ -60,14 +60,14 @@ _svn () {
if _cache_invalid svn-${cmd}-usage || \
! _retrieve_cache svn-${cmd}-usage;
then
usage=${${(M)${(f)"$(_comp_locale; _call_program options svn help $cmd)"}:#usage:*}#usage:*$cmd] }
usage=${${(M)${(f)"$(_call_program options svn help $cmd)"}:#usage:*}#usage:*$cmd] }
_store_cache svn-${cmd}-usage usage
fi
if _cache_invalid svn-${cmd}-usage || \
! _retrieve_cache svn-${cmd}-args;
then
args=(
${=${${${(M)${(f)"$(_comp_locale; _call_program options svn help $cmd)"#(*Valid options:|(#e))}:#* :*}%% #:*}/ (arg|ARG)/:arg:}/(#b)(-##)([[:alpha:]]##) \[--([a-z-]##)\](:arg:)#/(--$match[3])$match[1]$match[2]$match[4] ($match[1]$match[2])--$match[3]$match[4]}
${=${${${(M)${(f)"$(_call_program options svn help $cmd)"#(*Valid options:|(#e))}:#* :*}%% #:*}/ (arg|ARG)/:arg:}/(#b)(-##)([[:alpha:]]##) \[--([a-z-]##)\](:arg:)#/(--$match[3])$match[1]$match[2]$match[4] ($match[1]$match[2])--$match[3]$match[4]}
)
while (( idx=$args[(I)*--accept:arg:] )); do
args[(I)*--accept:arg:]=( --accept'=:automatic conflict resolution action:((working\:working base\:base '"`for i j in p postpone mc mine-conflict tc theirs-conflict mf mine-full tf theirs-full e edit l launch; do print -rn $i\\\\:$j $j\\\\:$j ""; done `"'))' )
@ -227,7 +227,7 @@ _svnadmin () {
if [[ -n $state ]] && (( ! $+_svnadmin_cmds )); then
typeset -gHA _svnadmin_cmds
_svnadmin_cmds=(
${=${(f)${${"$(_comp_locale; _call_program commands svnadmin help)"#l#*Available subcommands:}}}/(#s)[[:space:]]#(#b)([-a-z]##)[[:space:]]#(\([a-z, ?]##\))#/$match[1] :$match[1]${match[2]:+:${${match[2]//[(),]}// /:}}:}
${=${(f)${${"$(_call_program commands svnadmin help)"#l#*Available subcommands:}}}/(#s)[[:space:]]#(#b)([-a-z]##)[[:space:]]#(\([a-z, ?]##\))#/$match[1] :$match[1]${match[2]:+:${${match[2]//[(),]}// /:}}:}
)
fi
@ -242,9 +242,9 @@ _svnadmin () {
if (( $#cmd )); then
curcontext="${curcontext%:*:*}:svnadmin-${cmd}:"
usage=${${(M)${(f)"$(_comp_locale; _call_program options svnadmin help $cmd)"}:#$cmd: usage:*}#$cmd: usage: svnadmin $cmd }
usage=${${(M)${(f)"$(_call_program options svnadmin help $cmd)"}:#$cmd: usage:*}#$cmd: usage: svnadmin $cmd }
args=(
${=${${${(M)${(f)"$(_comp_locale; _call_program options svnadmin help $cmd)"#(*Valid options:|(#e))}:#* :*}%% #:*}/ (arg|ARG)/:arg:}/(#b)-([[:alpha:]]) \[--([a-z-]##)\](:arg:)#/(--$match[2])-$match[1]$match[3] (-$match[1])--$match[2]$match[3]}
${=${${${(M)${(f)"$(_call_program options svnadmin help $cmd)"#(*Valid options:|(#e))}:#* :*}%% #:*}/ (arg|ARG)/:arg:}/(#b)-([[:alpha:]]) \[--([a-z-]##)\](:arg:)#/(--$match[2])-$match[1]$match[3] (-$match[1])--$match[2]$match[3]}
)
# All options get {-x+,--long-x=}
args=( ${args/(#b)(--[A-Za-z0-9-]##):arg:/$match[1]=:arg:} )
@ -429,7 +429,7 @@ _svn_props() {
_svn_changelists() {
local cls
cls=( ${${${(M)${(f)"$(_comp_locale; _call_program changelists svn status 2>/dev/null)"}:#--- Changelist*}%??}##*\'} )
cls=( ${${${(M)${(f)"$(_call_program changelists svn status 2>/dev/null)"}:#--- Changelist*}%??}##*\'} )
compadd "$@" -a cls && return 0
}

View file

@ -99,7 +99,7 @@ if [[ "$PREFIX" = --* ]]; then
# ...long options after `--'.
_arguments -- '--owner=*:user:_users' \
_arguments -- -l '--owner=*:user:_users' \
'--group=*:group:_groups' \
'--atime-preserve*::method:(replace system)' \
'--*-script=NAME:script file:_files' \

View file

@ -3596,7 +3596,8 @@ findex(_arguments)
redef(SPACES)(0)(tt(ifztexi(NOTRANS(@ @ @ @ @ @ @ @ @ @ @ ))ifnztexi( )))
xitem(tt(_arguments )[ tt(-nswWCRS) ] [ tt(-A) var(pat) ] [ tt(-O) var(name) ] [ tt(-M) var(matchspec) ])
xitem(SPACES()[ tt(:) ] var(spec) ...)
item(tt(_arguments) [ var(opt) ... ] tt(-)tt(-) [ tt(-i) var(pats) ] [ tt(-s) var(pair) ] [ var(helpspec) ... ])(
xitem(tt(_arguments )[ var(opt) ... ] tt(-)tt(-) [ tt(-l) ] [ tt(-i) var(pats) ] [ tt(-s) var(pair) ])
item(SPACES()[ var(helpspec) ...])(
This function can be used to give a complete specification for completion
for a command whose arguments follow standard UNIX option and argument
conventions.
@ -4139,6 +4140,12 @@ pattern and the var(action) will be used only directly after the
`tt(=)', not in the next word. This is the behaviour of a normal
specification defined with the form `tt(=-)'.
By default, the command (with the option `tt(--help)') is run after
resetting all the locale categories (except for tt(LC_CTYPE)) to `tt(C)'.
If the localized help output is known to work, the option `tt(-l)' can
be specified after the `tt(_arguments -)tt(-)' so that the command is
run in the current locale.
The `tt(_arguments -)tt(-)' can be followed by the option `tt(-i)
var(patterns)' to give patterns for options which are not to be
completed. The patterns can be given as the name of an array parameter
@ -4230,7 +4237,7 @@ The return status of tt(_call_function) itself is zero if the function
var(name) exists and was called and non-zero otherwise.
)
findex(_call_program)
item(tt(_call_program) [ tt(-p) ] var(tag) var(string) ...)(
item(tt(_call_program) [ tt(-l) ] [ tt(-p) ] var(tag) var(string) ...)(
This function provides a mechanism for the user to override the use of an
external command. It looks up the tt(command) style with the supplied
var(tag). If the style is set, its value is used as the command to
@ -4239,6 +4246,11 @@ style if set, are concatenated with spaces between them and the resulting
string is evaluated. The return status is the return status of the command
called.
By default, the command is run in an environment where all the locale
categories (except for tt(LC_CTYPE)) are reset to `tt(C)' by calling the
utility function tt(_comp_locale) (see below). If the option `tt(-l)' is
given, the command is run with the current locale.
If the option `tt(-p)' is supplied it indicates that the command
output is influenced by the permissions it is run with. If the
tt(gain-privileges) style is set to true, tt(_call_program) will make
@ -4299,6 +4311,18 @@ This function completes words that are valid at command position: names of
aliases, builtins, hashed commands, functions, and so on. With the tt(-e)
flag, only hashed commands are completed. The tt(-) flag is ignored.
)
findex(_comp_locale)
item(tt(_comp_locale))(
This function resets all the locale categories other than tt(LC_CTYPE) to
`tt(C)' so that the output from external commands can be easily analyzed by
the completion system. tt(LC_CTYPE) retains the current value (taking
tt(LC_ALL) and tt(LANG) into account), ensuring that non-ASCII characters
in file names are still handled properly.
This function should normally be run only in a subshell, because the new
locale is exported to the environment. Typical usage would be
`tt($LPAR()_comp_locale; )var(command) ...tt(RPAR())'.
)
findex(_completers)
item(tt(_completers) [ tt(-p) ])(
This function completes names of completers.