From: Jacob Gelbman <gelbman@gmail.com>
To: Daniel Shahaf <d.s@daniel.shahaf.name>
Cc: zsh-workers@zsh.org
Subject: Re: Completion script for the ctags program
Date: Thu, 11 Mar 2021 11:08:05 -0600 [thread overview]
Message-ID: <742BD09C-6FE4-4B89-9B8F-824FB67EDEED@gmail.com> (raw)
In-Reply-To: <20210311161552.GA9181@tarpaulin.shahaf.local2>
[-- Attachment #1: Type: text/plain, Size: 1130 bytes --]
> On Mar 11, 2021, at 10:15 AM, Daniel Shahaf <d.s@daniel.shahaf.name> wrote:
>
> Daniel Shahaf wrote on Sun, Mar 07, 2021 at 22:10:56 +0000:
>> Jacob Gelbman wrote on Sun, 07 Mar 2021 21:57 +00:00:
>>>> On Mar 7, 2021, at 3:42 PM, Daniel Shahaf <d.s@daniel.shahaf.name> wrote:
>>>> Jacob Gelbman wrote on Sun, 07 Mar 2021 19:18 +00:00:
>>>>>>> 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.
>>>>
>>>> This point has been neither responded to nor implemented.
>>>
>>> I sanitize the output a little bit, by cutting just the first word from
>>> the list that’s returned. That fixes lines like "OldC++ [disabled]" And
>>> I’m not that worried about possibly feeding in incorrectly formatted
>>> data. What’s the worst that could happen? The listing will look messed
>>> up?
>>
>> An option flag could be injected from an external command into compadd. [...]
>
> Do you intend to send a revised patch to address this?
Yes, here it is:
[-- Attachment #2: ctags.txt --]
[-- Type: text/plain, Size: 13176 bytes --]
#compdef ctags arduino-ctags ctags-exuberant ctags-universal
local context state line expl
local -A opt_args
local -a arguments
if [ -z "$_ctags_type" ]; then
local output=`ctags --version 2>&1`
if [[ "$output" = *Universal\ Ctags* ]]; then
_ctags_type="universal"
elif [[ "$output" = *Exuberant\ Ctags* ]]; then
_ctags_type="exuberant"
elif [[ "$output" = *usage:\ ctags* ]]; then
_ctags_type="bsd"
elif [[ "$output" = *Emacs* ]]; then
_ctags_type="etags"
else
_ctags_type="universal"
fi
fi
if [ "$_ctags_type" = "etags" ]; then
_etags
return $?
fi
_ctags_languages() {
_call_program languages $service --list-languages | sed -n 's/^\([A-Za-z][A-Za-z0-9#_+]*\).*/\1/p'
}
if [[ "$PREFIX" = --alias-*=* ]]; then
_message pattern
return 1
elif [[ "$PREFIX" = --extras-*=* ]]; then
_message flags
return 1
elif [[ "$PREFIX" = --fields-*=* ]]; then
_message flags
return 1
elif [[ "$PREFIX" = --input-encoding-*=* ]]; then
_message encoding
return 1
elif [[ "$PREFIX" = --kinddef-*=* ]]; then
_message kind
return 1
elif [[ "$PREFIX" = --kinds-*=* ]]; then
_message kind
return 1
elif [[ "$PREFIX" = --map-*=* ]]; then
_message pattern
return 1
elif [[ "$PREFIX" = --mline-regex-*=* ]]; then
_message pattern
return 1
elif [[ "$PREFIX" = --param-*=* ]]; then
_message argument
return 1
elif [[ "$PREFIX" = --regex-*=* ]]; then
_message pattern
return 1
elif [[ "$PREFIX" = --roles-*.*=* ]] then
_message role
return 1
elif [[ "$PREFIX" = --roles-*.* ]] then
_message kind
return 1
fi
if [ "$_ctags_type" = "universal" ]; then
arguments=(
"-a[append to tags file]"
"-B[use backward searching patterns (?...?)]"
"-D[give definition for macro]:macro definition:"
"-e[output tag file for use with emacs]"
{-f+,-o+}"[write tags to specified file]:output file:_files"
"-F[use forward searching patterns (/.../)]"
"-h[specify a list of file extensions to be treated as include files]:extensions"
"-I[specify a list of tokens to be specially handled]:identifier list"
"-L[read a list of input file names from the specified file]:input file:_files"
"-n[equivalent to --excmd=number]"
"-N[equivalent to --excmd=pattern]"
"(--recurse -R)--recurse=-[search files recursively]::bool:(yes no)"
"(--recurse -R)-R[search files recursively]"
"-u[equivalent to --sort=no]"
"-x[print a tabular cross reference file to stdout]"
"--alias--[add a pattern detecting a name, can be used as an alt name for lang]:language:->languageequals"
"--append=-[should tags be appended to existing tag file]:bool:(yes no)"
"--etags-include=-[include reference to file in emacs style tag file]:file:_files"
"--exclude=-[exclude files and directories matching pattern]:pattern"
"--exclude-exception=-[don't exclude files and directories matching pattern even if they match the pattern specified with --exclude]:pattern"
"--excmd=-[uses the specified type of ex command to locate tags]:ex command type:(number pattern mix combine)"
"--extras=-[include extra tag entries for selected information]:flags (fFgpqrs)"
"--extras--[include <lang> own extra tag entries for selected information]:language:->languageequals"
"--fields=-[include selected extension fields]:flags (aCeEfFikKlmnNpPrRsStxzZ)"
"--fields--[include selected <lang> own extension fields]:language:->languageequals"
"--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"
"(--guess-language-eagerly -G)"{--guess-language-eagerly,-G}"[guess the language of input file more eagerly]"
{--help,-?}"[display help text]"
"--help-full[display help text with experimental features]"
"--if0=-[should code within #if 0 conditionals be parsed]:bool:(yes no)"
"--input-encoding=-[specify encoding of all input files]:encoding"
"--input-encoding--[specify encoding of the <lang> input files]:language:->languageequals"
"--kinddef--[define new kind for <lang>]:language:->languageequals"
"--kinds--[enable/disable tag kinds for <lang>]:language:->languageequals"
"--langdef=-[define a new language to be parsed with regular expressions]:name"
"--langmap=-[override default mapping of language to input file extension]:maps"
"--language-force=-[force all files to be interpreted using specified language]:language:->language"
"--languages=-[restrict files scanned to these comma-separated languages]:language:->languages"
"--license[print details of software license]"
"--line-directives=-[should #line directives be processed]:bool:(yes no)"
"--links=-[indicate whether symlinks should be followed]:bool:(yes no)"
"--list-aliases=-[list of alias patterns]:language:->language"
"--list-excludes[list of exclude patterns for files/dirs]"
"--list-extras=-[list of extra tag flags]:language:->language"
"--list-features[list of compiled features]"
"--list-fields=-[list of fields]:language:->language"
"--list-kinds=-[list of all tag kinds for lang]:language:->language"
"--list-kinds-full=-[list details of all tag kinds for lang]:language:->language"
"--list-languages[list of supported languages]"
"--list-map-extensions=-[list of language extensions in mapping]:language:->language"
"--list-map-patterns=-[list of language patterns in mapping]:language:->language"
"--list-maps=-[list of language mappings (both extensions and patterns)]:language:->language"
"--list-mline-regex-flags[list of flags which can be used in a multiline regex parser definition]"
"--list-params=-[list of language parameters. works with --machinable]:language:->language"
"--list-pseudo-tags[list of pseudo tags]"
"--list-regex-flags[list of flags which can be used in a regex parser definition]"
"--list-roles=-[list of all roles of tag kinds specified for langs]:language:->language"
"--list-subparsers=-[list of subparsers for the base lang]:language:->language"
"--machinable=-[use tab separated representation in --list-* output]:bool:(yes no)"
"--map--[set, add(+), or remove(-) the map for <lang>]:language:->languageequals"
"--maxdepth=-[specify maximum recursion depth]:depth"
"--mline-regex--[define multiline regex for locating tags in <lang>]:language:->languageequals"
"--options=-[specify file (or dir) from which command line options should be read]:file:_files"
"--options-maybe=-[same as --options but doesn't error]:file:_files"
"--optlib-dir=-[add or set dir to optlib search path]:dir:_files -/"
"--output-encoding=-[the encoding to write the tag file in]:encoding"
"--output-format=-[specify the output format]:format:(u-ctags e-ctags etags xref)"
"--param--[set <lang> specific parameter]:language:->languageequals"
"--pattern-length-limit=-[cutoff patterns of tag entries after N characters]:number"
"--print-language[don't make tags file but just print the guessed lang name for input file]"
"--pseudo-tags=-[enable/disable emitting pseudo tag named ptag. if *, enable emitting all pseudo tags]:ptag"
"--put-field-prefix[put UCTAGS as prefix for the name of fields newly introducted in universal ctags]"
"--quiet=-[don't print notice class messages]:bool:(yes no)"
"--regex--[define regex for locating tags in specific lang]:language:->languageequals"
"--roles--[enable/disable tag roles for kinds of <lang>]:language:->languagedot"
"--sort=-[should tags be sorted]:argument:(yes no foldcase)"
"--tag-relative=-[should paths be relative to location of tag file]:argument:(yes no always never)"
"--totals=-[print stats about input and tag files]:arguments:(yes no extra)"
"(--verbose -V)--verbose=-[enable verbose messages describing actions]:bool:(yes no)"
"(--verbose -V)-V[enable verbose messages describing actions]"
"--version[print version]"
"--with-list-header=-[prepend the column descriptions in --list-* output]:bool:(yes no)"
"*:file:_files"
)
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+,-o+}"[write tags to specified file]:output file:_files"
"-F[use forward searching patterns (/.../)]"
"-h[specify a list of file extensions to be treated as include files]:extensions"
"-I[specify a list of tokens to be specially handled]:identifier list"
"-L[read a list of input file names from the specified file]:input file:_files"
"-n[equivalent to --excmd=number]"
"-N[equivalent to --excmd=pattern]"
"(--recurse -R)--recurse=-[search files recursively]::bool:(yes no)"
"(--recurse -R)-R[search files recursively]"
"-u[equivalent to --sort=no]"
"-x[print a tabular cross reference file to stdout]"
"--append=-[should tags be appended to existing tag file]:bool:(yes no)"
"--etags-include=-[include reference to file in emacs style tag file]:file:_files"
"--exclude=-[exclude files and directories matching pattern]:pattern"
"--excmd=-[uses the specified type of ex command to locate tags]:ex command type:(number pattern mix)"
"--extra=-[include extra tag entries for selected information]:flags (fg)"
"--fields=-[include selected extension fields]:flags (afmikKlnsStz)"
"--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[display help text]"
"--if0=-[should code within #if 0 conditionals be parsed]:bool:(yes no)"
"--langdef=-[define a new language to be parsed with regular expressions]:name"
"--langmap=-[override default mapping of language to input file extension]:maps"
"--language-force=-[force all files to be interpreted using specified language]:language:->language"
"--languages=-[restrict files scanned to these comma-separated languages]:language:->languages"
"--license[print details of software license]"
"--line-directives=-[should #line directives be processed]:bool:(yes no)"
"--links=-[indicate whether symlinks should be followed]:bool:(yes no)"
"--list-kinds=-[list of all tag kinds for lang]:language:->language"
"--list-languages[list of supported languages]"
"--list-maps=-[list of language mappings (both extensions and patterns)]:language:->language"
"--options=-[specify file (or dir) from which command line options should be read]:file:_files"
"--regex--[define regex for locating tags in specific lang]:language:->language"
"--sort=-[should tags be sorted]:argument:(yes no foldcase)"
"--tag-relative=-[should paths be relative to location of tag file]:argument:(yes no)"
"--totals=-[print stats about input and tag files]:arguments:(yes no)"
"(--verbose -V)--verbose=-[enable verbose messages describing actions]:bool:(yes no)"
"(--verbose -V)-V[enable verbose messages describing actions]"
"--version[print version]"
"*:file:_files"
)
if [[ "$PREFIX" = -* ]]; then
local -a languages=(`_ctags_languages`)
local -a languages2
for language in $languages; do
arguments+=("--$language-kinds=-:kinds")
done
fi
elif [ "$_ctags_type" = "bsd" ]; then
arguments=(
"-a[append to tags file]"
"-B[use backward searching patterns (?...?)]"
"-d[create tags for #defines that don't take arguments]"
"-F[use forward searching patterns (/.../)]"
"-f+[write tags to specified file]:output file:_files"
"-t[create tags for typedefs, structs, unions, and enums]"
"-u[update the specified files in the tags file]"
"-v[an index of the form expected by vgrind(1) is produced]"
"-w[suppress warning diagnostics]"
"-x[ctags produces a simple function index]"
"*:file:_files"
)
fi
_arguments -s $arguments
if [ "$state" = "language" ]; then
local -a languages=(`_ctags_languages`)
_wanted languages expl language compadd -a languages
elif [ "$state" = "languageequals" ]; then
local -a languages=(`_ctags_languages`)
_wanted languages expl language compadd -S = -a languages
elif [ "$state" = "languagedot" ]; then
local -a languages=(`_ctags_languages`)
_wanted languages expl language compadd -S . -a languages
elif [ "$state" = "languages" ]; then
local -a languages=(`_ctags_languages`)
_values -s , languages $languages
fi
return $(( compstate[nmatches] > 0 ? 0 : 1 ))
[-- Attachment #3: Type: text/plain, Size: 387 bytes --]
It will make sure the language names start with an alphabetic character, followed by any number of [A-za-z0-9#_+] using the sed program. The # is for C# and + for C++ and _ for good measure.
>
>> You don't know in advance what flag that would be and what it would mean
>> in compadd (you need to consider future compadd too), so this is
>> essentially undefined behaviour.
next prev parent reply other threads:[~2021-03-11 17:08 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-02-23 3:11 Jacob Gelbman
2021-02-23 10:11 ` Peter Stephenson
2021-02-23 22:20 ` Oliver Kiddle
2021-02-23 22:45 ` Bart Schaefer
2021-02-23 23:51 ` Oliver Kiddle
2021-02-24 0:52 ` Bart Schaefer
2021-02-24 13:47 ` Daniel Shahaf
2021-02-23 23:05 ` Mikael Magnusson
2021-02-23 21:39 ` Oliver Kiddle
2021-02-24 4:45 ` Jacob Gelbman
2021-02-24 7:20 ` Jacob Gelbman
2021-02-24 9:26 ` Peter Stephenson
2021-02-24 14:24 ` Daniel Shahaf
2021-02-24 18:58 ` Jacob Gelbman
2021-02-24 19:01 ` Bart Schaefer
2021-03-03 20:02 ` Daniel Shahaf
2021-03-03 20:39 ` Jacob Gelbman
2021-03-03 21:40 ` Peter Stephenson
2021-03-03 22:06 ` Daniel Shahaf
2021-03-03 22:08 ` Jacob Gelbman
2021-03-03 23:28 ` Aaron Schrab
2021-03-03 23:43 ` Daniel Shahaf
2021-03-03 23:35 ` Daniel Shahaf
2021-03-07 19:18 ` Jacob Gelbman
2021-03-07 21:42 ` Daniel Shahaf
2021-03-07 21:57 ` Jacob Gelbman
2021-03-07 22:10 ` Daniel Shahaf
2021-03-11 16:15 ` Daniel Shahaf
2021-03-11 17:08 ` Jacob Gelbman [this message]
2021-03-20 1:43 ` Lawrence Velázquez
2021-03-27 16:14 ` Lawrence Velázquez
2021-03-27 20:43 ` Daniel Shahaf
2021-03-28 23:29 ` Oliver Kiddle
2021-03-29 8:54 ` Peter Stephenson
2021-03-29 15:07 ` EOL normalization? (Was: Completion script for the ctags program) Lawrence Velázquez
2021-03-29 15:34 ` Daniel Shahaf
2021-03-29 15:41 ` Lawrence Velázquez
2021-02-24 21:54 ` Completion script for the ctags program dana
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=742BD09C-6FE4-4B89-9B8F-824FB67EDEED@gmail.com \
--to=gelbman@gmail.com \
--cc=d.s@daniel.shahaf.name \
--cc=zsh-workers@zsh.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).