Browse Source

Fix a few issues in zsh completion

Namely:

  - add tags to all untagged contexts;
  - don't leak $debug_commands;
  - plus some cosmetic changes.
oxiedi 4 years ago
parent
commit
a6c4047a45
1 changed files with 23 additions and 19 deletions
  1. 23 19
      scripts/shell_completions/zsh/_borg

+ 23 - 19
scripts/shell_completions/zsh/_borg

@@ -5,7 +5,7 @@
 # Recommended _borg specific settings:
 #
 #   zstyle -e ':completion:*:*:borg-*:argument-rest:*' tag-order \
-#     '[[ $words[CURRENT] == -* ]] && reply=( "!archives archive-files" "-" )'
+#     '[[ $words[CURRENT] == -* ]] && reply=( "! archives archive-files" "-" )'
 #   zstyle ':completion:*:*:(borg|-value-,BORG_)*' sort false
 #   zstyle ':completion:*:*:borg-config:argument-2:keys' list-grouped false
 #   zstyle ':completion:*:*:borg-*:*' gain-privileges true
@@ -24,7 +24,7 @@
 #   Style selector used to select a path (when Borg would use either `pp` or `pf`).
 #   Default: `fm`.
 # repository-suffix
-#   This boolean style controls whether to add the `::` suffix to a repository.
+#   This boolean style controls whether to add the `::` auto-removable suffix to a repository.
 #   Default: `true`.
 
 (( $+functions[_borg_commands] )) ||
