diff --git a/assets/completions/bat.zsh b/assets/completions/bat.zsh index 5e39d2be..2dc8e221 100644 --- a/assets/completions/bat.zsh +++ b/assets/completions/bat.zsh @@ -1,56 +1,91 @@ #compdef bat -# FIXME: help me with the subcommand `cache`, zsh completion is hard as hell -local -a args -local state +local context state state_descr line +typeset -A opt_args -args=( - '(-A --show-all)'{-A,--show-all}'[Show non-printable characters (space, tab, newline, ..)]' - {-p,--plain}'[Show plain style (alias for `--style=plain`)]:When `-p` is used twice (`-pp`), it also disables automatic paging (alias for `--style=plain --paging=never`)' - '(-l --language)'{-l+,--language=}'[Set the language for syntax highlighting]::->language' - '(-H --highlight-line)'{-H,--highlight-line}'[Highlight lines N through M]:...' - '(--file-name)'--file-name'[Specify the name to display for a file]:...:_files' - '(-d --diff)'--diff'[Only show lines that have been added/removed/modified]' - '(--diff-context)'--diff-context'[Include N lines of context around added/removed/modified lines when using `--diff`]: (lines):()' - '(--tabs)'--tabs'[Set the tab width to T spaces]: (tab width):()' - '(--wrap)'--wrap='[Specify the text-wrapping mode]::(auto never character)' - '(--terminal-width)'--terminal-width'[Explicitly set the width of the terminal instead of determining it automatically]:' - '(-n --number)'{-n,--number}'[Show line numbers]' - '(--color)'--color='[When to use colors]::(auto never always)' - '(--italic-text)'--italic-text='[Use italics in output]::(always never)' - '(--decorations)'--decorations='[When to show the decorations]::(auto never always)' - '(--paging)'--paging='[Specify when to use the pager]::(auto never always)' - '(-m --map-syntax)'{-m+,--map-syntax=}'[Use the specified syntax for files matching the glob pattern]:...' - '(--theme)'--theme='[Set the color theme for syntax highlighting]::->theme' - '(: --list-themes --list-languages -L)'--list-themes'[Display all supported highlighting themes]' - '(--style)'--style='[Comma-separated list of style elements to display]::->style' - '(-r --line-range)'{-r+,--line-range=}'[Only print the lines from N to M]:...' - '(: --list-themes --list-languages -L)'{-L,--list-languages}'[Display all supported languages]' - '(: -)'{-h,--help}'[Print this help message]' - '(: -)'{-V,--version}'[Show version information]' - '*: :_files' -) +(( $+functions[_cache_subcommand] )) || +_cache_subcommand() { + local -a args + args=( + '(-b --build -c --clear)'{-b,--build}'[Initialize or update the syntax/theme cache]' + '(-b --build -c --clear)'{-c,--clear}'[Remove the cached syntax definitions and themes]' + '(--source)'--source='[Use a different directory to load syntaxes and themes from]:directory:_files -/' + '(--target)'--target='[Use a different directory to store the cached syntax and theme set]:directory:_files -/' + '(--blank)'--blank'[Create completely new syntax and theme sets)]' + '(: -)'{-h,--help}'[Prints help information]' + '*: :' + ) -_arguments -S -s $args + _arguments -S -s $args +} -case "$state" in - language) - local IFS=$'\n' - local -a languages - languages=( $(bat --list-languages | awk -F':|,' '{ for (i = 1; i <= NF; ++i) printf("%s:%s\n", $i, $1) }') ) +(( $+functions[_bat_main] )) || +_bat_main() { + local -a args + args=( + '(-A --show-all)'{-A,--show-all}'[Show non-printable characters (space, tab, newline, ..)]' + {-p,--plain}'[Show plain style (alias for `--style=plain`)]:When `-p` is used twice (`-pp`), it also disables automatic paging (alias for `--style=plain --paging=never`)' + '(-l --language)'{-l+,--language=}'[Set the language for syntax highlighting]::->language' + '(-H --highlight-line)'{-H,--highlight-line}'[Highlight lines N through M]:...' + '(--file-name)'--file-name'[Specify the name to display for a file]:...:_files' + '(-d --diff)'--diff'[Only show lines that have been added/removed/modified]' + '(--diff-context)'--diff-context'[Include N lines of context around added/removed/modified lines when using `--diff`]: (lines):()' + '(--tabs)'--tabs'[Set the tab width to T spaces]: (tab width):()' + '(--wrap)'--wrap='[Specify the text-wrapping mode]::(auto never character)' + '(--terminal-width)'--terminal-width'[Explicitly set the width of the terminal instead of determining it automatically]:' + '(-n --number)'{-n,--number}'[Show line numbers]' + '(--color)'--color='[When to use colors]::(auto never always)' + '(--italic-text)'--italic-text='[Use italics in output]::(always never)' + '(--decorations)'--decorations='[When to show the decorations]::(auto never always)' + '(--paging)'--paging='[Specify when to use the pager]::(auto never always)' + '(-m --map-syntax)'{-m+,--map-syntax=}'[Use the specified syntax for files matching the glob pattern]:...' + '(--theme)'--theme='[Set the color theme for syntax highlighting]::->theme' + '(: --list-themes --list-languages -L)'--list-themes'[Display all supported highlighting themes]' + '(--style)'--style='[Comma-separated list of style elements to display]::->style' + '(-r --line-range)'{-r+,--line-range=}'[Only print the lines from N to M]:...' + '(: --list-themes --list-languages -L)'{-L,--list-languages}'[Display all supported languages]' + '(: -)'{-h,--help}'[Print this help message]' + '(: -)'{-V,--version}'[Show version information]' + '*: :_files' + ) - _describe 'language' languages - ;; + _arguments -S -s $args - theme) - local IFS=$'\n' - local -a themes - themes=( $(bat --list-themes | sort) ) + case "$state" in + language) + local IFS=$'\n' + local -a languages + languages=( $(bat --list-languages | awk -F':|,' '{ for (i = 1; i <= NF; ++i) printf("%s:%s\n", $i, $1) }') ) - _values 'theme' $themes - ;; + _describe 'language' languages + ;; - style) - _values -s , 'style' auto full plain changes header grid numbers snip - ;; -esac + theme) + local IFS=$'\n' + local -a themes + themes=( $(bat --list-themes | sort) ) + + _values 'theme' $themes + ;; + + style) + _values -s , 'style' auto full plain changes header grid numbers snip + ;; + esac +} + +# first positional argument +if (( ${#words} == 2 )); then + _values subcommand cache + _bat_main +else + case $words[2] in + cache) + _cache_subcommand + ;; + + *) + _bat_main + ;; + esac +fi