From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28398 invoked by alias); 30 Mar 2018 14:07:02 -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: List-Unsubscribe: X-Seq: 42569 Received: (qmail 27386 invoked by uid 1010); 30 Mar 2018 14:07:02 -0000 X-Qmail-Scanner-Diagnostics: from park01.gkg.net by f.primenet.com.au (envelope-from , uid 7791) with qmail-scanner-2.11 (clamdscan: 0.99.2/21882. spamassassin: 3.4.1. Clear:RC:0(205.235.26.22):SA:0(-1.4/5.0):. Processed in 13.04471 secs); 30 Mar 2018 14:07:02 -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.4 required=5.0 tests=BAYES_00, FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS, SPF_PASS,T_DKIM_INVALID,T_RP_MATCHES_RCVD autolearn=no autolearn_force=no version=3.4.1 X-Envelope-From: SRS0=g5DA=GU=yahoo.co.uk=okiddle@bounces.park01.gkg.net X-Qmail-Scanner-Mime-Attachments: | X-Qmail-Scanner-Zip-Files: | X-Virus-Scanned: by amavisd-new at gkg.net Authentication-Results: amavisd4.gkg.net (amavisd-new); dkim=pass (2048-bit key) header.d=yahoo.co.uk X-Greylist: domain auto-whitelisted by SQLgrey-1.8.0 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.co.uk; s=s2048; t=1522418804; bh=IL69feBGHu1hUeqcOta4OhROz4vC74wbDQTPHFR8nUA=; h=From:To:Subject:Date:From:Subject; b=EjGfoMCpIKNp3M0Rex43LXbUS3fnxZ1Ke/CTX7r80PIklRCpPcVdQraSqtJu6cu7OuZPhavx8syVQx38tyZmSEAgUuTYtb9HPDKmrHJL6SotqavqVEMuzWWFZ1WFvjf5pXMHTIwEJEJXgB69i1K48KCL90i9dtdzujlS2y2tqWHbh8XRgPAqAl7k7XDfwnze1douW6IMTCVc+6e0Yt61zs5YVTPlbE2ixCleEysbReFFSG5MH9VhQfIq7cbBlE/SO+G1baXcoFZkn9ijL/+TnesaHcD8rWzyvw5SgLoZfhlCPpBr3wczjCbqpq/BUf4u2sG+SlWHhLrmTqVifEO1Eg== X-YMail-OSG: vnS9zXMVM1lVJ.K39Qaxcq6hOKqryske6gbhB3buynWFOXjaf6IfATuhQneba_z g9S94463AnMjEnnlIPSC5Bq1xExXlKFuAgYovV_OsSmmwAjqyhWj9oKz5zb.ZTOEcNbGRAbIpSd9 JBu5swC33.2CJxP0Bkl_ELFlB7TApwjL7KU0Qt2hOrsqjzPSfUinP2sSHfMfKFnqNLmw.L5h_TA6 BlHU_ybk2oke9QU.GvVCV.befdTbr1A3J8nxoTnheRjYyZU1ZvyDCAzo.qAx5luY1JOTeYt.rYD_ GKyIIS0z6qk_5odorhNLEIN_NDx8zR44QiPoBM5dwvt4Btata78L43y531ZtQbU8E9SlEqu1WcxF 1_kLOWDIRb3UEXbj3j86FyRhXC2d4fVy6dLRGraw4Mz1st6QsSgloXjqCGpHce393bpTPNWh0..P JFaveuhYRX2XRYgxe7B6l6YSTxWpMa3pV4DmQpT8cZCIzTqlrSnUoNQR0TqCoiEca4TeO_pjRQbl msNg8lx.8mQ-- From: Oliver Kiddle To: Zsh workers Subject: PATCH: improve lsof completion MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-ID: <18133.1522405281.1@thecus> Date: Fri, 30 Mar 2018 12:21:21 +0200 Message-ID: <18134.1522405281@thecus> This handles completion of hostnames etc after the -i option to lsof and also the TCP states after -s. This just takes the basic states listed in the man page. A correct list might apparently be system specific. Options are all still up-to-date as of lsof 4.91. Oliver diff --git a/Completion/Unix/Command/_lsof b/Completion/Unix/Command/_lsof index bbb6eab59..86115a4ef 100644 --- a/Completion/Unix/Command/_lsof +++ b/Completion/Unix/Command/_lsof @@ -1,6 +1,6 @@ #compdef lsof -local curcontext="$curcontext" state line expl fields args +local curcontext="$curcontext" state line expl fields args alts suf hsuf pref ret=1 case $OSTYPE in linux*) args=( '-X[skip reporting of info on network connections]' ) ;; @@ -28,8 +28,8 @@ _arguments -C -s -S $args \ '+f[enable listing of kernel file structure info]::info type:(c f g G n)' \ '-F[select output fields]:fields:->fields' \ '-g[select by process group id]::process group id' \ - '*-i[select internet files]:address' \ - '-K[select listing of tasks of processes]' \ + '(*)*-i[select internet files]::address:->addresses' \ + '-K+[select listing of tasks of processes]::value:((i\:ignore\ tasks))' \ '-k[specify kernel name list file]:kernel file:_files' \ '-l[inhibit conversion of UIDs to user names]' \ '-L[list no link counts]' \ @@ -46,7 +46,7 @@ _arguments -C -s -S $args \ '-r[repeat listing endlessly]::delay (seconds)' \ '+r[repeat listing until no files listed]::delay (seconds)' \ '-R[list parent PID]' \ - '(-o)-s[list file size]' \ + '(-o)-s+[list file size or exclude TCP/UDP files by state]::state:->states' \ '-S[specify timeout for kernel functions that might deadlock]:timeout (seconds)' \ '-T[select reporting of TCP/TPI info]::info type:((q\:queue\ length\ reporting s\:state\ reporting w\:window\ size\ reporting))' \ '(+w -w)-t[terse output]' \ @@ -57,18 +57,52 @@ _arguments -C -s -S $args \ '(-t)+w[suppress warnings]' \ '(-t)-w[enable warnings]' \ '-x[cross filesystems/traverse symlinks with +d/+D]::type:((f\:filesystems s\:symlinks))' \ - '*:file:_files' && return + '*:file:_files' && ret=0 case $state in + addresses) + if compset -P 1 '*:'; then + _ports && ret=0 + else + if compset -P 1 '*@'; then + pref=() + else + pref=( -P @ ) + suf=( -qS @ ) + [[ $PREFIX = (#i)(4|6|tcp|udp)* ]] || alts=( 'ip-versions:IP version:(4 6)' ) + compset -P '[46]' + alts+=( 'protocols:protocol:compadd $suf -M 'm:{a-z}={A-Z}' TCP UDP' ) + fi + if compset -S '@*'; then + suf=() + else + hsuf=( -qS : ) + compset -S ':*' && hsuf=() + alts+=( "hosts:host:_hosts $pref $hsuf" ) + fi + + _alternative $alts && ret=0 + fi + ;; fields) fields=( ${${${${(f)"$($words[1] -F \? 2>&1)"}[2,-1]#??}// ##/:}:#(#s)[${PREFIX:-:}]:*} ) compset -P '*' - _describe -t fields "field" fields -S '' && return + _describe -t fields "field" fields -S '' && ret=0 ;; filedes) _sequence -s , _wanted -x file-descriptors expl "file descriptor" compadd - \ - cwd err jld ltz mem mmap pd rtd tr txt v86 && return + cwd err jld ltz mem mmap pd rtd tr txt v86 && ret=0 + ;; + states) + if compset -P 1 '*:'; then + _sequence _wanted states expl state compadd - -M 'm:{a-z}={A-Z}' \ + CLOSED IDLE BOUND LISTEN ESTABLISHED SYN_SENT SYN_RCDV ESTABLISHED \ + CLOSE_WAIT FIN_WAIT1 CLOSING LAST_ACK FIN_WAIT_2 TIME_WAIT && ret=0 + else + compset -S ':*' || suf=( -qS : ) + _wanted protocols expl protocol compadd $suf -M 'm:{a-z}={A-Z}' TCP UDP && ret=0 + fi ;; esac -return 1 +return ret