From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-3.4 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED,UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 18255 invoked from network); 24 Feb 2021 14:24:59 -0000 Received: from zero.zsh.org (2a02:898:31:0:48:4558:7a:7368) by inbox.vuxu.org with ESMTPUTF8; 24 Feb 2021 14:24:58 -0000 ARC-Seal: i=1; cv=none; a=rsa-sha256; d=zsh.org; s=rsa-20200801; t=1614176699; b=ZBeLFOcVoZoB4VUjUCm+cqtCnIMlg+GKdUuv9UJfPQgeV+H2T7hTpX+ZhT3tcI8KeXzvGj9nbN Ig8TM+MidQ87vmpyvQVPvSUP76qg6d2oW8bdjreI2oYs8t6Gg7CJ8guD50/pVhB2eNBhmvL3By iyZnV06gBTMUGhZqQ/JoThiLxuLfU9t++ahud7RcENmJ1dD6TOmYCy+4rv8xa45W66cwztgnNp 3W9x1rH3kBB5OsD9i6d7b/c/RZhBTHRhslOngaW33XL5hDmIHoI/ZJZWl/6eJw5VkY4JnOaCfM CRzgvRogt3Ymp0xQ8gXTBXa76REexxim/z9udzUkhJaGAg==; ARC-Authentication-Results: i=1; zsh.org; iprev=pass (wout5-smtp.messagingengine.com) smtp.remote-ip=64.147.123.21; dkim=pass header.d=daniel.shahaf.name header.s=fm2 header.a=rsa-sha256; dkim=pass header.d=messagingengine.com header.s=fm2 header.a=rsa-sha256; dmarc=none header.from=daniel.shahaf.name; arc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed; d=zsh.org; s=rsa-20200801; t=1614176699; bh=jPynE6g/QxHmDrpOyOr70/Jy+LPpWmDaak3fPq7DLlk=; h=List-Archive:List-Owner:List-Post:List-Unsubscribe:List-Subscribe:List-Help: List-Id:Sender:In-Reply-To:Content-Transfer-Encoding:Content-Type: MIME-Version:References:Message-ID:Subject:Cc:To:From:Date:DKIM-Signature: DKIM-Signature:DKIM-Signature; b=SWu//MRA7WruKr0YvT5rlFCNM/8nb5I8bTP38crWfb1r11yXuQoCeeyH+NL4Qc1EsatCsOd0Za GQwrsoDGnTqYHwSMarQGhEdgCjXq4NoDEKrVJnQdjNnzhKZy0V1gXVwXfzEe7BJdKlcn++bu1H gvN4n+XYKk8w0zY3cecTud3Vwm9cNwM5s/Nezv6fliKIiTGZKC9yYWvJGcgDFqXBNkoFLYW1Sb hNeg8BG5EaJovjqKWZAGNsS2VO+gNrpzd1HQ+h8chOz7fHH8m1m2Oab5fAL3bgqL25i1gb47eh dNv9XAtuUrs+giXqtUmi9YXHT1jHEfFUdKDkSDQtTTNhEQ==; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=zsh.org; s=rsa-20200801; h=List-Archive:List-Owner:List-Post:List-Unsubscribe: List-Subscribe:List-Help:List-Id:Sender:In-Reply-To:Content-Transfer-Encoding :Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date: Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender :Resent-To:Resent-Cc:Resent-Message-ID; bh=+AjMjZhVO5FpArEPBjs2v+LpmTsvO8Lq454eNB21zMY=; b=lCyfjzkssIutYicYfm7ZHSJnOX /cJQWzqF1cuBLDHScNUSNx+4Xyt/M2BC6FNtl1jstlvxIMXmZ3pkygd/r7OUkAaRidiSvYtqO0I6D zq0BCFMpRtYOwaxRb40l4ElGLCfqEIWEod2OugrOs7vEhP6JBmQX6Nk5nm4GqfProVDYhMsrq/KKI LQKbiZkpBzHfoWyDM15ro9sEYI0XscN0t9wEHZffKyLhL3eogyYPTPqeTfG9sYVmvGwQvWcIjGEZZ hCK0ogvpTs8b67trGJViJFkKZlDBvZYtkjaVBGmN6OAJSVpGGdZmvWcnfkbFsMqJjDJf6EXf3KOA6 9Dq9+jXg==; Received: from authenticated user by zero.zsh.org with local id 1lEv60-000Eeh-Ap; Wed, 24 Feb 2021 14:24:56 +0000 Authentication-Results: zsh.org; iprev=pass (wout5-smtp.messagingengine.com) smtp.remote-ip=64.147.123.21; dkim=pass header.d=daniel.shahaf.name header.s=fm2 header.a=rsa-sha256; dkim=pass header.d=messagingengine.com header.s=fm2 header.a=rsa-sha256; dmarc=none header.from=daniel.shahaf.name; arc=none Received: from wout5-smtp.messagingengine.com ([64.147.123.21]:55785) by zero.zsh.org with esmtps (TLS1.3:TLS_AES_256_GCM_SHA384:256) id 1lEv5m-000EVL-PV; Wed, 24 Feb 2021 14:24:43 +0000 Received: from compute3.internal (compute3.nyi.internal [10.202.2.43]) by mailout.west.internal (Postfix) with ESMTP id 3ABC9A30; Wed, 24 Feb 2021 09:24:41 -0500 (EST) Received: from mailfrontend2 ([10.202.2.163]) by compute3.internal (MEProxy); Wed, 24 Feb 2021 09:24:41 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= daniel.shahaf.name; h=date:from:to:cc:subject:message-id :references:mime-version:content-type:content-transfer-encoding :in-reply-to; s=fm2; bh=+AjMjZhVO5FpArEPBjs2v+LpmTsvO8Lq454eNB21 zMY=; b=F/xWEBWVJu2mXhXEGtdCy3GubkY55ylS9+K1H8qAG5fqcArkfACFwB6D iEQp7KHeo6Kn6FyObeEqSRCwe1dqTRSAJc4OpAD0N9ffuBH10/sJbzBeugRXxXgn OhWazweV0MFfEF29EluEpULl46CSYox+0HoEBcixKsZ5g/uW5onAL/JFvPP31VwS 1uQnK9guhHlJslRmh8O/cQ9SPatgnoqddgTy84CNptVJ05lNto2ew/47NosbpjU5 M1wtMs3iilZm5luyTvwvn2GOXHaVam6wqGzh6M28rLEmH5ecUXiWJuC1iA7FY/CK 1Ex/LZF0Cwf2sm3K5/4dTZvprZcq3Q== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:content-type :date:from:in-reply-to:message-id:mime-version:references :subject:to:x-me-proxy:x-me-proxy:x-me-sender:x-me-sender :x-sasl-enc; s=fm2; bh=+AjMjZhVO5FpArEPBjs2v+LpmTsvO8Lq454eNB21z MY=; b=K/b26yM7dnOXJLd4GbrJvomK5FOyVFlRlf+WE9+fa+WgFgiFBLh5XrrzN fGTw0B4xWICaWiKnYGTw9NEMFWRXh+Rdka+rFCHDzh7Mfz0xl6wca/xXJ9bKyzHJ dtLKEUc+S00oTJSDuGnsiX4i4vlyT48LAoKrnvsBxkyZrb4lRuYWevOpF+gBzZEV rrVim6qorEFLChd6Bwn31f4VQvxqGs/2Mk81loijhJEOAF7lmR+5wcRhY1hKsZFS k8wC49YvO0h3swVM/fjttPmSlkAaCaf3kTre/4Ja0p/96gCe3dwuCCx44gJid0Ix kTV8Abau+5DsJnVYjPZLv+uCJSFLg== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduledrkeejgdeifecutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpeffhffvuffkfhggtggugfgjfgesthektddttderjeenucfhrhhomhepffgrnhhi vghlucfuhhgrhhgrfhcuoegurdhssegurghnihgvlhdrshhhrghhrghfrdhnrghmvgeqne cuggftrfgrthhtvghrnhepgfekgfefjefgvddvgfdutdelleekvdefteeitdduhfevveev udfhvdevfeefvdeunecukfhppedutdelrdeiiedrfedvrddujedvnecuvehluhhsthgvrh fuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomhepugdrshesuggrnhhivghlrdhs hhgrhhgrfhdrnhgrmhgv X-ME-Proxy: Received: from tarpaulin.shahaf.local2 (bzq-109-66-32-172.red.bezeqint.net [109.66.32.172]) by mail.messagingengine.com (Postfix) with ESMTPA id 68F171080054; Wed, 24 Feb 2021 09:24:39 -0500 (EST) Received: by tarpaulin.shahaf.local2 (Postfix, from userid 1005) id 4Dlyq918ltzwp; Wed, 24 Feb 2021 14:24:37 +0000 (UTC) Date: Wed, 24 Feb 2021 14:24:37 +0000 From: Daniel Shahaf To: Jacob Gelbman Cc: zsh-workers@zsh.org Subject: Re: Completion script for the ctags program Message-ID: <20210224142437.GC9342@tarpaulin.shahaf.local2> References: <31598-1614116362.902856@aI-l.maGv.3QD7> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.10.1 (2018-07-13) X-Seq: 48110 Archived-At: X-Loop: zsh-workers@zsh.org Errors-To: zsh-workers-owner@zsh.org Precedence: list Precedence: bulk Sender: zsh-workers-request@zsh.org X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: Jacob Gelbman wrote on Wed, Feb 24, 2021 at 01:20:24 -0600: > #compdef ctags apt-file(1) on Debian stable shows a few more names: arduino-ctags: /usr/bin/arduino-ctags emacs-bin-common: /usr/bin/ctags.emacs emacs-bin-common: /usr/bin/etags.emacs exuberant-ctags: /usr/bin/ctags-exuberant universal-ctags: /usr/bin/ctags-universal xemacs21-bin: /usr/bin/etags.xemacs21 I assume at least some of these should be added to the #compdef line. Would you do the honours? > "--alias-=[add a pattern detecting a name, can be used as an alt name for lang]:pattern" As Oliver said, literal angle brackets in the option name to be completed aren't especially helpful. In fact, I'll go as far as to say I don't want users to run into it in released code. Please change them. You can use _call_program with --list-languages to generate the right set of option names dynamically. > elif [ "$_ctags_type" = "exuberant" ]; then > arguments=( > "-a[append to tags file]" > "-B[use backward searching patterns (?...?)]" > "-e[output tag file for use with emacs]" > "-f[write tags to specified file. - is stdout]:file:_files" Is the argument to the -f option allowed to be pasted to it? If so, s/-f/-f+/. Also, s/:file:/:output file:/. That part of the string is a user-facing message, so the extra detail is helpful. Also, you can drop the "- is stdout" part. The descriptions are only a summary of the functionality; they aren't meant to be a complete copy of the manual. > "-F[use forward searching patterns (/.../)]" > "-h[specify list of file extensions to be treated as include files]:" Write something after the colon. > "-I[a list of tokens to be specifically handled is read from either the command line or the specified file]:" The thing in brackets doesn't describe the action of the option. Please edit. > "-L[a list of input file names is read from the specified file. - is stdin]:file:_files" Rephrase in the imperative. > "-R[equivalent to --recurse]" This is normally rendered as: '(-r --recurse)'{-R,--recurse}'[description]' > "--fields=[include selected extension fields (flags afmikKlnsStz)]:flags" Recommend to move the afmikKlnsStz thing to after the colon, so it'll be shown at a more appropriate point. Also, it would be helpful to display descriptions to the flags using, e.g., «compset» (for the leading plus sign) followed by «_values -s ''». > "--file-scope=[should tags scoped only for a single file be included in output]:bool:(yes no)" > "--filter=[behave as a filter, reading file names from stdin and writing tags to stdout]:bool:(yes no)" > "--filter-terminator=[specify string to print to stdout following the tags for each file parsed when --filter is enabled]:string" > "--format=[force output of specified tag file format]:level" > "--help[help text]" "help text" is just a noun phrase. Please use complete decsriptions. Please use exclusions if needed («'(--foo)--bar[baz]'»). > "--language-force=[force all files to be interpreted using specified language]:language:->language" > "--languages=[restrict files scanned to these comma-separated languages]:language:->languages" Can't say I'm a fan of having two states that differ by a single letter, but so be it. > "--recurse=[recurse]:bool:(yes no)" Fix the bracketed description. > _arguments $arguments Pass any arguments to _arguments that may be needed (for instance, -s). > if [[ "$state" = language* ]]; then > local -a languages > languages=(`ctags --list-languages | cut -d" " -f1`) Use _call_program and $service. > if [ "$state" = "language" ]; then > _wanted languages expl language compadd $languages Don't pass unsanitized command output to a builtin. In this case, «compadd -a languages» would do. > elif [ "$state" = "languages" ]; then > _values -s , languages $languages Don't pass unsanitized command output to a builtin. I don't know the fix off the top of my head. Thanks for the patch, and especially for adding exubertant and BSD ctags support! Daniel > > > > > > On Feb 23, 2021, at 10:45 PM, Jacob Gelbman wrote: > > > > Hey, thanks for looking at the script and adding it to the repo, although I think some of got pasted in wrong. There’s a lot to writing completion functions and I’m still not 100% sure how to do it right. > > > >> On Feb 23, 2021, at 3:39 PM, Oliver Kiddle wrote: > >> > >> Jacob Gelbman wrote: > >>> I wrote a completion script for the ctags program. Someone might be able to use it: > >> > >> Which ctags!? > > > > I have Universal Ctags 5.9.0 > > > >> This doesn't match what I have installed on any of my systems. There > >> are multiple implementations of ctags, with it often being just a link > >> to etags - for which there is a completion albeit not a well maintained > >> one. One of the main reasons, a completion doesn't already exist is > >> that it would ideally need to detect the variant and at least have sane > >> fallbacks for variants that aren't handled. It could be useful to check > >> what the existing _etags is handling - that might be the exhuberant or > >> emacs variant. > >> > > > > I located a few other ctags on my computers, I have BSD ctags that comes by default on the mac. Exuberant Ctags 5.8. and there’s etags that comes with emacs. I can probably add an if statement based on the output of ctags —version, and modify the function from that. If it’s etags, I’ll just: > > > > _comps[ctags]=“_etags”; _etags > > > > And exit. > > > >> In general, please follow the conventions outlined in > >> Etc/completion-style-guide in the zsh source distribution. For example, > >> completion functions usually use just 2 spaces for indentation. > >> > >>> #compdef ctags > >>> > >>> local state > >> > >> If you use states, you need to also handle the context which means > >> either passing -C to _arguments and setting up $curcontext or declaring > >> context local and passing it to later functions like _values. > > > > The -C argument and the context/curcontext variables are confusing me, a lot. > > > >> > >>> "--alias-=[add a pattern detecting a name, can be used as an alt name for lang]:pattern" \ > >>> "--input-encoding-=[specify encoding of the input files]:encoding" \ > >>> "--kinddef-=[define new kind for ]:kind" \ > >>> "--kinds-=[enable/disable tag kinds for ]:kind" \ > >> > >> These would not complete especially helpfully. I suspect that there is > >> supposed to be substituted. > > > > They’d show up in the menu when you press tab, but if I filled in the actual values, the list would be too long. > > > >> > >>> if [ "$state" = "language" ]; then > >>> compadd `ctags --list-languages | cut -d" " -f1` > >> > >> It would be nicer to use a description by calling for example, _wanted > >> here. > > > > I can do that. > > > >> > >>> elif [ "$state" = "languages" ]; then > >>> _values -s , "languages" `ctags --list-languages | cut -d" " -f1` > >>> fi > >> > >> I'd probably use _sequence here as it is smaller and simpler. But > >> _values is fine if none of the languages contain characters that need > >> quoting from it. > > > > This too. > > > >> > >> The return status from this function will not be correct in all cases. > >> This can have effects like approximate completion being activated > >> despite matches having been added by earlier completers. Where states > >> are needed, you nearly always need to either save the status from > >> _arguments, typically via a ret variable or check $compstate[nmatches] > >> on exit. > >> > >> Oliver > > > >