Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: help with command completion



Tanaka Akira wrote:

> In article <000001bf579b$e6e4b980$21c9ca95@xxxxxxxxxxxxxx>,
>   "Andrej Borsenkow" <Andrej.Borsenkow@xxxxxxxxxxxxxx> writes:
> 
> > I do not use systems with printcap myself, but termcap (and terminfo, BTW)
> > description states, that terminal aliases are separated by | with the last one
> > being the "long, user friendly, name". I believe, printcap behaves the same way.
> 
> I tested it on SunOS 4.1.  I wonder that a last entry can be used as
> printer name.  Of course spaces must be quoted in a shell.
> 
> > So, the last entry should probably be ignored. Better yet, it is the one that
> > should be presented in verbose mode :-)
> 
> I think only first entries should be completed at first since latter
> entries are aliases and they are not so important.  But they should be
> completed if first entries are not matched.

I agree with both. So...

I had a closer look at our Solaris 2.6 boxes here. They support a
`description=...' entry which should be prefered if existent, I
think.

It also seems that Solaris 2.6 supports a ~/.printers file which may
contain user-defined aliases. I haven't integrated that yet -- the
fromat is slightly different and we should then use the descriptions
taken from the main file, if possible.

Also, I haven't tried to make this AIX-compatible -- Oliver, did you
mean to say that /etc/qconfig has the printcap-format or something
else?

Bye
 Sven

diff -ru ../z.old/Completion/User/_lp Completion/User/_lp
--- ../z.old/Completion/User/_lp	Thu Jan  6 10:27:50 2000
+++ Completion/User/_lp	Thu Jan  6 11:51:10 2000
@@ -1,21 +1,62 @@
 #compdef lp lpr lpq lprm
 
-local file expl ret=1 printer list disp strs shown
+local expl ret=1 printer list disp strs shown
 
 if (( ! $+_lp_cache )); then
+  local file entry names i
+
    file=( /etc/(printcap|printers.conf)(N) )
 
-  if (( $#file )); then
-    _lp_cache=( "${(@)${(@s:|:)${(@)${(@f)$(< $file[1])}:#[    \#]*}%%:*}%%[ 	]*}" )
-  else
-    # Default value. Could probably be improved
+  _lp_cache=()
+  _lp_alias_cache=()
 
-    _lp_cache=( lp0 )
+  if (( $#file )); then
+    while read entry; do
+      if [[ "$entry" = [^[:blank:]\#\*_]*:* ]]; then
+        names=( "${(s:|:)entry%%:*}" )
+        if [[ "$entry" = *:description=* ]]; then
+          disp="${${entry##*:description=}%%:*}"
+        elif [[ $#names -gt 1 && "$names[-1]" = *\ * ]] ;then
+          disp="$names[-1]"
+        else
+          disp=''
+        fi
+        if [[ -n "$disp" ]]; then
+          _lp_cache=( "$_lp_cache[@]" "${names[1]}:${disp}" )
+  	_lp_alias_cache=( "$_lp_alias_cache[@]" "${(@)^names[2,-1]:#*\ *}:${disp}" )
+        else
+          _lp_cache=( "$_lp_cache[@]" "${names[1]}" )
+  	_lp_alias_cache=( "$_lp_alias_cache[@]" "${(@)names[2,-1]:#*\ *}" )
+        fi
+      fi
+    done < $file[1]
   fi
+  (( $#_lp_cache )) || _lp_cache( 'lp0:Guessed default printer' )
+  (( $#_lp_alias_cache )) || unset _lp_alias_cache
 fi
 
 if compset -P -P || [[ "$words[CURRENT-1]" = -P ]]; then
-  _wanted printers expl printer && compadd "$expl[@]" - "$_lp_cache[@]"
+  if _wanted printers expl printer; then
+    if zstyle -t ":completion:${curcontext}:printers" verbose; then
+      zformat -a list ' -- ' "$_lp_cache[@]"
+      disp=(-ld list)
+    else
+      disp=()
+    fi
+    compadd "$expl[@]" "$disp[@]" - "${(@)_lp_cache%%:*}" && return 0
+
+    (( $+_lp_alias_cache )) || return 1
+
+    if zstyle -t ":completion:${curcontext}:printers" verbose; then
+      zformat -a list ' -- ' "$_lp_alias_cache[@]"
+      disp=(-ld list)
+    else
+      disp=()
+    fi
+    compadd "$expl[@]" "$disp[@]" - "${(@)_lp_alias_cache%%:*}"
+  else
+    return 1
+  fi
 else
   if [[ "$words[1]" = (lpq|lprm) ]]; then
     if [[ "$words" = *-P* ]]; then

--
Sven Wischnowsky                         wischnow@xxxxxxxxxxxxxxxxxxxxxxx



Messages sorted by: Reverse Date, Date, Thread, Author