From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 8379 invoked by alias); 15 Jun 2018 15:14:26 -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: 43024 Received: (qmail 8972 invoked by uid 1010); 15 Jun 2018 15:14:25 -0000 X-Qmail-Scanner-Diagnostics: from mail-it0-f66.google.com 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(209.85.214.66):SA:0(-1.9/5.0):. Processed in 1.173624 secs); 15 Jun 2018 15:14:25 -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,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_PASS,T_DKIMWL_WL_MED,T_DKIM_INVALID autolearn=ham autolearn_force=no version=3.4.1 X-Envelope-From: dana@dana.is X-Qmail-Scanner-Mime-Attachments: | X-Qmail-Scanner-Zip-Files: | DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dana-is.20150623.gappssmtp.com; s=20150623; h=mime-version:subject:from:in-reply-to:date:cc :content-transfer-encoding:message-id:references:to; bh=v/TCR6cS0HWowq63LW7c+50/MJC+NQecnFQ3e0s/YIU=; b=dt7anOgWLBQOd7ZZzQ7NRh7dtG2P8NRfVd4kikeHGUt9vSaoo5f0674G6kvqzm/ntG Mtyst+uf83K5P+YNcjbd2vmICcIH8L5ybGYVqnRd3jKJ2JL/xL2SG4ZV8jX/KBZN0dxm OiVAsizFiNT32Y1mY6jSHAUzc9UTbmGTGzhWoVsjwXMys7NVbXKB7TfqHKjH1WS8XC6K Kg9YmXdZujuUhPm6Mtj6jSFsfNSLjRNsPmlnYDl23A4q/AanLozHH2AaojyIefoiWoBO 62RDRqWDH9/HEm9BhWDBNhy1I+6DyaEzf/y1AIRyhSHLPmRofpZhm51HDSwT2ihYuJNX lDPg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:subject:from:in-reply-to:date:cc :content-transfer-encoding:message-id:references:to; bh=v/TCR6cS0HWowq63LW7c+50/MJC+NQecnFQ3e0s/YIU=; b=FdhGd0p6FuH0LrKoJe9tONgwQ8N1kL8DWeu4yVN2wJir21bIMYqKVhnAIriAWn/Guk 2+uAxKtsRuwlMUbSDiuJxtMnTrrSq9Y33DTBMWIW5CYVnnnXjy9mh409d2RdKi8ghvMf jnkcZssu4xeFzL1mhT6EYOUvoZjubk/nGgE+kuHBkvvE/e43FnRFfQkd43joonWYaLWi rZtrn4p2whPEHK12WHllW/s8Y+hVUEHIdT5OwwDsK4rbSbKmkXTF9LfPUuDzLrQi7j5A oyhgqJSiB5wnxYkLwI8gdKLv1cLPVM491QKvWD0HDayhx6ROce7a11ZlvFhieBElKY+1 JTdg== X-Gm-Message-State: APt69E3t5zIVdrBEfQRwY7e+KBBRlUHN2AhusPSXYgHE6pOkiNLznOQ7 BeFsftQkiAHd/K2Qy4nKOJepYA== X-Google-Smtp-Source: ADUXVKJHf4KAI+GS6+2+tdYK6qOafYkXJNPiuJ+27wv+RkHUZh1wtTtCHjU8mq8fD3Zc1ia4tWj66Q== X-Received: by 2002:a24:52cb:: with SMTP id d194-v6mr1752347itb.46.1529075662251; Fri, 15 Jun 2018 08:14:22 -0700 (PDT) Content-Type: text/plain; charset=utf-8 Mime-Version: 1.0 (Mac OS X Mail 11.3 \(3445.6.18\)) Subject: Re: [PATCH] Completion: Improve _man (3) From: dana In-Reply-To: <20180615145536.phgtjn4hnxvbumn4@tarpaulin.shahaf.local2> Date: Fri, 15 Jun 2018 10:14:20 -0500 Cc: Mikael Magnusson , Zsh workers Content-Transfer-Encoding: quoted-printable Message-Id: <82F9135C-C057-4FC8-A482-70923E7F1739@dana.is> References: <9B2A476B-3C9F-4757-9818-4815A9417253@dana.is> <17923.1528636054@thecus> <2BD8008C-D6F4-4B4A-AF05-7EE80ADB0E47@dana.is> <20180614095001.v33idyjczkouva6n@tarpaulin.shahaf.local2> <53F42356-22E5-453F-9A61-25E71AFAC3BF@dana.is> <1529071515.3847618.1409229080.29BD5216@webmail.messagingengine.com> <64E31285-3F41-4F38-8E70-A42F2F2735AD@dana.is> <20180615145536.phgtjn4hnxvbumn4@tarpaulin.shahaf.local2> To: Daniel Shahaf X-Mailer: Apple Mail (2.3445.6.18) On 15 Jun 2018, at 09:39, Mikael Magnusson wrote: >Please don't use () for 1 {} a b c style loops in actual scripts, it >is not guaranteed to work. Someone on IRC told me it was safe :( Fixed though On 15 Jun 2018, at 09:47, Daniel Shahaf wrote: >This lists utime(2), utime(3), utf8(3perl), utf8(7), and = utime.h(7posix), among >others. Should there be separate groups for each section, i.e., one = group for >each of (2 3 3perl 7 7posix)? (This is orthogonal to dana's patch.) Is your system set up so that each of those sub-sections has its own = directory, or are they pooled together into (in this case) 3 and 7? =46rom my own = testing, they should be grouped separately in the former case, but not in the = latter due to the fact that (sub-)sections to complete are derived from the names = of the directories rather than the files. That could be changed (in fact, assuming it introduces no inaccuracies, = i think it'd be preferable), but it would require reworking the _man_pages = stuff, since we don't know the page names until we get to the bottom of that = function. I'll think about that. On 15 Jun 2018, at 09:55, Daniel Shahaf wrote: >Now that you mention it, I think completion functions may not use = shortloops >syntax: compinit doesn't reset that option. I'd considered that, but that syntax doesn't seem to be affected by = short_loops. That's why i thought it'd be OK. On 15 Jun 2018, at 09:55, Daniel Shahaf wrote: >That _still_ leaves us with a =C2=ABfor 1=C2=BB loop, which I'm not = actually sure is a >documented syntax, but it's useful enough that I'd welcome a regression = test >for it. Do you mean using 1 as the parameter name, or using for loops without = the `in ...` bit? The latter is specified by POSIX. Unrelated, but i noticed an issue as i was testing. Maybe this is = another case of me fixing something that actually needs to be a certain way, but, = with the current function, if i create a page test.1dana and then do `man 1d = ` i get a bunch of results like this: perl5101delta perl5121delta perl5141delta ... That doesn't seem desirable, does it? Is there any reason the glob = pattern shouldn't be restricted to *.$sect* (*.1d*) rather than *$sect* (*1d*)? = The only issue i can think of is that a few systems (like IRIX i believe) don't = put the (sub-)section in the file name at all, but those should already be = broken, so... Anticipating that the answer is no, i've added the dot in the attached = patch =E2=80=94 let me know if it seems like a bad choice, though. dana diff --git a/Completion/Unix/Command/_man b/Completion/Unix/Command/_man index 11c2fab7f..7fd92bac5 100644 --- a/Completion/Unix/Command/_man +++ b/Completion/Unix/Command/_man @@ -4,6 +4,11 @@ # - Solaris is seemingly the only OS that doesn't allow the `man n = page` syntax; # you must use `man -s n page` # - We assume that Linux distributions are using either man-db or = mandoc +# - @todo Would be nice to support completing the initial operand as a = section +# name (on non-Solaris systems) +# - @todo We don't support the man-db syntax .
(e.g., = `ls.1`) +# - @todo We don't support the man-db feature of 'sub-pages' =E2=80=94 = that is, treating +# pairs of operands like `git diff` as `git-diff` # - @todo Option exclusivity isn't super accurate # - @todo Solaris man accepts a single hyphen as the first option to = disable # paging (like AIX's -c); we don't support that @@ -220,7 +225,15 @@ _man() { elif [[ $variant =3D=3D (dragonfly|freebsd)* ]] && (( $+opt_args[-S] = )); then noinsert=3D1 sect=3D${opt_args[-S]//:/|} - elif (( CURRENT > 1 )) && [[ $variant !=3D solaris* ]]; then + # It's only a small help, but, per man-db, we can avoid treating an = initial + # operand like `8139too` as a section name by ensuring that only the = first + # character is a digit. This doesn't do much for stuff like `2to3`, = but we can + # at least special-case a few common patterns for now + elif + (( CURRENT > 1 )) && + [[ $variant !=3D solaris* ]] && + [[ ${${(Q)words[1]}##(2to3|7z)*} =3D=3D = ([0-9](|[^0-9[:punct:]]*)|[lnopx]) ]] + then noinsert=3D1 sect=3D$words[1] elif [[ -n ${sect:=3D$MANSECT} ]]; then @@ -232,7 +245,25 @@ _man() { =20 if [[ $sect =3D (<->*|[lnopx]) || $sect =3D *\|* ]]; then sects=3D( ${(s.|.)sect} ) - dirs=3D( $^_manpath/(sman|man|cat)${^sects}(|.*)/ ) + + # Most man implementations support partial matching of a page's + # (sub-)section name =E2=80=94 e.g., `3per` for `3perl`. The = (sub-)section name may + # or may not correspond to the directory name (most systems combine + # sub-sections), but we'll assume that if it starts with a number = and we're + # not on Solaris (which doesn't support this feature at all) that = we can do + # a match against the leading number. This is irritating if you DO = want the + # exact sub-section specified, but unfortunately there's no way to = determine + # this programmatically =E2=80=94 i guess we could add a style to = control it + () { + for 1; do + if [[ $OSTYPE =3D=3D solaris* || $1 !=3D <->* ]]; then + dirs+=3D( $^_manpath/(sman|man|cat)$1(|.*)/ ) + else + dirs+=3D( $^_manpath/(sman|man|cat)${1%%[^0-9]#}*/ ) + fi + done + } $sects + sect=3D${(j<|>)sects} [[ $sect =3D=3D *'|'* ]] && sect=3D"($sect)" awk=3D"\$2 =3D=3D \"$sect\" {print \$1}" @@ -281,7 +312,7 @@ _man() { 8 'maintenance commands and procedures' 9 'kernel features' 9lua 'Lua kernel bindings' # NetBSD - l 'local documentation' # AIX, etc. + l 'local documentation' # AIX, etc. =E2=80=94 TCL on some = systems? n 'new documentation' # AIX, etc. o 'old documentation' # AIX, etc. p 'public documentation' # AIX, etc. @@ -380,14 +411,14 @@ _man_pages() { local pages sopt =20 # What files corresponding to manual pages can end in. - local suf=3D'.((?|<->*|ntcl)(|.gz|.bz2|.Z|.lzma))' + local suf=3D'.((?|<->*|ntcl)(|.gz|.bz2|.z|.Z|.lzma))' =20 if [[ $PREFIX$SUFFIX =3D */* ]]; then # Easy way to test for versions of man that allow file names. # This can't be a normal man page reference. # Try to complete by glob first. if [[ -n $sect_dirname ]]; then - _path_files -g "*.*$sect_dirname*(|.gz|.bz2|.Z|.lzma)" "$expl[@]" + _path_files -g "*.*$sect_dirname*(|.gz|.bz2|.z|.Z|.lzma)" = "$expl[@]" else _path_files -g "*$suf" "$expl[@]" && return _path_files "$expl[@]" @@ -396,7 +427,7 @@ _man_pages() { fi =20 pages=3D( ${(M)dirs:#*$sect_dirname/} ) - pages=3D( ${^pages}/"*$sect${sect:+"*"}" ); + pages=3D( ${^pages}/"*${sect:+.$sect"*"}" ) pages=3D( ${^~pages}(N:t) ) =20 (($#mrd)) && pages[$#pages+1]=3D($(awk $awk $mrd))