From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 19281 invoked by alias); 1 May 2016 12:13:57 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: X-Seq: 38385 Received: (qmail 1252 invoked from network); 1 May 2016 12:13:55 -0000 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.1 From: Frank Terbeck To: Ryan Wilson Cc: zsh-workers@zsh.org Subject: Re: [PATCH] Add completion for picocom utility In-Reply-To: <1462073256.13063.11.camel@enosys.org> (Ryan Wilson's message of "Sat, 30 Apr 2016 22:27:36 -0500") References: <1462065176-4503-1-git-send-email-ft@bewatermyfriend.org> <1462073256.13063.11.camel@enosys.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.1.50 (gnu/linux) Date: Sun, 01 May 2016 12:57:30 +0200 Message-ID: <87k2jegi5h.fsf@ft.bewatermyfriend.org> MIME-Version: 1.0 Content-Type: text/plain X-Df-Sender: NDMwNDQ0 Hey Ryan, Ryan Wilson wrote: > On Sun, 2016-05-01 at 03:12 +0200, Frank Terbeck wrote: >> --- >> We're using picocom quite a lot at work, having to remember options >> and baud-rates by heart is getting tiresome, though. So here's a first >> stab at this. If someone has a portable way to generate a list of >> supported baud-rates for serial devices, I love to hear it. I took a further look and couldn't find a _portable_ way to generate the list on the fly. So using some sort of a pre-compiled list seem to be as good as it gets. > I was just looking at baud rate completion myself and each command I've > found that does it (namely: _cu, _gdb, _joe, and _screen) uses a > different list. So how about making it a generic _baud_rate helper that > everything can share? Interesting. Seems like "joe" uses the baud rate for different reasons, though, and therefore only needs a smaller list. Actually, scratch that. The option description in _joe misled me into thinking its -baud option only needed baud rates below 19200. But since I now already have a working helper with the possibility for callers to apply filters to the original list, I am not going to throw it away. Maybe it will come in handy at a later point in time. Here is a patch that touches the places you mentioned: >>From 093f91482683db03c81ee0dc3fac637a3dcc178e Mon Sep 17 00:00:00 2001 From: Frank Terbeck Date: Sun, 1 May 2016 12:49:30 +0200 Subject: [PATCH] Refactor baud rate completion This adds a new helper function _baudrate and uses it in place of private solutions in various existing completions. --- Completion/BSD/Command/_cu | 2 +- Completion/Unix/Command/_gdb | 4 +-- Completion/Unix/Command/_joe | 2 +- Completion/Unix/Command/_picocom | 27 +-------------- Completion/Unix/Command/_screen | 2 +- Completion/Unix/Type/_baudrate | 73 ++++++++++++++++++++++++++++++++++++++++ 6 files changed, 78 insertions(+), 32 deletions(-) create mode 100644 Completion/Unix/Type/_baudrate diff --git a/Completion/BSD/Command/_cu b/Completion/BSD/Command/_cu index bdd5795..4b9f25d 100644 --- a/Completion/BSD/Command/_cu +++ b/Completion/BSD/Command/_cu @@ -3,5 +3,5 @@ _arguments -s -A '-*' \ '-d[do not block waiting for a carrier to be detected]' \ '-l[line to use]:line:(/dev/(cuaU#<->|ttyS<->)(N%c))' \ - '-s[line speed]:line speed:(75 110 300 1200 2400 4800 9600 19200 38400 57600 115200)' \ + '-s[line speed]:line speed:_baudrate -d "line speed"' \ '(-*)1:host:' diff --git a/Completion/Unix/Command/_gdb b/Completion/Unix/Command/_gdb index e9c3339..d5eed5a 100644 --- a/Completion/Unix/Command/_gdb +++ b/Completion/Unix/Command/_gdb @@ -37,9 +37,7 @@ else (-[csx]) _files && return 0 ;; (-e) _description files expl executable _files "$expl[@]" -g '*(-*)' && return 0 ;; - (-b) _wanted -V values expl 'baud rate' \ - compadd 0 50 75 110 134 150 200 300 600 1200 1800 2400 4800 \ - 9600 19200 38400 57600 115200 230400 && return 0 ;; + (-b) _baudrate && return 0 ;; esac w=( "${(@)words[2,-1]}" ) diff --git a/Completion/Unix/Command/_joe b/Completion/Unix/Command/_joe index 96ad0a4..4e5b43b 100644 --- a/Completion/Unix/Command/_joe +++ b/Completion/Unix/Command/_joe @@ -3,7 +3,7 @@ _arguments \ '-asis[characters with codes >127 will be displayed non-inverted]' \ '-backpath[backup file directory]:backup file directory:_files -/' \ - '-baud[inserts delays for baud rates below 19200]:baud rate:(57600 38400 19200 9600 4800 2400 1200 300)' \ + '-baud[inserts delays for baud rates below 19200]:baud rate:_baudrate' \ '-beep[beep on command errors or when cursor goes past extremes]' \ '-columns[sets the number of screen columns]:num of columns' \ '-csmode[continued search mode]' \ diff --git a/Completion/Unix/Command/_picocom b/Completion/Unix/Command/_picocom index 6653bc2..c9d3be0 100644 --- a/Completion/Unix/Command/_picocom +++ b/Completion/Unix/Command/_picocom @@ -1,30 +1,5 @@ #compdef picocom -# The following function uses a generated list; first find out where the B* -# macros are defined: -# -# grep -r B115200 /usr/include -# -# Then generate the actual list: -# -# sed -ne '/^[ \t]*#define[ \t]*B[0-9][0-9]*/s,^.*B\([0-9][0-9]*\).*,\1,p' \ -# < /usr/include/asm-generic/termbits.h -# -# This one was generated on a Debian Stretch system, leaving out the "0" rate, -# which is synonymous to "hang-up". -function _picocom_baudrate () { - local expl - local -a rates - rates=( 50 75 110 134 150 200 300 600 - 1200 1800 2400 4800 9600 - 19200 38400 57600 - 115200 230400 460800 500000 576000 921600 - 1000000 1152000 1500000 2000000 2500000 3000000 3500000 4000000 ) - # -1V removes dupes (which there shouldn't be) and otherwise leaves the - # order in the $rates array intact. - _wanted -1V baud-rate expl 'baud rate' compadd -a $expl -- rates -} - function _picocom_flowcontrol () { local expl local -a modes @@ -57,7 +32,7 @@ function _picocom_escape () { function _picocom () { local -a args - args=( '(--baud -b)'{--baud,-b}'[define baud-rate to set the terminal to]:baud rate:_picocom_baudrate' + args=( '(--baud -b)'{--baud,-b}'[define baud-rate to set the terminal to]:baud rate:_baudrate' '(--flow -f)'{--flow,-f}'[define type of flow control to use]:flow control:_picocom_flowcontrol' '(--parity -p)'{--parity,-p}'[define type of parity to use]:parity mode:_picocom_paritymode' '(--databits -d)'{--databits,-d}'[define the number of databits per word]:data bits:_picocom_databits' diff --git a/Completion/Unix/Command/_screen b/Completion/Unix/Command/_screen index 510fd71..f4d2ef9 100644 --- a/Completion/Unix/Command/_screen +++ b/Completion/Unix/Command/_screen @@ -99,7 +99,7 @@ if [[ -n $state ]]; then if (( CURRENT == 1 )) && [[ $PREFIX == /dev/* ]]; then _path_files -g '*(%)' elif (( CURRENT == 2 )) && [[ ${words[1]} == /dev/* ]]; then - _message "baud rate" + _baudrate elif (( CURRENT > 2 )) && [[ ${words[1]} == /dev/* ]]; then _message "no more parameters" else diff --git a/Completion/Unix/Type/_baudrate b/Completion/Unix/Type/_baudrate new file mode 100644 index 0000000..093e42d --- /dev/null +++ b/Completion/Unix/Type/_baudrate @@ -0,0 +1,73 @@ +#autoload + +# Offer a list of baud-rates. Usage: +# +# _baudrate [OPTION(s)...] +# +# Available options: +# +# -u LIMIT Upper limit. LIMIT is the maximum value the offered list +# will contain, if the complete list includes LIMIT exactly. +# +# -l LIMIT Lower limit. Like -u but for the lower boundary. +# +# -f FUNCTION If given FUNCION is used as a predicate to filter the +# value in the complete list to generate an arbitrary +# sub-set. +# +# -t TAG Use TAG as the tag value in _wanted call. +# +# -d DESC Use DESC as the description value in _wanted call. +# +# The default complete list of available baud rates is also configurable via +# the 'baud-rates' style: +# +# zstyle ':completion:*' baud-rates 23 42 666 + +local -A opts +local expl tag desc +local -a rates + +zparseopts -E -A opts u: l: f: + +# The following uses a generated list; first find out where the B* macros are +# defined: +# +# grep -r B115200 /usr/include +# +# Then generate the actual list: +# +# sed -ne '/^[ \t]*#define[ \t]*B[0-9][0-9]*/s,^.*B\([0-9][0-9]*\).*,\1,p' \ +# < /usr/include/asm-generic/termbits.h +# +# This one was generated on a Debian Stretch system, leaving out the "0" rate, +# which is synonymous to "hang-up". + +zstyle -a ":completion:${curcontext}:" baud-rates rates || + rates=( 50 75 110 134 150 200 300 600 + 1200 1800 2400 4800 9600 + 19200 38400 57600 + 115200 230400 460800 500000 576000 921600 + 1000000 1152000 1500000 2000000 2500000 3000000 3500000 4000000 ) + +if (( ${+opts[-u]} )) || (( ${+opts[-l]} )); then + local -i min max + min=${opts[-l]:-0} + max=${opts[-u]:-${${(On)rates}[1]}} + rates=( ${(M)rates:#${~:-<$min-$max>}} ) +fi + +if (( ${+opts[-f]} )); then + set -- $rates + rates=( ) + for item; do + ${opts[-f]} $item && rates+=( $item ) + done +fi + +tag=${opts[-t]:-baud-rate} +desc=${opts[-d]:-baud rate} + +# -1V removes dupes (which there shouldn't be) and otherwise leaves the +# order in the $rates array intact. +_wanted -1V $tag expl $desc compadd -a $expl -- rates -- 2.8.1