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,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 3903 invoked from network); 11 Mar 2021 17:08:27 -0000 Received: from zero.zsh.org (2a02:898:31:0:48:4558:7a:7368) by inbox.vuxu.org with ESMTPUTF8; 11 Mar 2021 17:08:27 -0000 ARC-Seal: i=1; cv=none; a=rsa-sha256; d=zsh.org; s=rsa-20200801; t=1615482507; b=W8rGMKs9XIYxscjv1NtbzWMe6q/1pFrx5QdaoTbzfuq7maM7rEaowLwmyk4WFd9L2G8P9zWKWT EstaNKUN1qbPfw1Jf0EIrQhKhfpQa74grfNCxDf4ixK75C334mlcUAUgVkIQsqgCXQo0gTqBKa L/dl5zUz3Bo0+6ZMaMD9e5WtCwJmgwZL0CQGkQ77In5K2X8PrhGMVBG0uAWG9XXcl9DeyDANtW xYTreq36IhMgB+mR8AaSfu3+CSO1yFyVaOHZYJD3N/+GbPXJ1q8cF9VJQIme1DD2ny80NPXSDm NlGSnOI//zIKorI6/eptYT+IwInm8wqU3tow2NpiwNVNww==; ARC-Authentication-Results: i=1; zsh.org; iprev=pass (mail-ot1-f53.google.com) smtp.remote-ip=209.85.210.53; dkim=pass header.d=gmail.com header.s=20161025 header.a=rsa-sha256; dmarc=pass header.from=gmail.com; arc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed; d=zsh.org; s=rsa-20200801; t=1615482507; bh=qUztA6fzEMiL8/9hrfQWezQvUVKBseXzFKBNTEeSP3U=; h=List-Archive:List-Owner:List-Post:List-Unsubscribe:List-Subscribe:List-Help: List-Id:Sender:References:To:Cc:In-Reply-To:Date:Subject:MIME-Version: Content-Type:Message-ID:From:DKIM-Signature:DKIM-Signature; b=O2E1f/f8rIwHFu71iwq3kwMt7MlsU80ANiwkj++Bp8Xj7j5EQtP8ozVyohTghze1/zTrTJ4Cup uCP3dbEFreqKKtNqPx+Xyw/AHO5jjIAj7sD3CIoBJeYzTzYo18ypVnimDhv4ZwMlGG0v6WNQNP c60fg74PxsvOBuZ/v9B2SHsZl8/wkPBIAWxHxSHKNx0cGONHPbfDL+fP/gB4pO5ifF18sUt0SV SkqtoVN8K0r8ZG9UBqN2QLzEO5Vgqy8pJ6cgPSdsCQ9yPNXTMTj8EPtAQOId/BOWzDsZzk6E76 59RFhPdiCFqQfqy7BhWwv4vYJuXXO/5W4aU3eC5cKgcokA==; 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:References:To:Cc:In-Reply-To:Date: Subject:Mime-Version:Content-Type:Message-Id:From:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID; bh=A1ObWB5UKFwKqSNy1WaHSBfZQAq1Qj6Sn1y5ZzObxNo=; b=GHS1fYC5k17pV58rqFHw4wCe+2 t4bHdI534NWeRkgBcwICy0x66HEoO94vci47G47Jlrt1On5LZU73VYxmDes8cTRmXNH/UZR9trXMA EbenwmFhid42Aa2xA3hr/zaS/KOcdcbrh9/PaJsfjIOYU6FrY+GQueS0AZ8tY+sLULiP4tTmSO/Yd ezNeK4+GWV6shjMymil2aD8D4E3l3f96Fc/uyWx903poePrpoA+7e8drW0e98memmPjclNKPtEYiA cxteDTDganH8J+3CT4MyMECO6L1FQJ4Uw2bVfBUkBSRbW5d1UyFEjnldJc6YGM23oBDBNNMe4J39D 8JlkP3/Q==; Received: from authenticated user by zero.zsh.org with local id 1lKOnR-000JbY-16; Thu, 11 Mar 2021 17:08:25 +0000 Authentication-Results: zsh.org; iprev=pass (mail-ot1-f53.google.com) smtp.remote-ip=209.85.210.53; dkim=pass header.d=gmail.com header.s=20161025 header.a=rsa-sha256; dmarc=pass header.from=gmail.com; arc=none Received: from mail-ot1-f53.google.com ([209.85.210.53]:46564) by zero.zsh.org with esmtps (TLS1.3:TLS_AES_128_GCM_SHA256:128) id 1lKOnB-000JS8-4l; Thu, 11 Mar 2021 17:08:10 +0000 Received: by mail-ot1-f53.google.com with SMTP id r24so2119755otq.13 for ; Thu, 11 Mar 2021 09:08:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:message-id:mime-version:subject:date:in-reply-to:cc:to :references; bh=A1ObWB5UKFwKqSNy1WaHSBfZQAq1Qj6Sn1y5ZzObxNo=; b=rz1aJjTE/iNE3SyQaoor5T2xWawMKquweDRF4dKhrWgpguuDR/zlAs8vSgiGPG/iDj MNqGvS7Vrgs0s/7OR1J/XCx0tjF9uTJNX5rxu6e57Urk47nYbm1XDE2bnp89CrFt7vbA YX51oPaXO66NWacVbdkzZOJzKpAGINNLUlUa4cN3/HA6eixpg2uXTyvr90dM4yAyaNcM XarJNI4/XE5wRd4sU0hg2MqK9n4A2TTgXg8qFzLFiGHxvnJf9E/fvRhOpz7TRZihWy4A e8Eg+neBerDM5MeXXwv33MUgR0hg0D2C3rlszcnyl06b/Gq5vRkKcWbdJcDpsNipEZEL HUYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:message-id:mime-version:subject:date :in-reply-to:cc:to:references; bh=A1ObWB5UKFwKqSNy1WaHSBfZQAq1Qj6Sn1y5ZzObxNo=; b=WkazFNxXsDzFLqbqbqbLRkuCvyy7HMcJxwNio/BQKGJfzxM0IAW6CQfuxaNHGIjfqQ n9uTEA0ftoBt7d97tCldy2IHO2erFQRo0JCzvUAROSkr2eh7GiVUQccCydLkWky2L7fQ lZx2JUCd4pCgO2VJz2QUD28j6k1tLbXcjzL6iLRy4TxGQOlOZMIgK00BuF58h0v9r2G9 4rZv4twa7c+Rr9RWQ8PGYBaFXnEpr2pvrrFn5K7oS3hAbEjgLWi5eU5rRcu/3j0TFz9C xlEdI4bhtMieT4J3bX3caUvOAYEFjwFB7dtJlTZvlPHsFVwJVQgqScHt0BpcrBeDMk2q 35Xw== X-Gm-Message-State: AOAM533AZosqrMa7tQ9ZWHYVqoXIdXwbzLLGcw/qalm0t73DLdum0Gf+ VZCzfs8gSp2vCjMCy1T8gTptYlbwRno= X-Google-Smtp-Source: ABdhPJwmoTFj6rtH4SAKyQNSfuVCrKF1yIrYhEjP13VXSxQYKAdZgPORGM8ap06sGy9OYgkjXRiiBQ== X-Received: by 2002:a9d:206d:: with SMTP id n100mr7962844ota.353.1615482487934; Thu, 11 Mar 2021 09:08:07 -0800 (PST) Received: from ?IPv6:2601:2c3:ca81:7bc0:147a:84dc:a9b:ce74? ([2601:2c3:ca81:7bc0:147a:84dc:a9b:ce74]) by smtp.gmail.com with ESMTPSA id 106sm237180oth.81.2021.03.11.09.08.06 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 11 Mar 2021 09:08:07 -0800 (PST) From: Jacob Gelbman Message-Id: <742BD09C-6FE4-4B89-9B8F-824FB67EDEED@gmail.com> Content-Type: multipart/mixed; boundary="Apple-Mail=_A0007A63-18F0-415D-AC3D-5475714C4AD4" Mime-Version: 1.0 (Mac OS X Mail 13.4 \(3608.120.23.2.4\)) Subject: Re: Completion script for the ctags program Date: Thu, 11 Mar 2021 11:08:05 -0600 In-Reply-To: <20210311161552.GA9181@tarpaulin.shahaf.local2> Cc: zsh-workers@zsh.org To: Daniel Shahaf References: <31598-1614116362.902856@aI-l.maGv.3QD7> <20210224142437.GC9342@tarpaulin.shahaf.local2> <3e0a754f-bbac-404d-92ba-b30f0c736f61@www.fastmail.com> <7f0a752e-2685-4c4b-8a31-b8db1728af1f@www.fastmail.com> <20210311161552.GA9181@tarpaulin.shahaf.local2> X-Mailer: Apple Mail (2.3608.120.23.2.4) X-Seq: 48166 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: --Apple-Mail=_A0007A63-18F0-415D-AC3D-5475714C4AD4 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 > On Mar 11, 2021, at 10:15 AM, Daniel Shahaf = wrote: >=20 > 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 = wrote: >>>> Jacob Gelbman wrote on Sun, 07 Mar 2021 19:18 +00:00: >>>>>>> elif [ "$state" =3D "languages" ]; then >>>>>>> _values -s , languages $languages >>>>>>=20 >>>>>> Don't pass unsanitized command output to a builtin. I don't know = the >>>>>> fix off the top of my head. >>>>=20 >>>> This point has been neither responded to nor implemented. >>>=20 >>> I sanitize the output a little bit, by cutting just the first word = from=20 >>> the list that=E2=80=99s returned. That fixes lines like "OldC++ = [disabled]" And=20 >>> I=E2=80=99m not that worried about possibly feeding in incorrectly = formatted=20 >>> data. What=E2=80=99s the worst that could happen? The listing will = look messed=20 >>> up? >>=20 >> An option flag could be injected from an external command into = compadd. [...] >=20 > Do you intend to send a revised patch to address this? Yes, here it is:=20= --Apple-Mail=_A0007A63-18F0-415D-AC3D-5475714C4AD4 Content-Disposition: attachment; filename=ctags.txt Content-Type: text/plain; x-unix-mode=0644; name="ctags.txt" Content-Transfer-Encoding: quoted-printable #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=3D`ctags --version 2>&1` if [[ "$output" =3D *Universal\ Ctags* ]]; then _ctags_type=3D"universal" elif [[ "$output" =3D *Exuberant\ Ctags* ]]; then _ctags_type=3D"exuberant" elif [[ "$output" =3D *usage:\ ctags* ]]; then _ctags_type=3D"bsd" elif [[ "$output" =3D *Emacs* ]]; then _ctags_type=3D"etags" else _ctags_type=3D"universal" fi fi if [ "$_ctags_type" =3D "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" =3D --alias-*=3D* ]]; then _message pattern return 1 elif [[ "$PREFIX" =3D --extras-*=3D* ]]; then _message flags return 1 elif [[ "$PREFIX" =3D --fields-*=3D* ]]; then _message flags return 1 elif [[ "$PREFIX" =3D --input-encoding-*=3D* ]]; then _message encoding return 1 elif [[ "$PREFIX" =3D --kinddef-*=3D* ]]; then _message kind return 1 elif [[ "$PREFIX" =3D --kinds-*=3D* ]]; then _message kind return 1 elif [[ "$PREFIX" =3D --map-*=3D* ]]; then _message pattern return 1 elif [[ "$PREFIX" =3D --mline-regex-*=3D* ]]; then _message pattern return 1 elif [[ "$PREFIX" =3D --param-*=3D* ]]; then _message argument return 1 elif [[ "$PREFIX" =3D --regex-*=3D* ]]; then _message pattern return 1 elif [[ "$PREFIX" =3D --roles-*.*=3D* ]] then _message role return 1 elif [[ "$PREFIX" =3D --roles-*.* ]] then _message kind return 1 fi if [ "$_ctags_type" =3D "universal" ]; then arguments=3D( "-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=3Dnumber]" "-N[equivalent to --excmd=3Dpattern]" "(--recurse -R)--recurse=3D-[search files recursively]::bool:(yes = no)" "(--recurse -R)-R[search files recursively]" "-u[equivalent to --sort=3Dno]" "-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=3D-[should tags be appended to existing tag = file]:bool:(yes no)" "--etags-include=3D-[include reference to file in emacs style tag = file]:file:_files" "--exclude=3D-[exclude files and directories matching = pattern]:pattern" "--exclude-exception=3D-[don't exclude files and directories = matching pattern even if they match the pattern specified with = --exclude]:pattern" "--excmd=3D-[uses the specified type of ex command to locate = tags]:ex command type:(number pattern mix combine)" "--extras=3D-[include extra tag entries for selected = information]:flags (fFgpqrs)" "--extras--[include own extra tag entries for selected = information]:language:->languageequals" "--fields=3D-[include selected extension fields]:flags = (aCeEfFikKlmnNpPrRsStxzZ)" "--fields--[include selected own extension = fields]:language:->languageequals" "--filter=3D-[behave as a filter, reading file names from stdin and = writing tags to stdout]:bool:(yes no)" "--filter-terminator=3D-[specify string to print to stdout following = the tags for each file parsed when --filter is enabled]:string" "--format=3D-[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=3D-[should code within #if 0 conditionals be = parsed]:bool:(yes no)" "--input-encoding=3D-[specify encoding of all input files]:encoding" "--input-encoding--[specify encoding of the input = files]:language:->languageequals" "--kinddef--[define new kind for ]:language:->languageequals" "--kinds--[enable/disable tag kinds for = ]:language:->languageequals" "--langdef=3D-[define a new language to be parsed with regular = expressions]:name" "--langmap=3D-[override default mapping of language to input file = extension]:maps" "--language-force=3D-[force all files to be interpreted using = specified language]:language:->language" "--languages=3D-[restrict files scanned to these comma-separated = languages]:language:->languages" "--license[print details of software license]" "--line-directives=3D-[should #line directives be = processed]:bool:(yes no)" "--links=3D-[indicate whether symlinks should be followed]:bool:(yes = no)" "--list-aliases=3D-[list of alias patterns]:language:->language" "--list-excludes[list of exclude patterns for files/dirs]" "--list-extras=3D-[list of extra tag flags]:language:->language" "--list-features[list of compiled features]" "--list-fields=3D-[list of fields]:language:->language" "--list-kinds=3D-[list of all tag kinds for = lang]:language:->language" "--list-kinds-full=3D-[list details of all tag kinds for = lang]:language:->language" "--list-languages[list of supported languages]" "--list-map-extensions=3D-[list of language extensions in = mapping]:language:->language" "--list-map-patterns=3D-[list of language patterns in = mapping]:language:->language" "--list-maps=3D-[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=3D-[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=3D-[list of all roles of tag kinds specified for = langs]:language:->language" "--list-subparsers=3D-[list of subparsers for the base = lang]:language:->language" "--machinable=3D-[use tab separated representation in --list-* = output]:bool:(yes no)" "--map--[set, add(+), or remove(-) the map for = ]:language:->languageequals" "--maxdepth=3D-[specify maximum recursion depth]:depth" "--mline-regex--[define multiline regex for locating tags in = ]:language:->languageequals" "--options=3D-[specify file (or dir) from which command line options = should be read]:file:_files" "--options-maybe=3D-[same as --options but doesn't = error]:file:_files" "--optlib-dir=3D-[add or set dir to optlib search path]:dir:_files = -/" "--output-encoding=3D-[the encoding to write the tag file = in]:encoding" "--output-format=3D-[specify the output format]:format:(u-ctags = e-ctags etags xref)" "--param--[set specific parameter]:language:->languageequals" "--pattern-length-limit=3D-[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=3D-[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=3D-[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 = ]:language:->languagedot" "--sort=3D-[should tags be sorted]:argument:(yes no foldcase)" "--tag-relative=3D-[should paths be relative to location of tag = file]:argument:(yes no always never)" "--totals=3D-[print stats about input and tag files]:arguments:(yes = no extra)" "(--verbose -V)--verbose=3D-[enable verbose messages describing = actions]:bool:(yes no)" "(--verbose -V)-V[enable verbose messages describing actions]" "--version[print version]" "--with-list-header=3D-[prepend the column descriptions in --list-* = output]:bool:(yes no)" "*:file:_files" ) elif [ "$_ctags_type" =3D "exuberant" ]; then arguments=3D( "-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=3Dnumber]" "-N[equivalent to --excmd=3Dpattern]" "(--recurse -R)--recurse=3D-[search files recursively]::bool:(yes = no)" "(--recurse -R)-R[search files recursively]" "-u[equivalent to --sort=3Dno]" "-x[print a tabular cross reference file to stdout]" "--append=3D-[should tags be appended to existing tag = file]:bool:(yes no)" "--etags-include=3D-[include reference to file in emacs style tag = file]:file:_files" "--exclude=3D-[exclude files and directories matching = pattern]:pattern" "--excmd=3D-[uses the specified type of ex command to locate = tags]:ex command type:(number pattern mix)" "--extra=3D-[include extra tag entries for selected = information]:flags (fg)" "--fields=3D-[include selected extension fields]:flags = (afmikKlnsStz)" "--file-scope=3D-[should tags scoped only for a single file be = included in output]:bool:(yes no)" "--filter=3D-[behave as a filter, reading file names from stdin and = writing tags to stdout]:bool:(yes no)" "--filter-terminator=3D-[specify string to print to stdout following = the tags for each file parsed when --filter is enabled]:string" "--format=3D-[force output of specified tag file format]:level" "--help[display help text]" "--if0=3D-[should code within #if 0 conditionals be = parsed]:bool:(yes no)" "--langdef=3D-[define a new language to be parsed with regular = expressions]:name" "--langmap=3D-[override default mapping of language to input file = extension]:maps" "--language-force=3D-[force all files to be interpreted using = specified language]:language:->language" "--languages=3D-[restrict files scanned to these comma-separated = languages]:language:->languages" "--license[print details of software license]" "--line-directives=3D-[should #line directives be = processed]:bool:(yes no)" "--links=3D-[indicate whether symlinks should be followed]:bool:(yes = no)" "--list-kinds=3D-[list of all tag kinds for = lang]:language:->language" "--list-languages[list of supported languages]" "--list-maps=3D-[list of language mappings (both extensions and = patterns)]:language:->language" "--options=3D-[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=3D-[should tags be sorted]:argument:(yes no foldcase)" "--tag-relative=3D-[should paths be relative to location of tag = file]:argument:(yes no)" "--totals=3D-[print stats about input and tag files]:arguments:(yes = no)" "(--verbose -V)--verbose=3D-[enable verbose messages describing = actions]:bool:(yes no)" "(--verbose -V)-V[enable verbose messages describing actions]" "--version[print version]" "*:file:_files" ) if [[ "$PREFIX" =3D -* ]]; then local -a languages=3D(`_ctags_languages`) local -a languages2 for language in $languages; do arguments+=3D("--$language-kinds=3D-:kinds") done fi elif [ "$_ctags_type" =3D "bsd" ]; then arguments=3D( "-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" =3D "language" ]; then local -a languages=3D(`_ctags_languages`) _wanted languages expl language compadd -a languages elif [ "$state" =3D "languageequals" ]; then local -a languages=3D(`_ctags_languages`) _wanted languages expl language compadd -S =3D -a languages elif [ "$state" =3D "languagedot" ]; then local -a languages=3D(`_ctags_languages`) _wanted languages expl language compadd -S . -a languages elif [ "$state" =3D "languages" ]; then local -a languages=3D(`_ctags_languages`) _values -s , languages $languages fi return $(( compstate[nmatches] > 0 ? 0 : 1 )) --Apple-Mail=_A0007A63-18F0-415D-AC3D-5475714C4AD4 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii 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. >=20 >> 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. --Apple-Mail=_A0007A63-18F0-415D-AC3D-5475714C4AD4--