From 164dd3d7d239a8d4df881cdc7dc408d5cdee0a10 Mon Sep 17 00:00:00 2001 From: Paul Ackersviller Date: Sun, 18 Nov 2007 20:27:59 +0000 Subject: Merge of 23438: improve finding of network printers. --- Completion/Unix/Type/_printers | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) (limited to 'Completion/Unix') diff --git a/Completion/Unix/Type/_printers b/Completion/Unix/Type/_printers index edbc9aaae..70f10f65e 100644 --- a/Completion/Unix/Type/_printers +++ b/Completion/Unix/Type/_printers @@ -1,6 +1,7 @@ #compdef -value-,PRINTER,-default- -value-,LPDEST,-default- -local expl ret=1 list disp sep tmp +local expl ret=1 list disp sep tmp servopt +integer ind if (( $+commands[lsallq] )); then # Use AIX's command to list print queues @@ -10,6 +11,32 @@ fi zstyle -s ":completion:${curcontext}:printers" list-separator sep || sep=-- +# If we've been given a different print server on the command line, +# list printers on that. This information shouldn't be cached. +# (I) searches backwards---this is good, since some commands, such +# as lpoptions, can take multiple -h arguments and we want the last +# one before the current argument. For lpr, -h might mean something +# else and the option is -H. +if [[ $service = lpr ]]; then + servopt=-H +else + servopt=-h +fi +if (( $+commands[lpstat] )); then + ind=${words[1,CURRENT][(I)${servopt}*]} + if (( ind > 0 )); then + if [[ $words[ind] = $servopt ]]; then + tmp=-h$words[ind+1] + else + tmp=-h${words[ind][3,-1]} + fi + _wanted printers expl printer compadd "$@" - \ + ${${(f)"$(_call_program printers lpstat $tmp -a 2>/dev/null)"}%% *} && + return + fi +fi + + if (( ! $+_lp_cache )); then local file entry names i @@ -40,6 +67,17 @@ if (( ! $+_lp_cache )); then done < $file[1] fi + if (( $+commands[lpstat] )); then + # If lpstat it exists, it's possible there are some other + # printers there, so add them. + _call_program printers lpstat -a 2>/dev/null | while read entry; do + entry=${entry%%[[:blank:]]*} + if (( ${_lp_cache[(I)$entry:*]} == 0 )); then + _lp_cache+=( $entry ) + fi + done + fi + if [[ $OSTYPE = solaris* ]] && (( ${+commands[ypcat]} )) && tmp=$(_call_program printers ypcat printers.conf.byname 2>/dev/null); then _lp_cache+=( ${${${(S)${(f)tmp}/(#b):*((#e)|description=([^:]#):)*/:${match[2]}|}%%|*}:#_default*} ) # If you use YP -- cgit 1.4.1