mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-01-01 05:16:05 +01:00
39731: _awk: add support for gawk ver.3 and 4
This commit is contained in:
parent
33ceb8b58f
commit
4eed68e0bf
2 changed files with 121 additions and 18 deletions
|
@ -1,3 +1,8 @@
|
|||
2016-11-01 Jun-ichi Takimoto <takimoto-j@kba.biglobe.ne.jp>
|
||||
|
||||
* 39731: Completion/Unix/Command/_awk: add support for gawk
|
||||
ver.3 and 4
|
||||
|
||||
2016-11-01 Daniel Shahaf <d.s@daniel.shahaf.name>
|
||||
|
||||
* 39787: Test/Y01completion.ztst: Add a regression test for
|
||||
|
|
|
@ -1,21 +1,119 @@
|
|||
#compdef awk
|
||||
#compdef awk gawk
|
||||
|
||||
# completions for awk
|
||||
# This only aims to complete POSIX awk options, as described in
|
||||
# awk(P). Most awk implementations, such as gawk and mawk, will have
|
||||
# additional options that this does not complete. Also, currently
|
||||
# this completion does not allow everything that POSIX allows. For
|
||||
# example, awk(P) states that the user may specify assignments
|
||||
# without using the -v option; this does not support that.
|
||||
# For gawk ver.3 and 4, in addition to POSIX.
|
||||
#
|
||||
# In addition, the "program text" completion is not perfect. For
|
||||
# instance, type "awk -" and then hit tab. You will be presented
|
||||
# both with the dashed options and with the "program text" option.
|
||||
# Fixing this is beyond my current _arguments expertise--help
|
||||
# appreciated.
|
||||
# gawk's options '-W ...' (such as '-W help') are not supported.
|
||||
# gawk3 has some synomyms for long options (e.g., --compat is a synomym
|
||||
# for --traditional). These are not supported either.
|
||||
#
|
||||
# 'gawk -f<TAB>' will complete files in AWKPATH in addition to those in
|
||||
# the current directory. If this is annoying, you may try
|
||||
# zstyle ':completion:*:*:gawk:option-f-1:*' tag-order program-files
|
||||
|
||||
_arguments -S -s '-F+[define input field separator to be an extended regular expression]:extended regular expression:' \
|
||||
'*-v+[assign values to variables]:assignment:' \
|
||||
'(1)-f+[program file]:program file:_files' \
|
||||
'1:program text:' \
|
||||
'*:input files:_files'
|
||||
local variant curcontext="$curcontext" state state_descr line ret=1
|
||||
local -A opt_args
|
||||
local -a args
|
||||
|
||||
_pick_variant -r variant gawk4='GNU Awk 4' gawk3='GNU Awk 3' posix --version
|
||||
|
||||
args=(
|
||||
{-F+,--field-separator}'[define input field separator by extended regex]:extended regular expression:'
|
||||
'*'{-v+,--assign}'[assign values to variables]:assignment:'
|
||||
'(1)*'{-f+,--file}'[read program file]:program file:->script'
|
||||
'1: :_guard "^-*" "program text"'
|
||||
'*:input files:_files'
|
||||
)
|
||||
|
||||
case $variant in
|
||||
(gawk*)
|
||||
args+=(
|
||||
{-c,--traditional}'[run in compatibility mode]'
|
||||
'(- : *)'{-C,--copyright}'[print copyright info and exit]'
|
||||
{-d-,--dump-variables=-}'[print a sorted list of global variables]::output file:_files'
|
||||
{-e,--source}'[pass program text in arg]:program text:'
|
||||
'(1)'{-E+,--exec}'[like -f, but safer for CGI]:program file:->script'
|
||||
'(- : *)'{-h,--help}'[print usage message and exit]'
|
||||
{-L-,--lint=-}'[warn about dubious or non-portable constructs]::flag:((fatal\:"treat warnings as fatal error" invalid\:"warn only about thigs that are actually invalid"))'
|
||||
{-n,--non-decimal-data}'[auto-detect octal/hexadecimal values in input]'
|
||||
{-N,--use-lc-numeric}"[force use of locale's decimal point character]"
|
||||
{-O,--optimize}'[enable optimization]'
|
||||
{-p-,--profile=-}'[output profiling data to file]::output file:_files'
|
||||
{-P,--posix}'[run in strict POSIX mode]'
|
||||
{-r,--re-interval}'[enable interval expressions in regex matching]'
|
||||
{-t,--lint-old}'[warn about non-portable constructs]'
|
||||
'(- : *)'{-V,--version}'[print version info and exit]'
|
||||
)
|
||||
;|
|
||||
(gawk4)
|
||||
args+=(
|
||||
{-b,--characters-as-bytes}'[treat all input data as single-byte characters]'
|
||||
{-D-,--debug=-}'[enable debugging]::debugger command file:_files'
|
||||
{-g,--gen-pot}'[scan awk program and generate .po file on stdout]'
|
||||
'*'{-i+,--include}'[load source library]:library file:->script'
|
||||
'*'{-l+,--load}'[load dynamic extension]:extension:->extension'
|
||||
{-M,--bignum}'[select arbitrary-precision arithmetic on numbers]'
|
||||
{-o-,--pretty-print=-}'[pretty-print awk program]::output file:_files'
|
||||
{-S,--sandbox}'[disable system(), redirections and dynamic extensions]'
|
||||
)
|
||||
;;
|
||||
(gawk3)
|
||||
# one letter options are new in gawk4
|
||||
args=( ${args:#(|\*)(|\(*\))-[cCdEhLnNtOpPreV]*} )
|
||||
args+=(
|
||||
'--gen-po[scan awk program and generate .po file on stdout]'
|
||||
)
|
||||
;;
|
||||
(*)
|
||||
# remove long options
|
||||
args=( ${args:#*--*} )
|
||||
esac
|
||||
|
||||
_arguments -S -s -C : $args && ret=0
|
||||
|
||||
# Complete files in . (current directory) and AWKPATH/AWKLIBPATH.
|
||||
# Use different tag/description for files in . even if . is in AWKPATH.
|
||||
_files_in_curdir_or_path() {
|
||||
local expl pat1 pat2
|
||||
if [[ -n $6 ]]; then # $6 = 'so', 'dll' or ''
|
||||
pat1="-g *.$6"
|
||||
pat2="-g *.$6"
|
||||
fi
|
||||
if [[ $words[CURRENT] == */* || $variant != gawk* || \
|
||||
-n $opt_args[(I)(-c|--traditional|-P|--posix)] ]]; then
|
||||
_wanted $2 expl $3 _files $pat1 && ret=0
|
||||
else
|
||||
local prog='BEGIN {print ENVIRON["'$1'"]}'
|
||||
local -aU paths
|
||||
# split AWKPATH into paths, and replace null element by '.'.
|
||||
paths=( "${(@)${(@s.:.)$(_call_program get-awk-env \
|
||||
$words[1] ${(q)prog})}:/#%/.}" )
|
||||
if (( $paths[(I).] )); then
|
||||
# If '.' is in paths, remove it; we will handle it separately
|
||||
paths=( ${(@)paths:#.} )
|
||||
else
|
||||
# If '.' is not in paths, we should not complete files in '.'
|
||||
pat1='-g *(-/)'
|
||||
fi
|
||||
if (( $#paths )); then
|
||||
_alternative "${2}:${3}:_files ${(b)pat1}" \
|
||||
"${4}:${5}:_files -W paths ${(b)pat2}" && ret=0
|
||||
else
|
||||
_wanted $2 expl $3 _files $pat1 && ret=0
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
case $state in
|
||||
(script)
|
||||
_files_in_curdir_or_path AWKPATH program-files 'program file' \
|
||||
library-files 'library in AWKPATH'
|
||||
;;
|
||||
(extension)
|
||||
local ext=so
|
||||
[[ $OSTYPE == cygwin* ]] && ext=dll
|
||||
_files_in_curdir_or_path AWKLIBPATH extensions 'extension' \
|
||||
library-files 'extension in AWKLIBPATH' $ext
|
||||
;;
|
||||
esac
|
||||
|
||||
return ret
|
||||
|
|
Loading…
Reference in a new issue