summary refs log tree commit diff
path: root/Completion/Unix/Command/_lp
diff options
context:
space:
mode:
Diffstat (limited to 'Completion/Unix/Command/_lp')
-rw-r--r--Completion/Unix/Command/_lp257
1 files changed, 212 insertions, 45 deletions
diff --git a/Completion/Unix/Command/_lp b/Completion/Unix/Command/_lp
index ab0d53821..e6bff64cc 100644
--- a/Completion/Unix/Command/_lp
+++ b/Completion/Unix/Command/_lp
@@ -1,52 +1,219 @@
-#compdef lp lpr lpq lprm
+#compdef lp lpr lpq lprm lpoptions lpstat
 
 local expl ret=1 printer list disp strs shown
 
-if compset -P '-[dP]' || [[ "$words[CURRENT-1]" = -[dP] ]]; then
-  _printers
-else
-  if [[ "$service" = (lpq|lprm) ]]; then
-    if [[ "$words" = *-P* ]]; then
-      printer=(-P "${${words##*-P( |)}%% *}")
-    else
-      printer=()
-    fi
-    list=( ${(M)"${(f@)$(_call_program jobs lpq $printer 2> /dev/null)}":#[0-9]*} )
-
-    if (( $#list )); then
-      _tags users jobs
-
-      while _tags; do
-        if _requested users; then
-          strs=( "${(@)${(@)list##[^ 	]##[ 	]##[^ 	]##[ 	]##}%%[ 	]*}" )
-          if [[ -z "$shown" ]] &&
-             zstyle -T ":completion:${curcontext}:users" verbose; then
-            disp=(-ld list)
-  	  shown=yes
-          else
-  	  disp=()
-          fi
-	  _all_labels users expl user compadd "$disp[@]" -a strs ||
-              _users && ret=0
-        fi
-        if _requested jobs; then
-          strs=( "${(@)${(@)list##[^ 	]##[ 	]##[^ 	]##[ 	]##[^ 	]##[ 	]##}%%[ 	]*}" )
-          if [[ -z "$shown" ]] &&
-             zstyle -T ":completion:${curcontext}:jobs" verbose; then
-            disp=(-ld list)
-  	  shown=yes
-          else
-  	  disp=()
-          fi
-          _all_labels jobs expl job compadd "$disp[@]" -a strs && ret=0
-        fi
-        (( ret )) || return 0
-      done
+_lp_get_printer()
+{
+  # No reason to call _lp_get_printer when service == lpstat. Others matched
+  # below.
+  case $service in
+    (lpr|lpq|lprm)
+      [[ "$words" == (#I)*-P* ]] && printer="${${words##*(#I)-P( |)}%% *}"
+      ;;
+    (lp)
+      [[ "$words" == (#I)*-d* ]] && printer="${${words##*(#I)-d( |)}%% *}"
+      ;;
+    (lpoptions)
+      [[ "$words" == (#I)*-(d|p)* ]] && \
+	printer="${${words##*(#I)-(d|p)( |)}%% *}"
+      ;;
+  esac
+}
+
+_lp_job_options()
+{
+  local -a lopts_with_args lopts_no_args
+
+  # Generic options (from lp manual page)
+  lopts_with_args=( media orientation-requested sides number-up scaling cpi lpi
+    page-{bottom,left,right,top} )
+
+  lopts_no_args=(fitplot landscape)
+
+  _lp_get_printer
+  [[ -n "$printer" ]] && printer=(-p $printer)
+
+  # The program specified by the style list-printer-options should list jobs in
+  # the same style as lpoptions -l.
+  if compset -P '*='; then
+    # List values for the option
+    case ${IPREFIX%=} in
+      (media)
+	compadd "$@" a4 letter legal
+	;;
+      (orientation-requested)
+	compadd "$@" 4
+	;;
+      (sides)
+	compadd "$@" one-sided two-sided-{long,short}-edge
+	;;
+      (number-up)
+	_description -V option-o-1 expl "pages per sheet"
+	compadd "$expl[@]" 2 4 6 9 16
+	;;
+      (scaling|cpi|lpi|page-(bottom|left|right|top))
+	return 0; # Don't complete anything
+	;;
+      (*)
+	compadd "$@" \
+	  $(_call_program list-printer-options lpoptions $printer -l | \
+	    grep "^${IPREFIX%=}" | cut -d: -f2 | tr -d \* )
+	;;
+    esac
+  else
+    # List options
+    local eq_suffix
+
+    # Don't add an '=' suffix when completing lpoptions -r
+    if [[ $service == lpoptions && $words[CURRENT-1] == "-r" ]]; then
+      eq_suffix=()
     else
-      _message 'no print jobs'
+      eq_suffix=(-S '=')
     fi
-    return 1
+
+    _description lpopts expl "generic printer options"
+    compadd "$expl[@]" $eq_suffix $lopts_with_args
+    compadd "$expl[@]" $lopts_no_args
+
+    _description printeropts expl "printer specific options"
+    compadd "$expl[@]" $eq_suffix \
+      $(_call_program list-printer-options \
+	lpoptions $printer -l | cut -d/ -f1)
+  fi
+}
+
+_lp_list_jobs()
+{
+  _lp_get_printer
+  [[ -n "$printer" ]] && printer=(-P $printer)
+
+  list=( ${(M)"${(f@)$(_call_program jobs lpq $printer 2> /dev/null)}":#[0-9]*} )
+
+  if (( $#list )); then
+    _tags users jobs
+
+    while _tags; do
+      if _requested users; then
+	strs=( "${(@)${(@)list##[^ 	]##[ 	]##[^ 	]##[ 	]##}%%[ 	]*}" )
+	if [[ -z "$shown" ]] &&
+	   zstyle -T ":completion:${curcontext}:users" verbose;
+	then
+	  disp=(-ld list)
+	  shown=yes
+	else
+	  disp=()
+	fi
+	_all_labels users expl user compadd "$disp[@]" -a strs ||
+	    _users && ret=0
+      fi
+      if _requested jobs; then
+	strs=( "${(@)${(@)list##[^ 	]##[ 	]##[^ 	]##[ 	]##[^ 	]##[ 	]##}%%[ 	]*}" )
+	if [[ -z "$shown" ]] &&
+	   zstyle -T ":completion:${curcontext}:jobs" verbose; then
+	  disp=(-ld list)
+	shown=yes
+	else
+	disp=()
+	fi
+	_all_labels jobs expl job compadd "$disp[@]" -a strs && ret=0
+      fi
+      (( ret )) || return 0
+    done
   else
-    _pspdf
+    _message 'no print jobs'
   fi
-fi
+  return 1
+}
+
+case $service in
+  (lpq)
+    _arguments \
+      '-E[Force encryption]' \
+      '-U:username (for connection to server):_users' \
+      '-h:alternate server:_hosts' \
+      '(-a)-P+[destination printer]:printers:_printers' \
+      '(-P)-a[all printers]' \
+      '-l[long listing]' \
+      '*:poll interval (+seconds):'
+    ;;
+
+  (lprm)
+    _arguments \
+      '-E[Force encryption]' \
+      '-U:username (for connection to server):_users' \
+      '-h:alternate server:_hosts' \
+      '-P+[destination printer]:printers:_printers' \
+      '*:job ids:_lp_list_jobs'
+    ;;
+
+  (lpoptions)
+    _arguments \
+      '-E[Force encryption]' \
+      '-U:username (for connection to server):_users' \
+      '-h:alternate server:_hosts' \
+      '(-p -l -r -x)-d[set default printer]:printers:_printers' \
+      '(-l -x)*-o:job options:_lp_job_options' \
+      '(-d -x)-p[destination printer for options]:printers:_printers' \
+      '(-d -o -r -x)-l[list options]' \
+      '(-d -l -x)*-r:remove option:_lp_job_options' \
+      '(-d -l -r -o)-x[remove all options]:printers:_printers'
+    ;;
+
+  (lpstat)
+    _arguments \
+      '-E[Force encryption]' \
+      '-R[Shows print job ranking]' \
+      '-U:username (for connection to server):_users' \
+      '-W:which jobs:(completed not-completed)' \
+      '-a[Show accepting state]:printers:_printers' \
+      '-c:printer classes:' \
+      '-d[Show current default destination]' \
+      '-h:hostname (alternate server):_hosts' \
+      '-l[long listing]' \
+      '-o[destinations]:printers:_printers' \
+      '-p:printers:_printers' \
+      '-r[CUPS server running status]' \
+      '-s[Status summary]' \
+      '-t[All status info]' \
+      '-u[list jobs by users]:users:_users' \
+      '-v[show devices]:printers:_printers'
+    ;;
+
+  (lpr)
+    _arguments \
+      '-E[Force encryption]' \
+      '-H:hostname (alternate server):_hosts' \
+      '(-C -J -T)'-{C,J,T}':job name:' \
+      '-P+[destination printer]:printers:_printers' \
+      '-U:username (for connection to server):_users' \
+      '-#[Copies]:copies (1--100):' \
+      '-h[Disables banner printing]' \
+      '-l[raw file]' \
+      '-m[Send an email on job completion]' \
+      '*-o:print job options:_lp_job_options' \
+      '-p[format with shaded header incl. date, time etc.]' \
+      '-q[Hold job for printing.]' \
+      '-r[delete files after printing]' \
+      '*:PS/PDF files:_pspdf'
+    ;;
+
+  (lp)
+    _arguments \
+      '-E[Force encryption]' \
+      '-U[username (for connection to server)]:username:_users' \
+      '-c[(OBSOLETE) copy to spool dir before printing]' \
+      '-d[destination printer]:printers:_printers' \
+      '-h:hostname (alternate server):_hosts' \
+      '-i[job id to modify]:job id:' \
+      '-m[Send an email on job completion]' \
+      '-n[Copies]:copies (1--100):' \
+      '*-o:print job options:_lp_job_options' \
+      '-q[Job priority -- 1 (lowest) to 100 (highest)]:priority:' \
+      '-s[Dont report resulting job IDs]' \
+      '-t[Sets the job name]:job name:' \
+      '-u[job submission username]:username:_users' \
+      '-H[Time to print]:print time (or enter hh\:mm):(hold immediate restart resume)' \
+      '-P:page range list:' \
+      '*:PS/PDF files:_pspdf'
+    ;;
+esac