@@ -166,7 +166,7 @@ _borg-debug() {
 
   case $state in
   (command)
-    debug_commands=(
+    local -a debug_commands=(
       'info:show system infos for debugging / bug reports'
       'dump-archive-items:dump archive items (metadata)'
       'dump-archive:dump decoded archive metadata'
@@ -686,7 +686,7 @@ __borg_setup_common_create_options() {
     '--comment=[add a comment text to the archive]:COMMENT:_borg_placeholders'
     '--timestamp=[manually specify the archive creation date/time]:TIMESTAMP:_borg_timestamp'
     '(-c --checkpoint-interval)'{-c,--checkpoint-interval}'=[write checkpoint every SECONDS seconds (default: 1800)]: : _borg_guard_unsigned_number "SECONDS"'
-    '--chunker-params[specify the chunker parameters]: :_borg_chunker_params'
+    '--chunker-params=[specify the chunker parameters]: :_borg_chunker_params'
     '(-C --compression)'{-C,--compression}'=[select compression algorithm]: :_borg_compression'
   )
 }
@@ -792,7 +792,7 @@ _borg_cached_repositories() {
   }'
   local cachedir=${BORG_CACHE_DIR:-${XDG_CACHE_HOME:-${BORG_BASE_DIR:-$HOME}/.cache}/borg}
   cached_repos=( ${(f)"$(_call_program -p cached-repositories sed -n -E ${(q)sed_script} \
-    "${(q)cachedir}/*/config(N.om)" 2>/dev/null)"} )
+    "${(q)cachedir}/*/config(#qN.om)" 2>/dev/null)"} )
 
   if [[ $compstate[quote] != (\'|\") ]]; then
     # hide ~BORG_REPO and other scalars
@@ -870,7 +870,7 @@ _borg_repository_or_archive() {
   else
     local -a suf
     if ! compset -S '::*'; then
-      if (( $+opts[-a] )) || zstyle -T ":completion:${curcontext}:" repository-suffix; then
+      if (( $+opts[-a] )) || zstyle -T ":completion:${curcontext}:repositories" repository-suffix; then
         suf=( -S '::' )
       fi
       local oqrepo="$PREFIX$SUFFIX"
@@ -977,12 +977,12 @@ _borg_archive() {
         fi
       fi
 
-      if zstyle -t ":completion:${curcontext}:" verbose; then
+      if zstyle -t ":completion:${curcontext}:archives" verbose; then
         if (( __borg_archives_need_update || ! $+__borg_archive_names || ! $+__borg_archive_descriptions )); then
           __borg_archives_need_update=0
           typeset -gHa __borg_archive_names=() __borg_archive_descriptions=()
           local fmt descfmt name desc
-          zstyle -s ":completion:${curcontext}:" archive-description-format descfmt ||
+          zstyle -s ":completion:${curcontext}:archives" archive-description-format descfmt ||
             descfmt='{archive:<36} {time} [{id}]'
           fmt="{barchive}{NUL}$descfmt{NUL}"
           _call_program -p archive-descriptions \
@@ -1204,11 +1204,12 @@ _borg_style_selector_or_archive_files() {
 __borg_style_selectors() {
   local default_style_selector=$1 path_style_selector
   shift
-  zstyle -s ":completion:${curcontext%:*}:archive-files" path-style-selector path_style_selector ||
+  zstyle -s ":completion:${curcontext}:archive-files" path-style-selector path_style_selector ||
     path_style_selector='fm'
-  local -a disp style_selectors
+  local -a disp
+  local -A style_selectors
   __borg_setup_style_selectors
-  if zstyle -T ":completion:${curcontext}:" verbose; then
+  if zstyle -T ":completion:${curcontext}:style-selectors" verbose; then
     local -a style_selector_descriptions extra
     local k v sep
     for k v in ${(kv)style_selectors}; do
@@ -1219,7 +1220,7 @@ __borg_style_selectors() {
       (( $#extra )) && v+=" (${(j:, :)extra})"
       style_selector_descriptions+=( "${${k//\\/\\\\}//:/\\:}:$v" )
     done
-    zstyle -s ":completion:${curcontext}:" list-separator sep || sep=--
+    zstyle -s ":completion:${curcontext}:style-selectors" list-separator sep || sep=--
     zformat -a style_selector_descriptions " $sep " $style_selector_descriptions
     disp=( -ld style_selector_descriptions )
   fi
@@ -1239,7 +1240,8 @@ __borg_archive_files() {
     return 1
   fi
 
-  local -a qargs tmp disp pref style_selectors match mbegin mend archive_files descs
+  local -a qargs tmp disp pref match mbegin mend archive_files descs
+  local -A style_selectors
   local k cword fmt descfmt style_selector path_style_selector name descr
 
   # take into account exclude options on the command line
@@ -1263,8 +1265,8 @@ __borg_archive_files() {
 
   [[ -z $cword ]] && return 1
 
-  if zstyle -t ":completion:${curcontext}:" verbose; then
-    zstyle -s ":completion:${curcontext}:" file-description-format descfmt ||
+  if zstyle -t ":completion:${curcontext}:archive-files" verbose; then
+    zstyle -s ":completion:${curcontext}:archive-files" file-description-format descfmt ||
       descfmt='{mode} {user:6} {group:6} {size:8d} {mtime} {path}{extra}'
     fmt="{bpath}{NUL}$descfmt{NUL}"
   else
@@ -1285,7 +1287,8 @@ __borg_archive_files() {
       [[ -n $style_selector ]] && compset -P "$style_selector:" && pref=( -P "$style_selector:" )
       cword="$PREFIX$SUFFIX"
       [[ $compstate[quote] != (\'|\") ]] && cword=${(Q)cword}
-      zstyle -s ":completion:${curcontext}:" path-style-selector path_style_selector || path_style_selector='fm'
+      zstyle -s ":completion:${curcontext}:archive-files" path-style-selector path_style_selector ||
+        path_style_selector='fm'
       cword="$path_style_selector:$cword"
     else
       [[ -z $style_selector ]] && cword="$default_style_selector:$cword"
@@ -1293,7 +1296,7 @@ __borg_archive_files() {
     qargs+=( ${(q)cword} )
   fi
 
-  if zstyle -t ":completion:${curcontext}:" verbose; then
+  if zstyle -t ":completion:${curcontext}:archive-files" verbose; then
     _call_program -p archive-file-descriptions ${(q)__borg_command:-borg} list $qargs 2>/dev/null |
     while IFS= read -r -d $'\0' name && IFS= read -r -d $'\0' descr; do
       archive_files+=( $name )
@@ -1334,7 +1337,8 @@ __borg_pattern_files() {
   local paths_varname=$1
   shift
 
-  local -a args style_selectors
+  local -a args
+  local -A style_selectors
   __borg_setup_style_selectors
   local pr_pat='[RP\+\-\!]' ss_pat="(${(j:|:)${(@kb)style_selectors}}):"
   local prs_pat="$pr_pat #"
@@ -1504,7 +1508,7 @@ _borg_statuschars() {
     'i[backup data was read from standard input (stdin)]' \
     '-[dry run, item was not backed up]' \
     'x[excluded, item was not backed up]' \
-    '?[missing status code]' \
+    '?[missing status code]'
 }
 
 (( $+functions[_borg_quota_suffixes] )) ||