From a110107c61dd7532934d2a628e976f882f9b9d00 Mon Sep 17 00:00:00 2001 From: Shohei YOSHIDA Date: Sun, 8 Mar 2026 22:12:07 +0900 Subject: [PATCH] Fix chromium completion - fix wrong _alternative usage --- src/_chromium | 276 ++++++++++++++++++++++++++------------------------ 1 file changed, 142 insertions(+), 134 deletions(-) diff --git a/src/_chromium b/src/_chromium index 917739b..089e5f5 100644 --- a/src/_chromium +++ b/src/_chromium @@ -33,17 +33,17 @@ # or submit itself to any jurisdiction. _arguments \ - "--user-data-dir=[Specify the directory that user data is kept in]:directory:_path_files -/" \ - "--app=[Runs URL in app mode]:url:_urls" \ - "--incognito[Open in incognito mode]" \ - "--new-window[open in new window]" \ - "(--no-proxy-server --proxy-auto-detect --proxy-pac-url --password-store)--proxy-server=[specify proxy server]:[\://][\:]:_chromium_proxyurls" \ - "--no-proxy-server[Disables the proxy server]" \ - "--proxy-auto-detect[Autodetect proxy configuration]" \ - "--proxy-pac-url=[Specify proxy autoconfiguration URL]:proxy autoconfiguration url:_urls" \ - "--password-store=[Set the password store to use]:password store: _wanted arguments expl 'wallet store' compadd -- basic gnome kwallet" \ - "--version[print version]" \ - "*:: :{ _alternative _urls _files }" + "--user-data-dir=[Specify the directory that user data is kept in]:directory:_path_files -/" \ + "--app=[Runs URL in app mode]:url:_urls" \ + "--incognito[Open in incognito mode]" \ + "--new-window[open in new window]" \ + "(--no-proxy-server --proxy-auto-detect --proxy-pac-url --password-store)--proxy-server=[specify proxy server]:[\://][\:]:_chromium_proxyurls" \ + "--no-proxy-server[Disables the proxy server]" \ + "--proxy-auto-detect[Autodetect proxy configuration]" \ + "--proxy-pac-url=[Specify proxy autoconfiguration URL]:proxy autoconfiguration url:_urls" \ + "--password-store=[Set the password store to use]:password store: _wanted arguments expl 'wallet store' compadd -- basic gnome kwallet" \ + "--version[print version]" \ + '*:: :{ _alternative "urls\:url\:_urls" "file\:file\:_files" }' # excerpt from the chromium help message: # @@ -84,128 +84,136 @@ _arguments \ _chromium_proxyurls () { #TODO: semicolon separated urls not yet implemented # mostly copied from _urls - local ipre scheme host user uhosts ret=1 expl match glob suf - local localhttp - zstyle -a ":completion:${curcontext}:urls" local localhttp - local localhttp_servername="$localhttp[1]" - local localhttp_documentroot="$localhttp[2]" - local localhttp_userdir="$localhttp[3]" - zstyle -a ":completion:${curcontext}:urls" urls urls - if [[ $#urls -gt 1 || ( $#urls -eq 1 && ! -d $urls[1] ) ]] - then - [[ $#urls -eq 1 && -f $urls[1] ]] && urls=($(< $urls[1])) - _wanted urls expl 'URL' compadd "$@" -a urls && return 0 - urls=() - fi - urls="$urls[1]" - glob=(-g '*(^/)') - zparseopts -D -K -E 'g:=glob' - ipre="$IPREFIX" - if ! compset -P '(#b)([-+.a-z0-9]#):' - then - _tags -C argument prefixes - while _tags - do - while _next_label prefixes expl 'URL prefix' -S '' "$@" - do - compset -S '[^:/]*' && compstate[to_end]='' - compadd "$expl[@]" http:// socks:// socks4:// socks5:// && ret=0 - done - (( ret )) || return 0 - done - return 1 - fi - scheme="$match[1]" - case "$scheme" in + local ipre scheme host user uhosts ret=1 expl match glob suf + local localhttp + zstyle -a ":completion:${curcontext}:urls" local localhttp + local localhttp_servername="$localhttp[1]" + local localhttp_documentroot="$localhttp[2]" + local localhttp_userdir="$localhttp[3]" + zstyle -a ":completion:${curcontext}:urls" urls urls + if [[ $#urls -gt 1 || ( $#urls -eq 1 && ! -d $urls[1] ) ]] + then + [[ $#urls -eq 1 && -f $urls[1] ]] && urls=($(< $urls[1])) + _wanted urls expl 'URL' compadd "$@" -a urls && return 0 + urls=() + fi + urls="$urls[1]" + glob=(-g '*(^/)') + zparseopts -D -K -E 'g:=glob' + ipre="$IPREFIX" + if ! compset -P '(#b)([-+.a-z0-9]#):' + then + _tags -C argument prefixes + while _tags + do + while _next_label prefixes expl 'URL prefix' -S '' "$@" + do + compset -S '[^:/]*' && compstate[to_end]='' + compadd "$expl[@]" http:// socks:// socks4:// socks5:// && ret=0 + done + (( ret )) || return 0 + done + return 1 + fi + scheme="$match[1]" + case "$scheme" in (http(|s)|socks(|4|5)) if ! compset -P // - then - _wanted -C "$scheme" prefixes expl 'end of prefix' compadd -S '' "$@" // - return - fi ;; - (file) [[ -prefix //(127.0.0.1|localhost)/ ]] && compset -P '//(127.0.0.1|localhost)' - [[ -prefix /// ]] && compset -P // - if ! compset -P // - then - _tags -C file files - while _tags - do - while _next_label files expl 'local file' - do - if [[ -prefix / ]] - then - _path_files "$expl[@]" -S '' "${glob[@]}" && ret=0 - _path_files "$expl[@]" -S/ -r '/' -/ && ret=0 - elif [[ -z "$PREFIX" ]] - then - compadd -S '/' -r '/' "$expl[@]" "$@" - "${PWD%/}" && ret=0 - fi - done - (( ret )) || return 0 - done - return 1 - fi ;; - esac - if ! compset -P '(#b)([^:/]#)([:/])' - then - uhosts=($urls/$scheme/$PREFIX*$SUFFIX(/:t)) - _tags hosts - while _tags - do - while _next_label hosts expl host - do - compset -S '[:/]*' || suf="/" - (( $#uhosts )) || _hosts -S "$suf" -r '/:' "$expl[@]" && ret=0 - [[ "$scheme" = http ]] && uhosts=($uhosts $localhttp_servername) - compadd -S "$suf" -r '/:' "$expl[@]" -a uhosts && ret=0 - done - (( ret )) || return 0 - done - return 1 - fi - host="$match[1]" - [[ $match[2] = ':' ]] && ! compset -P '<->/' && _message -e ports 'port number' && return 0 - _tags remote-files files || return 1 - if [[ "$localhttp_servername" = "$host" ]] - then - if compset -P \~ - then - if ! compset -P '(#b)([^/]#)/' - then - _users -S/ "$@" - return - fi - user="$match[1]" - while _tags - do - while _next_label files expl 'local file' - do - _path_files "$expl[@]" "$@" -W ~$user/$localhttp_userdir "${glob[@]}" && ret=0 - _path_files -S/ -r '/' "$expl[@]" -W ~$user/$localhttp_userdir-/ && ret=0 - done - (( ret )) || return 0 - done - else - while _tags - do - while _next_label files expl 'local file' - do - _path_files "$expl[@]" "$@" -W $localhttp_documentroot "${glob[@]}" && ret=0 - _path_files -S/ -r '/' "$expl[@]" -W $localhttp_documentroot -/ && ret=0 - done - (( ret )) || return 0 - done - fi - else - while _tags - do - (( $#urls )) && while _next_label files expl 'local file' - do - _path_files "$expl[@]" "$@" -W $urls/$scheme/$host "${glob[@]}" && ret=0 - _path_files -S/ -r '/' "$expl[@]" -W $urls/$scheme/$host -/ && ret=0 - done - [[ $scheme = (scp|sftp) ]] && _requested remote-files && _remote_files -h $host -- ssh && ret=0 - (( ret )) || return 0 - done - fi - return $ret + then + _wanted -C "$scheme" prefixes expl 'end of prefix' compadd -S '' "$@" // + return + fi ;; + (file) [[ -prefix //(127.0.0.1|localhost)/ ]] && compset -P '//(127.0.0.1|localhost)' + [[ -prefix /// ]] && compset -P // + if ! compset -P // + then + _tags -C file files + while _tags + do + while _next_label files expl 'local file' + do + if [[ -prefix / ]] + then + _path_files "$expl[@]" -S '' "${glob[@]}" && ret=0 + _path_files "$expl[@]" -S/ -r '/' -/ && ret=0 + elif [[ -z "$PREFIX" ]] + then + compadd -S '/' -r '/' "$expl[@]" "$@" - "${PWD%/}" && ret=0 + fi + done + (( ret )) || return 0 + done + return 1 + fi ;; + esac + if ! compset -P '(#b)([^:/]#)([:/])' + then + uhosts=($urls/$scheme/$PREFIX*$SUFFIX(/:t)) + _tags hosts + while _tags + do + while _next_label hosts expl host + do + compset -S '[:/]*' || suf="/" + (( $#uhosts )) || _hosts -S "$suf" -r '/:' "$expl[@]" && ret=0 + [[ "$scheme" = http ]] && uhosts=($uhosts $localhttp_servername) + compadd -S "$suf" -r '/:' "$expl[@]" -a uhosts && ret=0 + done + (( ret )) || return 0 + done + return 1 + fi + host="$match[1]" + [[ $match[2] = ':' ]] && ! compset -P '<->/' && _message -e ports 'port number' && return 0 + _tags remote-files files || return 1 + if [[ "$localhttp_servername" = "$host" ]] + then + if compset -P \~ + then + if ! compset -P '(#b)([^/]#)/' + then + _users -S/ "$@" + return + fi + user="$match[1]" + while _tags + do + while _next_label files expl 'local file' + do + _path_files "$expl[@]" "$@" -W ~$user/$localhttp_userdir "${glob[@]}" && ret=0 + _path_files -S/ -r '/' "$expl[@]" -W ~$user/$localhttp_userdir-/ && ret=0 + done + (( ret )) || return 0 + done + else + while _tags + do + while _next_label files expl 'local file' + do + _path_files "$expl[@]" "$@" -W $localhttp_documentroot "${glob[@]}" && ret=0 + _path_files -S/ -r '/' "$expl[@]" -W $localhttp_documentroot -/ && ret=0 + done + (( ret )) || return 0 + done + fi + else + while _tags + do + (( $#urls )) && while _next_label files expl 'local file' + do + _path_files "$expl[@]" "$@" -W $urls/$scheme/$host "${glob[@]}" && ret=0 + _path_files -S/ -r '/' "$expl[@]" -W $urls/$scheme/$host -/ && ret=0 + done + [[ $scheme = (scp|sftp) ]] && _requested remote-files && _remote_files -h $host -- ssh && ret=0 + (( ret )) || return 0 + done + fi + return $ret } + +# Local Variables: +# mode: Shell-Script +# sh-indentation: 2 +# indent-tabs-mode: nil +# sh-basic-offset: 2 +# End: +# vim: ft=zsh sw=2 ts=2 et