fix shellcheck, failed fzf sl experiment
authorIan Kelling <ian@iankelling.org>
Fri, 6 Feb 2026 03:23:29 +0000 (22:23 -0500)
committerIan Kelling <ian@iankelling.org>
Fri, 6 Feb 2026 03:23:29 +0000 (22:23 -0500)
beetag
brc
brc2
brc3
filesystem/usr/local/bin/bk-backup
fzf-brc [new file with mode: 0644]
i3-sway/gen
shellcheck-this-repo
system-status

diff --git a/beetag b/beetag
index c0d7ff65077f335839ddf82f4253c5a0f1000ace..38eb1cc63429edccefbf68da671505c069047f50 100755 (executable)
--- a/beetag
+++ b/beetag
@@ -426,7 +426,7 @@ beetag()  {
   # misc vars
   local char_i escaped_input new_item seek_sec
   local -i scrolled=999 # more than any $LINES
-  local -i i ret line_int skip_start skip_lookback overflow_lines overflow
+  local -i i ret line_int skip_start skip_lookback
 
 
   ##### begin command line parsing ########
@@ -628,7 +628,7 @@ beetag()  {
           skip_end=$(( skip_start + LINES - 1 ))
           (( skip_end <= id_count )) || skip_end=$id_count
 
-          #e "debug: skip_start: $skip_start  overflow_lines: $overflow_lines  id_count: $id_count"
+          #e "debug: skip_start: $skip_start   id_count: $id_count"
 
           for (( i=skip_start; i <= skip_end; i++ )); do
             #e "i=$i"
diff --git a/brc b/brc
index fde7dcb4a658775b983b9556f07a310bdef4ca82..0b5b6f7249dd123e4c73195b6ccf0fed770c0434 100644 (file)
--- a/brc
+++ b/brc
@@ -348,6 +348,7 @@ mysrc /a/c/fsf-script-lib
 mysrc /a/bin/small-misc-bash/ll-function
 mysrc /a/bin/distro-functions/src/package-manager-abstractions
 mysrc /a/bin/fai/fai/config/distro-install-common/bash-misc-funcs
+mysrc /a/c/fzf-brc
 
 
 
@@ -1311,7 +1312,7 @@ k1() { builtin kill %%; }
 x() {
   local -a arr jspecs
   local l
-  mapfile -t arr <<<$(jobs)
+  mapfile -t arr <<<"$(jobs)"
   for l in "${arr[@]}"; do
     [[ ${l:1:1} == [0-9] ]] || continue
     l="${l:1}"
@@ -3010,10 +3011,11 @@ shk-p() {
   local fname="${1##*/}"
   [[ ! -L $1 && ( $fname == *.sh || $fname != *.* ) ]] && istext "$1" && [[ $(head -n1 "$1" 2>/dev/null) == '#!/bin/bash'* ]]
 }
+# todo: update bash style guide with new exceptions
 shellcheck-except() {
   local quotes others
   quotes=2048,2064,2068,2086,2119,2206,2254,2231
-  others=2029,2032,2033,2054,2164,2190,2317
+  others=2024,2029,2032,2033,2054,2164,2185,2190,2317
   shellcheck -e $quotes,$others "$@" || return $?
 }
 # wrapper for shellcheck with better defaults.
@@ -4582,9 +4584,7 @@ mbc() {
   if (( $# <= 1 )); then
     return
   fi
-  local cmd="$1"
-  shift
-  "$cmd" "$@"
+  "$@"
 }
 
 # maybe run command with options ended by --
@@ -4659,7 +4659,7 @@ dtsort() {
   local daystart
   daystart=$(date -d 00:00 +%s)
   day_mins=$(( ( EPOCHSECONDS - daystart ) / 60 ))
-  echo $(date +%j)---$day_mins
+  echo "$(date +%j)---$day_mins"
 }
 
 wgkey() {
@@ -4680,12 +4680,12 @@ wgkey() {
 # versions for a simple license scan.
 dedup-node-modules() {
   mkdir -p ../deduped
-  for d in $(find . -type d -name node_modules | perl -e 'print sort {length $b <=> length $a} <>'); do for mod in $d/*; do [[ -d $mod ]] || rm $mod; n="${m##*/}"; if [[ -d ../deduped/$n ]]; then rm -r $mod; else mv $mod ../deduped; fi; done; done
+  for d in $(find . -type d -name node_modules | perl -e 'print sort {length $b <=> length $a} <>'); do for mod in $d/*; do [[ -d $mod ]] || rm $mod; n="${mod##*/}"; if [[ -d ../deduped/$n ]]; then rm -r $mod; else mv $mod ../deduped; fi; done; done
   cd ../deduped
   # for each dir that has a min.js file, compare char count of min.js
   # files vs char count of files with just .js or .ts, etc. If minified
   # is bigger, then flag it by doing an ls.
-  for d in $(find -type f -name '*.min.js'|sed -r 's,^./,,;s,/.*$,,' | sort -u); do a=$(cat $(find $d -name '*.min.js')|wc -c); b=$(cat $(find $d -type f \! -name '*.min.js' \( -name '*.js' -o -name '*.ts' -o -name '*.mjs' -o -name '*.tsx' -o -name '*.cts' -o -name '*.mts \)') | wc -c); if ! uintp "$a" "$b"; then e "uint $a, $b"; continue; fi; if (( a < b )); then find $d -name '*.min.js' -delete; else m ll $d; fi; done
+  for d in $(find -type f -name '*.min.js'|sed -r 's,^./,,;s,/.*$,,' | sort -u); do a="$(find $d -name '*.min.js'|wc -c)"; b="$(find $d -type f \! -name '*.min.js' \( -name '*.js' -o -name '*.ts' -o -name '*.mjs' -o -name '*.tsx' -o -name '*.cts' -o -name '*.mts \)' | wc -c)"; if ! uintp "$a" "$b"; then e "uint $a, $b"; continue; fi; if (( a < b )); then find $d -name '*.min.js' -delete; else m ll $d; fi; done
   #time /t/sc/scancode --info --classify --only-findings --max-in-memory 300000 -clpue --unknown-licenses --tallies --tallies-with-details --summary --generated --json-pp scan.json .
 }
 
@@ -4715,6 +4715,34 @@ fi
 #   unset MY_INIT_CMD
 # fi
 
+
+# things to remember:
+# ALT-C - cd into the selected directory
+# CTRL-T - Paste the selected file path into the command line
+#
+# good guide to some of its basic features is the readme file
+# https://github.com/junegunn/fzf
+#
+# Built according to /a/opt/fzf/BUILD.md:
+# make install
+#
+# mv bin/fzf /a/opt/bin
+#
+# todo: do a web search to see if we can decrease fzf binary size with
+# compilation options, it is 4mb.
+
+if ! type -p fzf &>/dev/null; then
+  if [[ -s $bashrc_dir/fzf ]]; then
+    # todo: look into this. I'm not syncing because fzf built on t12 fails to run on t10 with
+    # fzf: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by fzf)
+    # fzf: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found (required by fzf)
+    path_add --ifexists --end $bashrc_dir
+  else
+    return 0
+  fi
+fi
+
+
 # ensure no bad programs appending to this file will have an affect
 return 0
 
diff --git a/brc2 b/brc2
index 372c7b201b23d9f0fc282cc0be391b354c98f190..6375a9cd0dd28da79bc2a845587edbab832e62bc 100644 (file)
--- a/brc2
+++ b/brc2
@@ -51,7 +51,7 @@ his() {
   history -r
 }
 
-
+# source fsf-script-lib # for shellcheck-this-repo
 source /a/bin/distro-setup/path_add-function
 path_add /a/exe
 # add this with absolute paths as needed for better security
@@ -72,7 +72,7 @@ path_add --end /home/iank/perl5/bin
 if [[ ! $PERL5LIB ]]; then
   PERL5LIB=/home/iank/perl5/lib/perl5
   PERL_LOCAL_LIB_ROOT=/home/iank/perl5
-  PERL_MB_OPT="--install_base \"/home/iank/perl5\""
+  PERL_MB_OPT="--install_base /home/iank/perl5"
   PERL_MM_OPT=INSTALL_BASE=/home/iank/perl5
   export PERL5LIB PERL_LOCAL_LIB_ROOT PERL_MB_OPT PERL_MM_OPT
 fi
@@ -4808,6 +4808,7 @@ webp-anim-array() {
     return 1
   fi
   # note, we could save the file name in the webinfo output if our first 2 seds were s/^.* /0 /
+  # shellcheck disable=SC2016 # intentional
   tmps=$(webpinfo -summary "${args[@]}" | sed -rn '1{s/.*/0/;x};/^File:/{s/.*/0/;x;p};${x;p}; /^[[:space:]]*Number of frames:[[:space:]]+([2-9]|[1-9][0-9]+)$/{s/^.*[[:space:]]([0-9]+)$/\1/;G;s/\n0//;h}')
   unset webp_frames
   mapfile -t webp_frames <<<"$tmps"
@@ -5009,918 +5010,3 @@ pull-iankfsf() {
     m sl mail.fsf.org pull-iankfsf
   fi
 }
-
-########################## ####################################################
-########################## ##########################
-########################## ####################################################
-########################## ##########################
-########################## ####################################################
-########################## ##########################
-########################## ####################################################
-########################## ##########################
-########################## ####################################################
-########################## ##########################
-########################## ####################################################
-########################## ##########################
-########################## ####################################################
-########################## ##########################
-########################## ####################################################
-########################## ##########################
-########################## ####################################################
-########################## ##########################
-########################## ####################################################
-########################## ##########################
-
-
-
-
-
-
-
-# things to remember:
-# ALT-C - cd into the selected directory
-# CTRL-T - Paste the selected file path into the command line
-#
-# good guide to some of its basic features is the readme file
-# https://github.com/junegunn/fzf
-
-path_add --end --ifexists /a/opt/fzf/bin
-
-if ! type -p fzf &>/dev/null; then
-  return 0
-fi
-
-#####  this is from output of fzf --bash plus a small modification to
-# prevent a command from reporting a superflous nonzero exit, search for
-# iank below.
-
-### key-bindings.bash ###
-#     ____      ____
-#    / __/___  / __/
-#   / /_/_  / / /_
-#  / __/ / /_/ __/
-# /_/   /___/_/ key-bindings.bash
-#
-# - $FZF_TMUX_OPTS
-# - $FZF_CTRL_T_COMMAND
-# - $FZF_CTRL_T_OPTS
-# - $FZF_CTRL_R_COMMAND
-# - $FZF_CTRL_R_OPTS
-# - $FZF_ALT_C_COMMAND
-# - $FZF_ALT_C_OPTS
-
-if [[ $- =~ i ]]; then
-
-
-  # Key bindings
-  # ------------
-
-  #----BEGIN shfmt
-  #----BEGIN INCLUDE common.sh
-  # NOTE: Do not directly edit this section, which is copied from "common.sh".
-  # To modify it, one can edit "common.sh" and run "./update.sh" to apply
-  # the changes. See code comments in "common.sh" for the implementation details.
-
-  __fzf_defaults() {
-    printf '%s\n' "--height ${FZF_TMUX_HEIGHT:-40%} --min-height 20+ --bind=ctrl-z:ignore $1"
-    command cat "${FZF_DEFAULT_OPTS_FILE-}" 2> /dev/null
-    printf '%s\n' "${FZF_DEFAULT_OPTS-} $2"
-  }
-
-  __fzf_exec_awk() {
-    if [[ -z ${__fzf_awk-} ]]; then
-      __fzf_awk=awk
-      if [[ $OSTYPE == solaris* && -x /usr/xpg4/bin/awk ]]; then
-        __fzf_awk=/usr/xpg4/bin/awk
-      elif command -v mawk > /dev/null 2>&1; then
-        local n x y z d
-        IFS=' .' read -r n x y z d <<< $(command mawk -W version 2> /dev/null)
-        [[ $n == mawk ]] && ((d >= 20230302 && (x * 1000 + y) * 1000 + z >= 1003004)) && __fzf_awk=mawk
-      fi
-    fi
-    LC_ALL=C exec "$__fzf_awk" "$@"
-  }
-  #----END INCLUDE
-
-  __fzf_select__() {
-    FZF_DEFAULT_COMMAND=${FZF_CTRL_T_COMMAND:-} \
-                       FZF_DEFAULT_OPTS=$(__fzf_defaults "--reverse --walker=file,dir,follow,hidden --scheme=path" "${FZF_CTRL_T_OPTS-} -m") \
-                       FZF_DEFAULT_OPTS_FILE='' $(__fzfcmd) "$@" |
-      while read -r item; do
-        printf '%q ' "$item" # escape special chars
-      done
-  }
-
-  __fzfcmd() {
-    [[ -n ${TMUX_PANE-} ]] && { [[ ${FZF_TMUX:-0} != 0 ]] || [[ -n ${FZF_TMUX_OPTS-} ]]; } &&
-      echo "fzf-tmux ${FZF_TMUX_OPTS:--d${FZF_TMUX_HEIGHT:-40%}} -- " || echo "fzf"
-  }
-
-  fzf-file-widget() {
-    local selected="$(__fzf_select__ "$@")"
-    READLINE_LINE="${READLINE_LINE:0:READLINE_POINT}$selected${READLINE_LINE:READLINE_POINT}"
-    READLINE_POINT=$((READLINE_POINT + ${#selected}))
-  }
-
-  __fzf_cd__() {
-    local dir
-    dir=$(
-      FZF_DEFAULT_COMMAND=${FZF_ALT_C_COMMAND:-} \
-                         FZF_DEFAULT_OPTS=$(__fzf_defaults "--reverse --walker=dir,follow,hidden --scheme=path" "${FZF_ALT_C_OPTS-} +m") \
-                         FZF_DEFAULT_OPTS_FILE='' $(__fzfcmd)
-       ) && printf 'builtin cd -- %q' "$(builtin unset CDPATH && builtin cd -- "$dir" && builtin pwd)"
-  }
-
-  if command -v perl > /dev/null; then
-    __fzf_history__() {
-      local output script
-      script='BEGIN { getc; $/ = "\n\t"; $HISTCOUNT = $ENV{last_hist} + 1 } s/^[ *]//; s/\n/\n\t/gm; print $HISTCOUNT - $. . "\t$_" if !$seen{$_}++'
-      output=$(
-        set +o pipefail
-        builtin fc -lnr -2147483648 |
-          last_hist=$(HISTTIMEFORMAT='' builtin history 1) command perl -n -l0 -e "$script" |
-          FZF_DEFAULT_OPTS=$(__fzf_defaults "" "-n2..,.. --scheme=history --bind=ctrl-r:toggle-sort,alt-r:toggle-raw --wrap-sign '"$'\t'"↳ ' --highlight-line ${FZF_CTRL_R_OPTS-} +m --read0") \
-                          FZF_DEFAULT_OPTS_FILE='' $(__fzfcmd) --query "$READLINE_LINE"
-            ) || return
-      READLINE_LINE=$(command perl -pe 's/^\d*\t//' <<< "$output")
-      if [[ -z $READLINE_POINT ]]; then
-        echo "$READLINE_LINE"
-      else
-        READLINE_POINT=0x7fffffff
-      fi
-    }
-  else # awk - fallback for POSIX systems
-    __fzf_history__() {
-      local output script
-      [[ $(HISTTIMEFORMAT='' builtin history 1) =~ [[:digit:]]+ ]] # how many history entries
-      script='function P(b) { ++n; sub(/^[ *]/, "", b); if (!seen[b]++) { printf "%d\t%s%c", '$((BASH_REMATCH + 1))' - n, b, 0 } }
-    NR==1 { b = substr($0, 2); next }
-    /^\t/ { P(b); b = substr($0, 2); next }
-    { b = b RS $0 }
-    END { if (NR) P(b) }'
-      output=$(
-        set +o pipefail
-        builtin fc -lnr -2147483648 2> /dev/null | # ( $'\t '<lines>$'\n' )* ; <lines> ::= [^\n]* ( $'\n'<lines> )*
-          __fzf_exec_awk "$script" |               # ( <counter>$'\t'<lines>$'\000' )*
-          FZF_DEFAULT_OPTS=$(__fzf_defaults "" "-n2..,.. --scheme=history --bind=ctrl-r:toggle-sort,alt-r:toggle-raw --wrap-sign '"$'\t'"↳ ' --highlight-line ${FZF_CTRL_R_OPTS-} +m --read0") \
-                          FZF_DEFAULT_OPTS_FILE='' $(__fzfcmd) --query "$READLINE_LINE"
-            ) || return
-      READLINE_LINE=${output#*$'\t'}
-      if [[ -z $READLINE_POINT ]]; then
-        echo "$READLINE_LINE"
-      else
-        READLINE_POINT=0x7fffffff
-      fi
-    }
-  fi
-
-  # Required to refresh the prompt after fzf
-  bind -m emacs-standard '"\er": redraw-current-line'
-
-  bind -m vi-command '"\C-z": emacs-editing-mode'
-  bind -m vi-insert '"\C-z": emacs-editing-mode'
-  bind -m emacs-standard '"\C-z": vi-editing-mode'
-
-  if ((BASH_VERSINFO[0] < 4)); then
-    # CTRL-T - Paste the selected file path into the command line
-    if [[ ${FZF_CTRL_T_COMMAND-x} != "" ]]; then
-      bind -m emacs-standard '"\C-t": " \C-b\C-k \C-u`__fzf_select__`\e\C-e\er\C-a\C-y\C-h\C-e\e \C-y\ey\C-x\C-x\C-f\C-y\ey\C-_"'
-      bind -m vi-command '"\C-t": "\C-z\C-t\C-z"'
-      bind -m vi-insert '"\C-t": "\C-z\C-t\C-z"'
-    fi
-
-    # CTRL-R - Paste the selected command from history into the command line
-    if [[ ${FZF_CTRL_R_COMMAND-x} != "" ]]; then
-      if [[ -n ${FZF_CTRL_R_COMMAND-} ]]; then
-        echo "warning: FZF_CTRL_R_COMMAND is set to a custom command, but custom commands are not yet supported for CTRL-R" >&2
-      fi
-      bind -m emacs-standard '"\C-r": "\C-e \C-u\C-y\ey\C-u`__fzf_history__`\e\C-e\er"'
-      bind -m vi-command '"\C-r": "\C-z\C-r\C-z"'
-      bind -m vi-insert '"\C-r": "\C-z\C-r\C-z"'
-    fi
-  else
-    # CTRL-T - Paste the selected file path into the command line
-    if [[ ${FZF_CTRL_T_COMMAND-x} != "" ]]; then
-      bind -m emacs-standard -x '"\C-t": fzf-file-widget'
-      bind -m vi-command -x '"\C-t": fzf-file-widget'
-      bind -m vi-insert -x '"\C-t": fzf-file-widget'
-    fi
-
-    # CTRL-R - Paste the selected command from history into the command line
-    if [[ ${FZF_CTRL_R_COMMAND-x} != "" ]]; then
-      if [[ -n ${FZF_CTRL_R_COMMAND-} ]]; then
-        echo "warning: FZF_CTRL_R_COMMAND is set to a custom command, but custom commands are not yet supported for CTRL-R" >&2
-      fi
-      bind -m emacs-standard -x '"\C-r": __fzf_history__'
-      bind -m vi-command -x '"\C-r": __fzf_history__'
-      bind -m vi-insert -x '"\C-r": __fzf_history__'
-    fi
-  fi
-
-  # ALT-C - cd into the selected directory
-  if [[ ${FZF_ALT_C_COMMAND-x} != "" ]]; then
-    bind -m emacs-standard '"\ec": " \C-b\C-k \C-u`__fzf_cd__`\e\C-e\er\C-m\C-y\C-h\e \C-y\ey\C-x\C-x\C-d\C-y\ey\C-_"'
-    bind -m vi-command '"\ec": "\C-z\ec\C-z"'
-    bind -m vi-insert '"\ec": "\C-z\ec\C-z"'
-  fi
-  #----END shfmt
-
-fi
-### end: key-bindings.bash ###
-### completion.bash ###
-#     ____      ____
-#    / __/___  / __/
-#   / /_/_  / / /_
-#  / __/ / /_/ __/
-# /_/   /___/_/ completion.bash
-#
-# - $FZF_TMUX                 (default: 0)
-# - $FZF_TMUX_OPTS            (default: empty)
-# - $FZF_COMPLETION_TRIGGER   (default: '**')
-# - $FZF_COMPLETION_OPTS      (default: empty)
-# - $FZF_COMPLETION_PATH_OPTS (default: empty)
-# - $FZF_COMPLETION_DIR_OPTS  (default: empty)
-
-if [[ $- =~ i ]]; then
-
-
-  # To use custom commands instead of find, override _fzf_compgen_{path,dir}
-  #
-  #   _fzf_compgen_path() {
-  #     echo "$1"
-  #     command find -L "$1" \
-    #       -name .git -prune -o -name .hg -prune -o -name .svn -prune -o \( -type d -o -type f -o -type l \) \
-    #       -a -not -path "$1" -print 2> /dev/null | command sed 's@^\./@@'
-  #   }
-  #
-  #   _fzf_compgen_dir() {
-  #     command find -L "$1" \
-    #       -name .git -prune -o -name .hg -prune -o -name .svn -prune -o -type d \
-    #       -a -not -path "$1" -print 2> /dev/null | command sed 's@^\./@@'
-  #   }
-
-  ###########################################################
-
-  #----BEGIN shfmt
-  #----BEGIN INCLUDE common.sh
-  # NOTE: Do not directly edit this section, which is copied from "common.sh".
-  # To modify it, one can edit "common.sh" and run "./update.sh" to apply
-  # the changes. See code comments in "common.sh" for the implementation details.
-
-  __fzf_defaults() {
-    printf '%s\n' "--height ${FZF_TMUX_HEIGHT:-40%} --min-height 20+ --bind=ctrl-z:ignore $1"
-    command cat "${FZF_DEFAULT_OPTS_FILE-}" 2> /dev/null
-    printf '%s\n' "${FZF_DEFAULT_OPTS-} $2"
-  }
-
-  __fzf_exec_awk() {
-    if [[ -z ${__fzf_awk-} ]]; then
-      __fzf_awk=awk
-      if [[ $OSTYPE == solaris* && -x /usr/xpg4/bin/awk ]]; then
-        __fzf_awk=/usr/xpg4/bin/awk
-      elif command -v mawk > /dev/null 2>&1; then
-        local n x y z d
-        IFS=' .' read -r n x y z d <<< $(command mawk -W version 2> /dev/null)
-        [[ $n == mawk ]] && ((d >= 20230302 && (x * 1000 + y) * 1000 + z >= 1003004)) && __fzf_awk=mawk
-      fi
-    fi
-    LC_ALL=C exec "$__fzf_awk" "$@"
-  }
-  #----END INCLUDE
-
-  __fzf_comprun() {
-    if [[ "$(type -t _fzf_comprun 2>&1)" == function ]]; then
-      _fzf_comprun "$@"
-    elif [[ -n ${TMUX_PANE-} ]] && { [[ ${FZF_TMUX:-0} != 0 ]] || [[ -n ${FZF_TMUX_OPTS-} ]]; }; then
-      shift
-      fzf-tmux ${FZF_TMUX_OPTS:--d${FZF_TMUX_HEIGHT:-40%}} -- "$@"
-    else
-      shift
-      fzf "$@"
-    fi
-  }
-
-  __fzf_orig_completion() {
-    local l comp f cmd
-    while read -r l; do
-      if [[ $l =~ ^(.*\ -F)\ *([^ ]*).*\ ([^ ]*)$ ]]; then
-        comp="${BASH_REMATCH[1]}"
-        f="${BASH_REMATCH[2]}"
-        cmd="${BASH_REMATCH[3]}"
-        [[ $f == _fzf_* ]] && continue
-        printf -v "_fzf_orig_completion_${cmd//[^A-Za-z0-9_]/_}" "%s" "${comp} %s ${cmd} #${f}"
-        if [[ $l == *" -o nospace "* ]] && [[ ${__fzf_nospace_commands-} != *" $cmd "* ]]; then
-          __fzf_nospace_commands="${__fzf_nospace_commands-} $cmd "
-        fi
-      fi
-    done
-  }
-
-  # @param $1 cmd - Command name for which the original completion is searched
-  # @var[out] REPLY - Original function name is returned
-  __fzf_orig_completion_get_orig_func() {
-    local cmd orig_var orig
-    cmd=$1
-    orig_var="_fzf_orig_completion_${cmd//[^A-Za-z0-9_]/_}"
-    orig="${!orig_var-}"
-    REPLY="${orig##*#}"
-    [[ $REPLY ]] && type "$REPLY" &> /dev/null
-  }
-
-  # @param $1 cmd - Command name for which the original completion is searched
-  # @param $2 func - Fzf's completion function to replace the original function
-  # @var[out] REPLY - Completion setting is returned as a string to "eval"
-  __fzf_orig_completion_instantiate() {
-    local cmd func orig_var orig
-    cmd=$1
-    func=$2
-    orig_var="_fzf_orig_completion_${cmd//[^A-Za-z0-9_]/_}"
-    orig="${!orig_var-}"
-    orig="${orig%#*}"
-    [[ $orig == *' %s '* ]] || return 1
-    printf -v REPLY "$orig" "$func"
-  }
-
-  _fzf_opts_completion() {
-    local cur prev opts
-    COMPREPLY=()
-    cur="${COMP_WORDS[COMP_CWORD]}"
-    prev="${COMP_WORDS[COMP_CWORD - 1]}"
-    opts="
-    +c --no-color
-    +i --no-ignore-case
-    +s --no-sort
-    +x --no-extended
-    --ansi
-    --bash
-    --bind
-    --border
-    --border-label
-    --border-label-pos
-    --color
-    --cycle
-    --disabled
-    --ellipsis
-    --expect
-    --filepath-word
-    --fish
-    --header
-    --header-first
-    --header-lines
-    --height
-    --highlight-line
-    --history
-    --history-size
-    --hscroll-off
-    --info
-    --jump-labels
-    --keep-right
-    --layout
-    --listen
-    --listen-unsafe
-    --literal
-    --man
-    --margin
-    --marker
-    --min-height
-    --no-bold
-    --no-clear
-    --no-hscroll
-    --no-mouse
-    --no-scrollbar
-    --no-separator
-    --no-unicode
-    --padding
-    --pointer
-    --preview
-    --preview-label
-    --preview-label-pos
-    --preview-window
-    --print-query
-    --print0
-    --prompt
-    --read0
-    --reverse
-    --scheme
-    --scroll-off
-    --separator
-    --sync
-    --tabstop
-    --tac
-    --tiebreak
-    --tmux
-    --track
-    --version
-    --with-nth
-    --with-shell
-    --wrap
-    --zsh
-    -0 --exit-0
-    -1 --select-1
-    -d --delimiter
-    -e --exact
-    -f --filter
-    -h --help
-    -i --ignore-case
-    -m --multi
-    -n --nth
-    -q --query
-    --"
-
-    case "${prev}" in
-      --scheme)
-        COMPREPLY=($(compgen -W "default path history" -- "$cur"))
-        return 0
-        ;;
-      --tiebreak)
-        COMPREPLY=($(compgen -W "length chunk begin end index" -- "$cur"))
-        return 0
-        ;;
-      --color)
-        COMPREPLY=($(compgen -W "dark light 16 bw no" -- "$cur"))
-        return 0
-        ;;
-      --layout)
-        COMPREPLY=($(compgen -W "default reverse reverse-list" -- "$cur"))
-        return 0
-        ;;
-      --info)
-        COMPREPLY=($(compgen -W "default right hidden inline inline-right" -- "$cur"))
-        return 0
-        ;;
-      --preview-window)
-        COMPREPLY=($(compgen -W "
-      default
-      hidden
-      nohidden
-      wrap
-      nowrap
-      cycle
-      nocycle
-      up top
-      down bottom
-      left
-      right
-      rounded border border-rounded
-      sharp border-sharp
-      border-bold
-      border-block
-      border-thinblock
-      border-double
-      noborder border-none
-      border-horizontal
-      border-vertical
-      border-up border-top
-      border-down border-bottom
-      border-left
-      border-right
-      follow
-      nofollow" -- "$cur"))
-        return 0
-        ;;
-      --border)
-        COMPREPLY=($(compgen -W "rounded sharp bold block thinblock double horizontal vertical top bottom left right none" -- "$cur"))
-        return 0
-        ;;
-      --border-label-pos | --preview-label-pos)
-        COMPREPLY=($(compgen -W "center bottom top" -- "$cur"))
-        return 0
-        ;;
-    esac
-
-    if [[ $cur =~ ^-|\+ ]]; then
-      COMPREPLY=($(compgen -W "${opts}" -- "$cur"))
-      return 0
-    fi
-
-    return 0
-  }
-
-  _fzf_handle_dynamic_completion() {
-    local cmd ret REPLY orig_cmd orig_complete
-    cmd="$1"
-    shift
-    orig_cmd="$1"
-    if __fzf_orig_completion_get_orig_func "$cmd"; then
-      "$REPLY" "$@"
-    elif [[ -n ${_fzf_completion_loader-} ]]; then
-      orig_complete=$(complete -p "$orig_cmd" 2> /dev/null)
-      $_fzf_completion_loader "$@"
-      ret=$?
-      # _completion_loader may not have updated completion for the command
-      if [[ "$(complete -p "$orig_cmd" 2> /dev/null)" != "$orig_complete" ]]; then
-        __fzf_orig_completion < <(complete -p "$orig_cmd" 2> /dev/null)
-        __fzf_orig_completion_get_orig_func "$cmd" || ret=1
-
-        # Update orig_complete by _fzf_orig_completion entry
-        [[ $orig_complete =~ ' -F '(_fzf_[^ ]+)' ' ]] &&
-          __fzf_orig_completion_instantiate "$cmd" "${BASH_REMATCH[1]}" &&
-          orig_complete=$REPLY
-
-        if [[ ${__fzf_nospace_commands-} == *" $orig_cmd "* ]]; then
-          eval "${orig_complete/ -F / -o nospace -F }"
-        else
-          eval "$orig_complete"
-        fi
-      fi
-      [[ $ret -eq 0 ]] && return 124
-      return $ret
-    fi
-  }
-
-  __fzf_generic_path_completion() {
-    local cur base dir leftover matches trigger cmd
-    cmd="${COMP_WORDS[0]}"
-    if [[ $cmd == \\* ]]; then
-      cmd="${cmd:1}"
-    fi
-    COMPREPLY=()
-    trigger=${FZF_COMPLETION_TRIGGER-'**'}
-    [[ $COMP_CWORD -ge 0 ]] && cur="${COMP_WORDS[COMP_CWORD]}"
-    if [[ $cur == *"$trigger" ]] && [[ $cur != *'$('* ]] && [[ $cur != *':='* ]] && [[ $cur != *'`'* ]]; then
-      base=${cur:0:${#cur}-${#trigger}}
-      eval "base=$base" 2> /dev/null || return
-
-      dir=
-      [[ $base == *"/"* ]] && dir="$base"
-      while true; do
-        if [[ -z $dir ]] || [[ -d $dir ]]; then
-          leftover=${base/#"$dir"/}
-          leftover=${leftover/#\//}
-          [[ -z $dir ]] && dir='.'
-          [[ $dir != "/" ]] && dir="${dir/%\//}"
-          matches=$(
-            export FZF_DEFAULT_OPTS=$(__fzf_defaults "--reverse --scheme=path" "${FZF_COMPLETION_OPTS-} $2")
-            unset FZF_DEFAULT_COMMAND FZF_DEFAULT_OPTS_FILE
-            if declare -F "$1" > /dev/null; then
-              eval "$1 $(printf %q "$dir")" | __fzf_comprun "$4" -q "$leftover"
-            else
-              if [[ $1 =~ dir ]]; then
-                walker=dir,follow
-                eval "rest=(${FZF_COMPLETION_DIR_OPTS-})"
-              else
-                walker=file,dir,follow,hidden
-                eval "rest=(${FZF_COMPLETION_PATH_OPTS-})"
-              fi
-              __fzf_comprun "$4" -q "$leftover" --walker "$walker" --walker-root="$dir" "${rest[@]}"
-            fi | while read -r item; do
-              printf "%q " "${item%$3}$3"
-            done
-                 )
-          matches=${matches% }
-          [[ -z $3 ]] && [[ ${__fzf_nospace_commands-} == *" ${COMP_WORDS[0]} "* ]] && matches="$matches "
-          if [[ -n $matches ]]; then
-            COMPREPLY=("$matches")
-          else
-            COMPREPLY=("$cur")
-          fi
-          # To redraw line after fzf closes (printf '\e[5n')
-          bind '"\e[0n": redraw-current-line' 2> /dev/null
-          printf '\e[5n'
-          return 0
-        fi
-        dir=$(command dirname "$dir")
-        [[ $dir =~ /$ ]] || dir="$dir"/
-      done
-    else
-      shift
-      shift
-      shift
-      _fzf_handle_dynamic_completion "$cmd" "$@"
-    fi
-  }
-
-  _fzf_complete() {
-    # Split arguments around --
-    local args rest str_arg i sep
-    args=("$@")
-    sep=
-    for i in "${!args[@]}"; do
-      if [[ ${args[$i]} == -- ]]; then
-        sep=$i
-        break
-      fi
-    done
-    if [[ -n $sep ]]; then
-      str_arg=
-      rest=("${args[@]:$((sep + 1)):${#args[@]}}")
-      args=("${args[@]:0:sep}")
-    else
-      str_arg=$1
-      args=()
-      shift
-      rest=("$@")
-    fi
-
-    local cur selected trigger cmd post
-    post="$(caller 0 | __fzf_exec_awk '{print $2}')_post"
-    type -t "$post" > /dev/null 2>&1 || post='command cat'
-
-    trigger=${FZF_COMPLETION_TRIGGER-'**'}
-    cmd="${COMP_WORDS[0]}"
-    cur="${COMP_WORDS[COMP_CWORD]}"
-    if [[ $cur == *"$trigger" ]] && [[ $cur != *'$('* ]] && [[ $cur != *':='* ]] && [[ $cur != *'`'* ]]; then
-      cur=${cur:0:${#cur}-${#trigger}}
-
-      selected=$(
-        FZF_DEFAULT_OPTS=$(__fzf_defaults "--reverse" "${FZF_COMPLETION_OPTS-} $str_arg") \
-                        FZF_DEFAULT_OPTS_FILE='' \
-                        __fzf_comprun "${rest[0]}" "${args[@]}" -q "$cur" | eval "$post" | command tr '\n' ' '
-              )
-      selected=${selected% } # Strip trailing space not to repeat "-o nospace"
-      if [[ -n $selected ]]; then
-        COMPREPLY=("$selected")
-      else
-        COMPREPLY=("$cur")
-      fi
-      bind '"\e[0n": redraw-current-line' 2> /dev/null
-      printf '\e[5n'
-      return 0
-    else
-      _fzf_handle_dynamic_completion "$cmd" "${rest[@]}"
-    fi
-  }
-
-  _fzf_path_completion() {
-    __fzf_generic_path_completion _fzf_compgen_path "-m" "" "$@"
-  }
-
-  # Deprecated. No file only completion.
-  _fzf_file_completion() {
-    _fzf_path_completion "$@"
-  }
-
-  _fzf_dir_completion() {
-    __fzf_generic_path_completion _fzf_compgen_dir "" "/" "$@"
-  }
-
-  _fzf_complete_kill() {
-    _fzf_proc_completion "$@"
-  }
-
-  _fzf_proc_completion() {
-    local transformer
-    transformer='
-    if [[ $FZF_KEY =~ ctrl|alt|shift ]] && [[ -n $FZF_NTH ]]; then
-      nths=( ${FZF_NTH//,/ } )
-      new_nths=()
-      found=0
-      for nth in ${nths[@]}; do
-        if [[ $nth = $FZF_CLICK_HEADER_NTH ]]; then
-          found=1
-        else
-          new_nths+=($nth)
-        fi
-      done
-      [[ $found = 0 ]] && new_nths+=($FZF_CLICK_HEADER_NTH)
-      new_nths=${new_nths[*]}
-      new_nths=${new_nths// /,}
-      echo "change-nth($new_nths)+change-prompt($new_nths> )"
-    else
-      if [[ $FZF_NTH = $FZF_CLICK_HEADER_NTH ]]; then
-        echo "change-nth()+change-prompt(> )"
-      else
-        echo "change-nth($FZF_CLICK_HEADER_NTH)+change-prompt($FZF_CLICK_HEADER_WORD> )"
-      fi
-    fi
-  '
-    _fzf_complete -m --header-lines=1 --no-preview --wrap --color fg:dim,nth:regular \
-                  --bind "click-header:transform:$transformer" -- "$@" < <(
-      command ps -eo user,pid,ppid,start,time,command 2> /dev/null ||
-        command ps -eo user,pid,ppid,time,args 2> /dev/null || # For BusyBox
-        command ps --everyone --full --windows                 # For cygwin
-    )
-  }
-
-  _fzf_proc_completion_post() {
-    __fzf_exec_awk '{print $2}'
-  }
-
-  # To use custom hostname lists, override __fzf_list_hosts.
-  # The function is expected to print hostnames, one per line as well as in the
-  # desired sorting and with any duplicates removed, to standard output.
-  #
-  # e.g.
-  #   # Use bash-completions’s _known_hosts_real() for getting the list of hosts
-  #   __fzf_list_hosts() {
-  #     # Set the local attribute for any non-local variable that is set by _known_hosts_real()
-  #     local COMPREPLY=()
-  #     _known_hosts_real ''
-  #     printf '%s\n' "${COMPREPLY[@]}" | command sort -u --version-sort
-  #   }
-  if ! declare -F __fzf_list_hosts > /dev/null; then
-    __fzf_list_hosts() {
-      command sort -u \
-              <(
-        # Note: To make the pathname expansion of "~/.ssh/config.d/*" work
-        # properly, we need to adjust the related shell options.  We need to
-        # unset "set -f" and "GLOBIGNORE", which disable the pathname expansion
-        # totally or partially.  We need to unset "dotglob" and "nocaseglob" to
-        # avoid matching unwanted files.  We need to unset "failglob" to avoid
-        # outputting the error messages to the terminal when no matching is
-        # found.  We need to set "nullglob" to avoid attempting to read the
-        # literal filename '~/.ssh/config.d/*' when no matching is found.
-        set +f
-        GLOBIGNORE=
-        shopt -u dotglob nocaseglob failglob
-        shopt -s nullglob
-
-        __fzf_exec_awk '
-          # Note: mawk <= 1.3.3-20090705 does not support the POSIX brackets of
-          # the form [[:blank:]], and Ubuntu 18.04 LTS still uses this
-          # 16-year-old mawk unfortunately.  We need to use [ \t] instead.
-          match(tolower($0), /^[ \t]*host(name)?[ \t]*[ \t=]/) {
-            $0 = substr($0, RLENGTH + 1) # Remove "Host(name)?=?"
-            sub(/#.*/, "")
-            for (i = 1; i <= NF; i++)
-              if ($i !~ /[*?%]/)
-                print $i
-          }
-        ' ~/.ssh/config ~/.ssh/config.d/* /etc/ssh/ssh_config 2> /dev/null
-      ) \
-              <(
-        __fzf_exec_awk -F ',' '
-          match($0, /^[][a-zA-Z0-9.,:-]+/) {
-            $0 = substr($0, 1, RLENGTH)
-            gsub(/[][]|:[^,]*/, "")
-            for (i = 1; i <= NF; i++)
-              print $i
-          }
-        ' ~/.ssh/known_hosts 2> /dev/null
-      ) \
-              <(
-        __fzf_exec_awk '
-          {
-            sub(/#.*/, "")
-            for (i = 2; i <= NF; i++)
-              if ($i != "0.0.0.0")
-                print $i
-          }
-        ' /etc/hosts 2> /dev/null
-      )
-    }
-  fi
-
-  _fzf_host_completion() {
-    _fzf_complete +m -- "$@" < <(__fzf_list_hosts)
-  }
-
-  # Values for $1 $2 $3 are described here
-  # https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion.html
-  # > the first argument ($1) is the name of the command whose arguments are being completed,
-  # > the second argument ($2) is the word being completed,
-  # > and the third argument ($3) is the word preceding the word being completed on the current command line.
-  _fzf_complete_ssh() {
-    case $3 in
-      -i | -F | -E)
-        _fzf_path_completion "$@"
-        ;;
-      *)
-        local user=
-        [[ $2 =~ '@' ]] && user="${2%%@*}@"
-        _fzf_complete +m -- "$@" < <(__fzf_list_hosts | __fzf_exec_awk -v user="$user" '{print user $0}')
-        ;;
-    esac
-  }
-
-  _fzf_var_completion() {
-    _fzf_complete -m -- "$@" < <(
-      declare -xp | command sed -En 's|^declare [^ ]+ ([^=]+).*|\1|p'
-    )
-  }
-
-  _fzf_alias_completion() {
-    _fzf_complete -m -- "$@" < <(
-      alias | command sed -En 's|^alias ([^=]+).*|\1|p'
-    )
-  }
-
-  # fzf options
-  complete -o default -F _fzf_opts_completion fzf
-  # fzf-tmux is a thin fzf wrapper that has only a few more options than fzf
-  # itself. As a quick improvement we take fzf's completion. Adding the few extra
-  # fzf-tmux specific options (like `-w WIDTH`) are left as a future patch.
-  complete -o default -F _fzf_opts_completion fzf-tmux
-
-  # Default path completion
-  __fzf_default_completion() {
-    __fzf_generic_path_completion _fzf_compgen_path "-m" "" "$@"
-
-    # Dynamic completion loader has updated the completion for the command
-    if [[ $? -eq 124 ]]; then
-      # We trigger _fzf_setup_completion so that fuzzy completion for the command
-      # still works. However, loader can update the completion for multiple
-      # commands at once, and fuzzy completion will no longer work for those
-      # other commands. e.g. pytest -> py.test, pytest-2, pytest-3, etc
-      _fzf_setup_completion path "$1"
-      return 124
-    fi
-  }
-
-  # Set fuzzy path completion as the default completion for all commands.
-  # We can't set up default completion,
-  # 1. if it's already set up by another script
-  # 2. or if the current version of bash doesn't support -D option
-  complete | command grep -q __fzf_default_completion ||
-    complete | command grep -- '-D$' | command grep -qv _comp_complete_load ||
-    complete -D -F __fzf_default_completion -o default -o bashdefault 2> /dev/null
-
-  d_cmds="${FZF_COMPLETION_DIR_COMMANDS-cd pushd rmdir}"
-
-  # NOTE: $FZF_COMPLETION_PATH_COMMANDS and $FZF_COMPLETION_VAR_COMMANDS are
-  # undocumented and subject to change in the future.
-  #
-  # NOTE: Although we have default completion, we still need to set up completion
-  # for each command in case they already have completion set up by another script.
-  a_cmds="${FZF_COMPLETION_PATH_COMMANDS-"
-  awk bat cat code diff diff3
-  emacs emacsclient ex file ftp g++ gcc gvim head hg hx java
-  javac ld less more mvim nvim patch perl python ruby
-  sed sftp sort source tail tee uniq vi view vim wc xdg-open
-  basename bunzip2 bzip2 chmod chown curl cp dirname du
-  find git grep gunzip gzip hg jar
-  ln ls mv open rm rsync scp
-  svn tar unzip zip"}"
-  v_cmds="${FZF_COMPLETION_VAR_COMMANDS-export unset printenv}"
-
-  # Preserve existing completion
-  # iank: added ||: at the end, exit is nonzero due to some commands not having a completion spec.
-  __fzf_orig_completion < <(complete -p $d_cmds $a_cmds $v_cmds unalias kill ssh 2> /dev/null ||:)
-
-  if type _comp_load > /dev/null 2>&1; then
-    # _comp_load was added in bash-completion 2.12 to replace _completion_loader.
-    # We use it without -D option so that it does not use _comp_complete_minimal as the fallback.
-    _fzf_completion_loader=_comp_load
-  elif type __load_completion > /dev/null 2>&1; then
-    # In bash-completion 2.11, _completion_loader internally calls __load_completion
-    # and if it returns a non-zero status, it sets the default 'minimal' completion.
-    _fzf_completion_loader=__load_completion
-  elif type _completion_loader > /dev/null 2>&1; then
-    _fzf_completion_loader=_completion_loader
-  fi
-
-  __fzf_defc() {
-    local cmd func opts REPLY
-    cmd="$1"
-    func="$2"
-    opts="$3"
-    if __fzf_orig_completion_instantiate "$cmd" "$func"; then
-      eval "$REPLY"
-    else
-      eval "complete -F \"$func\" $opts \"$cmd\""
-    fi
-  }
-
-  # Anything
-  for cmd in $a_cmds; do
-    __fzf_defc "$cmd" _fzf_path_completion "-o default -o bashdefault"
-  done
-
-  # Directory
-  for cmd in $d_cmds; do
-    __fzf_defc "$cmd" _fzf_dir_completion "-o bashdefault -o nospace -o dirnames"
-  done
-
-  # Variables
-  for cmd in $v_cmds; do
-    __fzf_defc "$cmd" _fzf_var_completion "-o default -o nospace -v"
-  done
-
-  # Aliases
-  __fzf_defc unalias _fzf_alias_completion "-a"
-
-  # Processes
-  __fzf_defc kill _fzf_proc_completion "-o default -o bashdefault"
-
-  # ssh
-  __fzf_defc ssh _fzf_complete_ssh "-o default -o bashdefault"
-
-  unset cmd d_cmds a_cmds v_cmds
-
-  _fzf_setup_completion() {
-    local kind fn cmd
-    kind=$1
-    fn=_fzf_${1}_completion
-    if [[ $# -lt 2 ]] || ! type -t "$fn" > /dev/null; then
-      echo "usage: ${FUNCNAME[0]} path|dir|var|alias|host|proc COMMANDS..."
-      return 1
-    fi
-    shift
-    __fzf_orig_completion < <(complete -p "$@" 2> /dev/null)
-    for cmd in "$@"; do
-      case "$kind" in
-        dir) __fzf_defc "$cmd" "$fn" "-o nospace -o dirnames" ;;
-        var) __fzf_defc "$cmd" "$fn" "-o default -o nospace -v" ;;
-        alias) __fzf_defc "$cmd" "$fn" "-a" ;;
-        *) __fzf_defc "$cmd" "$fn" "-o default -o bashdefault" ;;
-      esac
-    done
-  }
-  #----END shfmt
-
-fi
-### end: completion.bash ###
-
-
-# ensure no bad programs appending to this file will have an affect
-return 0
diff --git a/brc3 b/brc3
index e427d19489102faaacb0b3d739fd2ec1ca422684..abfc4530a13f7b9e5b520971dbd93265a5f6a6ac 100644 (file)
--- a/brc3
+++ b/brc3
@@ -126,7 +126,8 @@ schroot-cleanup() {
 # regex="("$'\n'"|^)$string("$'\n'"|$)"
 
 name-list-test() {
-  local t=$(mktemp)
+  local t
+  t=$(mktemp)
   cat >$t <<'EOF'
 bonny (destroyer) williams
 Sean O'brien
@@ -137,7 +138,8 @@ EOF
   cat $t
 }
 name-list-clean() {
-  local tmp=$(mktemp)
+  local tmp
+  tmp=$(mktemp)
   cat >$tmp <<'EOF'
 # aliases
 s/'[^']+'//g;
index 1c32607396c4cf6e96b3df722c35d10a7970ee6c..f864a3f4bc5a0b5700f1ef6b77caf69ef8c429d3 100755 (executable)
@@ -46,6 +46,7 @@ esac
 # https://docs.nextcloud.com/server/latest/admin_manual/maintenance/restore.html
 if $restore; then
   set -x
+  # shellcheck disable=SC2043 # intentional
   for ncdir in /var/www/ncninja; do
     ncbase=${ncdir##*/}
     ssh root@$host sudo -u www-data php $ncdir/occ -q maintenance:mode --on ||: # might not be running
@@ -64,6 +65,7 @@ fi
 ret=0
 if [[ $HOSTNAME == "$MAIL_HOST" ]]; then
   mkdir -p /p/bkbackup
+  # shellcheck disable=SC2043 # intentional
   for ncdir in /var/www/ncninja; do
     ncbase=${ncdir##*/}
     mkdir -p /p/bkbackup/$ncbase
diff --git a/fzf-brc b/fzf-brc
new file mode 100644 (file)
index 0000000..eb17d7d
--- /dev/null
+++ b/fzf-brc
@@ -0,0 +1,870 @@
+#####  this is from output of fzf --bash plus a small modification to
+# prevent a command from reporting a superflous nonzero exit, search for
+# iank below.
+
+### key-bindings.bash ###
+#     ____      ____
+#    / __/___  / __/
+#   / /_/_  / / /_
+#  / __/ / /_/ __/
+# /_/   /___/_/ key-bindings.bash
+#
+# - $FZF_TMUX_OPTS
+# - $FZF_CTRL_T_COMMAND
+# - $FZF_CTRL_T_OPTS
+# - $FZF_CTRL_R_COMMAND
+# - $FZF_CTRL_R_OPTS
+# - $FZF_ALT_C_COMMAND
+# - $FZF_ALT_C_OPTS
+
+if [[ $- =~ i ]]; then
+
+
+  # Key bindings
+  # ------------
+
+  #----BEGIN shfmt
+  #----BEGIN INCLUDE common.sh
+  # NOTE: Do not directly edit this section, which is copied from "common.sh".
+  # To modify it, one can edit "common.sh" and run "./update.sh" to apply
+  # the changes. See code comments in "common.sh" for the implementation details.
+
+  __fzf_defaults() {
+    printf '%s\n' "--height ${FZF_TMUX_HEIGHT:-40%} --min-height 20+ --bind=ctrl-z:ignore $1"
+    command cat "${FZF_DEFAULT_OPTS_FILE-}" 2> /dev/null
+    printf '%s\n' "${FZF_DEFAULT_OPTS-} $2"
+  }
+
+  __fzf_exec_awk() {
+    if [[ -z ${__fzf_awk-} ]]; then
+      __fzf_awk=awk
+      if [[ $OSTYPE == solaris* && -x /usr/xpg4/bin/awk ]]; then
+        __fzf_awk=/usr/xpg4/bin/awk
+      elif command -v mawk > /dev/null 2>&1; then
+        local n x y z d
+        IFS=' .' read -r n x y z d <<< $(command mawk -W version 2> /dev/null)
+        [[ $n == mawk ]] && ((d >= 20230302 && (x * 1000 + y) * 1000 + z >= 1003004)) && __fzf_awk=mawk
+      fi
+    fi
+    LC_ALL=C exec "$__fzf_awk" "$@"
+  }
+  #----END INCLUDE
+
+  __fzf_select__() {
+    FZF_DEFAULT_COMMAND=${FZF_CTRL_T_COMMAND:-} \
+                       FZF_DEFAULT_OPTS=$(__fzf_defaults "--reverse --walker=file,dir,follow,hidden --scheme=path" "${FZF_CTRL_T_OPTS-} -m") \
+                       FZF_DEFAULT_OPTS_FILE='' $(__fzfcmd) "$@" |
+      while read -r item; do
+        printf '%q ' "$item" # escape special chars
+      done
+  }
+
+  __fzfcmd() {
+    [[ -n ${TMUX_PANE-} ]] && { [[ ${FZF_TMUX:-0} != 0 ]] || [[ -n ${FZF_TMUX_OPTS-} ]]; } &&
+      echo "fzf-tmux ${FZF_TMUX_OPTS:--d${FZF_TMUX_HEIGHT:-40%}} -- " || echo "fzf"
+  }
+
+  fzf-file-widget() {
+    local selected="$(__fzf_select__ "$@")"
+    READLINE_LINE="${READLINE_LINE:0:READLINE_POINT}$selected${READLINE_LINE:READLINE_POINT}"
+    READLINE_POINT=$((READLINE_POINT + ${#selected}))
+  }
+
+  __fzf_cd__() {
+    local dir
+    dir=$(
+      FZF_DEFAULT_COMMAND=${FZF_ALT_C_COMMAND:-} \
+                         FZF_DEFAULT_OPTS=$(__fzf_defaults "--reverse --walker=dir,follow,hidden --scheme=path" "${FZF_ALT_C_OPTS-} +m") \
+                         FZF_DEFAULT_OPTS_FILE='' $(__fzfcmd)
+       ) && printf 'builtin cd -- %q' "$(builtin unset CDPATH && builtin cd -- "$dir" && builtin pwd)"
+  }
+
+  if command -v perl > /dev/null; then
+    __fzf_history__() {
+      local output script
+      script='BEGIN { getc; $/ = "\n\t"; $HISTCOUNT = $ENV{last_hist} + 1 } s/^[ *]//; s/\n/\n\t/gm; print $HISTCOUNT - $. . "\t$_" if !$seen{$_}++'
+      output=$(
+        set +o pipefail
+        builtin fc -lnr -2147483648 |
+          last_hist=$(HISTTIMEFORMAT='' builtin history 1) command perl -n -l0 -e "$script" |
+          FZF_DEFAULT_OPTS=$(__fzf_defaults "" "-n2..,.. --scheme=history --bind=ctrl-r:toggle-sort,alt-r:toggle-raw --wrap-sign '"$'\t'"↳ ' --highlight-line ${FZF_CTRL_R_OPTS-} +m --read0") \
+                          FZF_DEFAULT_OPTS_FILE='' $(__fzfcmd) --query "$READLINE_LINE"
+            ) || return
+      READLINE_LINE=$(command perl -pe 's/^\d*\t//' <<< "$output")
+      if [[ -z $READLINE_POINT ]]; then
+        echo "$READLINE_LINE"
+      else
+        READLINE_POINT=0x7fffffff
+      fi
+    }
+  else # awk - fallback for POSIX systems
+    __fzf_history__() {
+      local output script
+      [[ $(HISTTIMEFORMAT='' builtin history 1) =~ [[:digit:]]+ ]] # how many history entries
+      script='function P(b) { ++n; sub(/^[ *]/, "", b); if (!seen[b]++) { printf "%d\t%s%c", '$((BASH_REMATCH + 1))' - n, b, 0 } }
+    NR==1 { b = substr($0, 2); next }
+    /^\t/ { P(b); b = substr($0, 2); next }
+    { b = b RS $0 }
+    END { if (NR) P(b) }'
+      output=$(
+        set +o pipefail
+        builtin fc -lnr -2147483648 2> /dev/null | # ( $'\t '<lines>$'\n' )* ; <lines> ::= [^\n]* ( $'\n'<lines> )*
+          __fzf_exec_awk "$script" |               # ( <counter>$'\t'<lines>$'\000' )*
+          FZF_DEFAULT_OPTS=$(__fzf_defaults "" "-n2..,.. --scheme=history --bind=ctrl-r:toggle-sort,alt-r:toggle-raw --wrap-sign '"$'\t'"↳ ' --highlight-line ${FZF_CTRL_R_OPTS-} +m --read0") \
+                          FZF_DEFAULT_OPTS_FILE='' $(__fzfcmd) --query "$READLINE_LINE"
+            ) || return
+      READLINE_LINE=${output#*$'\t'}
+      if [[ -z $READLINE_POINT ]]; then
+        echo "$READLINE_LINE"
+      else
+        READLINE_POINT=0x7fffffff
+      fi
+    }
+  fi
+
+  # Required to refresh the prompt after fzf
+  bind -m emacs-standard '"\er": redraw-current-line'
+
+  bind -m vi-command '"\C-z": emacs-editing-mode'
+  bind -m vi-insert '"\C-z": emacs-editing-mode'
+  bind -m emacs-standard '"\C-z": vi-editing-mode'
+
+  if ((BASH_VERSINFO[0] < 4)); then
+    # CTRL-T - Paste the selected file path into the command line
+    if [[ ${FZF_CTRL_T_COMMAND-x} != "" ]]; then
+      bind -m emacs-standard '"\C-t": " \C-b\C-k \C-u`__fzf_select__`\e\C-e\er\C-a\C-y\C-h\C-e\e \C-y\ey\C-x\C-x\C-f\C-y\ey\C-_"'
+      bind -m vi-command '"\C-t": "\C-z\C-t\C-z"'
+      bind -m vi-insert '"\C-t": "\C-z\C-t\C-z"'
+    fi
+
+    # CTRL-R - Paste the selected command from history into the command line
+    if [[ ${FZF_CTRL_R_COMMAND-x} != "" ]]; then
+      if [[ -n ${FZF_CTRL_R_COMMAND-} ]]; then
+        echo "warning: FZF_CTRL_R_COMMAND is set to a custom command, but custom commands are not yet supported for CTRL-R" >&2
+      fi
+      bind -m emacs-standard '"\C-r": "\C-e \C-u\C-y\ey\C-u`__fzf_history__`\e\C-e\er"'
+      bind -m vi-command '"\C-r": "\C-z\C-r\C-z"'
+      bind -m vi-insert '"\C-r": "\C-z\C-r\C-z"'
+    fi
+  else
+    # CTRL-T - Paste the selected file path into the command line
+    if [[ ${FZF_CTRL_T_COMMAND-x} != "" ]]; then
+      bind -m emacs-standard -x '"\C-t": fzf-file-widget'
+      bind -m vi-command -x '"\C-t": fzf-file-widget'
+      bind -m vi-insert -x '"\C-t": fzf-file-widget'
+    fi
+
+    # CTRL-R - Paste the selected command from history into the command line
+    if [[ ${FZF_CTRL_R_COMMAND-x} != "" ]]; then
+      if [[ -n ${FZF_CTRL_R_COMMAND-} ]]; then
+        echo "warning: FZF_CTRL_R_COMMAND is set to a custom command, but custom commands are not yet supported for CTRL-R" >&2
+      fi
+      bind -m emacs-standard -x '"\C-r": __fzf_history__'
+      bind -m vi-command -x '"\C-r": __fzf_history__'
+      bind -m vi-insert -x '"\C-r": __fzf_history__'
+    fi
+  fi
+
+  # ALT-C - cd into the selected directory
+  if [[ ${FZF_ALT_C_COMMAND-x} != "" ]]; then
+    bind -m emacs-standard '"\ec": " \C-b\C-k \C-u`__fzf_cd__`\e\C-e\er\C-m\C-y\C-h\e \C-y\ey\C-x\C-x\C-d\C-y\ey\C-_"'
+    bind -m vi-command '"\ec": "\C-z\ec\C-z"'
+    bind -m vi-insert '"\ec": "\C-z\ec\C-z"'
+  fi
+  #----END shfmt
+
+fi
+### end: key-bindings.bash ###
+### completion.bash ###
+#     ____      ____
+#    / __/___  / __/
+#   / /_/_  / / /_
+#  / __/ / /_/ __/
+# /_/   /___/_/ completion.bash
+#
+# - $FZF_TMUX                 (default: 0)
+# - $FZF_TMUX_OPTS            (default: empty)
+# - $FZF_COMPLETION_TRIGGER   (default: '**')
+# - $FZF_COMPLETION_OPTS      (default: empty)
+# - $FZF_COMPLETION_PATH_OPTS (default: empty)
+# - $FZF_COMPLETION_DIR_OPTS  (default: empty)
+
+if [[ $- =~ i ]]; then
+
+
+  # To use custom commands instead of find, override _fzf_compgen_{path,dir}
+  #
+  #   _fzf_compgen_path() {
+  #     echo "$1"
+  #     command find -L "$1" \
+    #       -name .git -prune -o -name .hg -prune -o -name .svn -prune -o \( -type d -o -type f -o -type l \) \
+    #       -a -not -path "$1" -print 2> /dev/null | command sed 's@^\./@@'
+  #   }
+  #
+  #   _fzf_compgen_dir() {
+  #     command find -L "$1" \
+    #       -name .git -prune -o -name .hg -prune -o -name .svn -prune -o -type d \
+    #       -a -not -path "$1" -print 2> /dev/null | command sed 's@^\./@@'
+  #   }
+
+  ###########################################################
+
+  #----BEGIN shfmt
+  #----BEGIN INCLUDE common.sh
+  # NOTE: Do not directly edit this section, which is copied from "common.sh".
+  # To modify it, one can edit "common.sh" and run "./update.sh" to apply
+  # the changes. See code comments in "common.sh" for the implementation details.
+
+  __fzf_defaults() {
+    printf '%s\n' "--height ${FZF_TMUX_HEIGHT:-40%} --min-height 20+ --bind=ctrl-z:ignore $1"
+    command cat "${FZF_DEFAULT_OPTS_FILE-}" 2> /dev/null
+    printf '%s\n' "${FZF_DEFAULT_OPTS-} $2"
+  }
+
+  __fzf_exec_awk() {
+    if [[ -z ${__fzf_awk-} ]]; then
+      __fzf_awk=awk
+      if [[ $OSTYPE == solaris* && -x /usr/xpg4/bin/awk ]]; then
+        __fzf_awk=/usr/xpg4/bin/awk
+      elif command -v mawk > /dev/null 2>&1; then
+        local n x y z d
+        IFS=' .' read -r n x y z d <<< $(command mawk -W version 2> /dev/null)
+        [[ $n == mawk ]] && ((d >= 20230302 && (x * 1000 + y) * 1000 + z >= 1003004)) && __fzf_awk=mawk
+      fi
+    fi
+    LC_ALL=C exec "$__fzf_awk" "$@"
+  }
+  #----END INCLUDE
+
+  __fzf_comprun() {
+    if [[ "$(type -t _fzf_comprun 2>&1)" == function ]]; then
+      _fzf_comprun "$@"
+    elif [[ -n ${TMUX_PANE-} ]] && { [[ ${FZF_TMUX:-0} != 0 ]] || [[ -n ${FZF_TMUX_OPTS-} ]]; }; then
+      shift
+      fzf-tmux ${FZF_TMUX_OPTS:--d${FZF_TMUX_HEIGHT:-40%}} -- "$@"
+    else
+      shift
+      fzf "$@"
+    fi
+  }
+
+  __fzf_orig_completion() {
+    local l comp f cmd
+    while read -r l; do
+      if [[ $l =~ ^(.*\ -F)\ *([^ ]*).*\ ([^ ]*)$ ]]; then
+        comp="${BASH_REMATCH[1]}"
+        f="${BASH_REMATCH[2]}"
+        cmd="${BASH_REMATCH[3]}"
+        [[ $f == _fzf_* ]] && continue
+        printf -v "_fzf_orig_completion_${cmd//[^A-Za-z0-9_]/_}" "%s" "${comp} %s ${cmd} #${f}"
+        if [[ $l == *" -o nospace "* ]] && [[ ${__fzf_nospace_commands-} != *" $cmd "* ]]; then
+          __fzf_nospace_commands="${__fzf_nospace_commands-} $cmd "
+        fi
+      fi
+    done
+  }
+
+  # @param $1 cmd - Command name for which the original completion is searched
+  # @var[out] REPLY - Original function name is returned
+  __fzf_orig_completion_get_orig_func() {
+    local cmd orig_var orig
+    cmd=$1
+    orig_var="_fzf_orig_completion_${cmd//[^A-Za-z0-9_]/_}"
+    orig="${!orig_var-}"
+    REPLY="${orig##*#}"
+    [[ $REPLY ]] && type "$REPLY" &> /dev/null
+  }
+
+  # @param $1 cmd - Command name for which the original completion is searched
+  # @param $2 func - Fzf's completion function to replace the original function
+  # @var[out] REPLY - Completion setting is returned as a string to "eval"
+  __fzf_orig_completion_instantiate() {
+    local cmd func orig_var orig
+    cmd=$1
+    func=$2
+    orig_var="_fzf_orig_completion_${cmd//[^A-Za-z0-9_]/_}"
+    orig="${!orig_var-}"
+    orig="${orig%#*}"
+    [[ $orig == *' %s '* ]] || return 1
+    printf -v REPLY "$orig" "$func"
+  }
+
+  _fzf_opts_completion() {
+    local cur prev opts
+    COMPREPLY=()
+    cur="${COMP_WORDS[COMP_CWORD]}"
+    prev="${COMP_WORDS[COMP_CWORD - 1]}"
+    opts="
+    +c --no-color
+    +i --no-ignore-case
+    +s --no-sort
+    +x --no-extended
+    --ansi
+    --bash
+    --bind
+    --border
+    --border-label
+    --border-label-pos
+    --color
+    --cycle
+    --disabled
+    --ellipsis
+    --expect
+    --filepath-word
+    --fish
+    --header
+    --header-first
+    --header-lines
+    --height
+    --highlight-line
+    --history
+    --history-size
+    --hscroll-off
+    --info
+    --jump-labels
+    --keep-right
+    --layout
+    --listen
+    --listen-unsafe
+    --literal
+    --man
+    --margin
+    --marker
+    --min-height
+    --no-bold
+    --no-clear
+    --no-hscroll
+    --no-mouse
+    --no-scrollbar
+    --no-separator
+    --no-unicode
+    --padding
+    --pointer
+    --preview
+    --preview-label
+    --preview-label-pos
+    --preview-window
+    --print-query
+    --print0
+    --prompt
+    --read0
+    --reverse
+    --scheme
+    --scroll-off
+    --separator
+    --sync
+    --tabstop
+    --tac
+    --tiebreak
+    --tmux
+    --track
+    --version
+    --with-nth
+    --with-shell
+    --wrap
+    --zsh
+    -0 --exit-0
+    -1 --select-1
+    -d --delimiter
+    -e --exact
+    -f --filter
+    -h --help
+    -i --ignore-case
+    -m --multi
+    -n --nth
+    -q --query
+    --"
+
+    case "${prev}" in
+      --scheme)
+        COMPREPLY=($(compgen -W "default path history" -- "$cur"))
+        return 0
+        ;;
+      --tiebreak)
+        COMPREPLY=($(compgen -W "length chunk begin end index" -- "$cur"))
+        return 0
+        ;;
+      --color)
+        COMPREPLY=($(compgen -W "dark light 16 bw no" -- "$cur"))
+        return 0
+        ;;
+      --layout)
+        COMPREPLY=($(compgen -W "default reverse reverse-list" -- "$cur"))
+        return 0
+        ;;
+      --info)
+        COMPREPLY=($(compgen -W "default right hidden inline inline-right" -- "$cur"))
+        return 0
+        ;;
+      --preview-window)
+        COMPREPLY=($(compgen -W "
+      default
+      hidden
+      nohidden
+      wrap
+      nowrap
+      cycle
+      nocycle
+      up top
+      down bottom
+      left
+      right
+      rounded border border-rounded
+      sharp border-sharp
+      border-bold
+      border-block
+      border-thinblock
+      border-double
+      noborder border-none
+      border-horizontal
+      border-vertical
+      border-up border-top
+      border-down border-bottom
+      border-left
+      border-right
+      follow
+      nofollow" -- "$cur"))
+        return 0
+        ;;
+      --border)
+        COMPREPLY=($(compgen -W "rounded sharp bold block thinblock double horizontal vertical top bottom left right none" -- "$cur"))
+        return 0
+        ;;
+      --border-label-pos | --preview-label-pos)
+        COMPREPLY=($(compgen -W "center bottom top" -- "$cur"))
+        return 0
+        ;;
+    esac
+
+    if [[ $cur =~ ^-|\+ ]]; then
+      COMPREPLY=($(compgen -W "${opts}" -- "$cur"))
+      return 0
+    fi
+
+    return 0
+  }
+
+  _fzf_handle_dynamic_completion() {
+    local cmd ret REPLY orig_cmd orig_complete
+    cmd="$1"
+    shift
+    orig_cmd="$1"
+    if __fzf_orig_completion_get_orig_func "$cmd"; then
+      "$REPLY" "$@"
+    elif [[ -n ${_fzf_completion_loader-} ]]; then
+      orig_complete=$(complete -p "$orig_cmd" 2> /dev/null)
+      $_fzf_completion_loader "$@"
+      ret=$?
+      # _completion_loader may not have updated completion for the command
+      if [[ "$(complete -p "$orig_cmd" 2> /dev/null)" != "$orig_complete" ]]; then
+        __fzf_orig_completion < <(complete -p "$orig_cmd" 2> /dev/null)
+        __fzf_orig_completion_get_orig_func "$cmd" || ret=1
+
+        # Update orig_complete by _fzf_orig_completion entry
+        [[ $orig_complete =~ ' -F '(_fzf_[^ ]+)' ' ]] &&
+          __fzf_orig_completion_instantiate "$cmd" "${BASH_REMATCH[1]}" &&
+          orig_complete=$REPLY
+
+        if [[ ${__fzf_nospace_commands-} == *" $orig_cmd "* ]]; then
+          eval "${orig_complete/ -F / -o nospace -F }"
+        else
+          eval "$orig_complete"
+        fi
+      fi
+      [[ $ret -eq 0 ]] && return 124
+      return $ret
+    fi
+  }
+
+  __fzf_generic_path_completion() {
+    local cur base dir leftover matches trigger cmd
+    cmd="${COMP_WORDS[0]}"
+    if [[ $cmd == \\* ]]; then
+      cmd="${cmd:1}"
+    fi
+    COMPREPLY=()
+    trigger=${FZF_COMPLETION_TRIGGER-'**'}
+    [[ $COMP_CWORD -ge 0 ]] && cur="${COMP_WORDS[COMP_CWORD]}"
+    if [[ $cur == *"$trigger" ]] && [[ $cur != *'$('* ]] && [[ $cur != *':='* ]] && [[ $cur != *'`'* ]]; then
+      base=${cur:0:${#cur}-${#trigger}}
+      eval "base=$base" 2> /dev/null || return
+
+      dir=
+      [[ $base == *"/"* ]] && dir="$base"
+      while true; do
+        if [[ -z $dir ]] || [[ -d $dir ]]; then
+          leftover=${base/#"$dir"/}
+          leftover=${leftover/#\//}
+          [[ -z $dir ]] && dir='.'
+          [[ $dir != "/" ]] && dir="${dir/%\//}"
+          matches=$(
+            export FZF_DEFAULT_OPTS=$(__fzf_defaults "--reverse --scheme=path" "${FZF_COMPLETION_OPTS-} $2")
+            unset FZF_DEFAULT_COMMAND FZF_DEFAULT_OPTS_FILE
+            if declare -F "$1" > /dev/null; then
+              eval "$1 $(printf %q "$dir")" | __fzf_comprun "$4" -q "$leftover"
+            else
+              if [[ $1 =~ dir ]]; then
+                walker=dir,follow
+                eval "rest=(${FZF_COMPLETION_DIR_OPTS-})"
+              else
+                walker=file,dir,follow,hidden
+                eval "rest=(${FZF_COMPLETION_PATH_OPTS-})"
+              fi
+              __fzf_comprun "$4" -q "$leftover" --walker "$walker" --walker-root="$dir" "${rest[@]}"
+            fi | while read -r item; do
+              printf "%q " "${item%$3}$3"
+            done
+                 )
+          matches=${matches% }
+          [[ -z $3 ]] && [[ ${__fzf_nospace_commands-} == *" ${COMP_WORDS[0]} "* ]] && matches="$matches "
+          if [[ -n $matches ]]; then
+            COMPREPLY=("$matches")
+          else
+            COMPREPLY=("$cur")
+          fi
+          # To redraw line after fzf closes (printf '\e[5n')
+          bind '"\e[0n": redraw-current-line' 2> /dev/null
+          printf '\e[5n'
+          return 0
+        fi
+        dir=$(command dirname "$dir")
+        [[ $dir =~ /$ ]] || dir="$dir"/
+      done
+    else
+      shift
+      shift
+      shift
+      _fzf_handle_dynamic_completion "$cmd" "$@"
+    fi
+  }
+
+  _fzf_complete() {
+    # Split arguments around --
+    local args rest str_arg i sep
+    args=("$@")
+    sep=
+    for i in "${!args[@]}"; do
+      if [[ ${args[$i]} == -- ]]; then
+        sep=$i
+        break
+      fi
+    done
+    if [[ -n $sep ]]; then
+      str_arg=
+      rest=("${args[@]:$((sep + 1)):${#args[@]}}")
+      args=("${args[@]:0:sep}")
+    else
+      str_arg=$1
+      args=()
+      shift
+      rest=("$@")
+    fi
+
+    local cur selected trigger cmd post
+    post="$(caller 0 | __fzf_exec_awk '{print $2}')_post"
+    type -t "$post" > /dev/null 2>&1 || post='command cat'
+
+    trigger=${FZF_COMPLETION_TRIGGER-'**'}
+    cmd="${COMP_WORDS[0]}"
+    cur="${COMP_WORDS[COMP_CWORD]}"
+    if [[ $cur == *"$trigger" ]] && [[ $cur != *'$('* ]] && [[ $cur != *':='* ]] && [[ $cur != *'`'* ]]; then
+      cur=${cur:0:${#cur}-${#trigger}}
+
+      selected=$(
+        FZF_DEFAULT_OPTS=$(__fzf_defaults "--reverse" "${FZF_COMPLETION_OPTS-} $str_arg") \
+                        FZF_DEFAULT_OPTS_FILE='' \
+                        __fzf_comprun "${rest[0]}" "${args[@]}" -q "$cur" | eval "$post" | command tr '\n' ' '
+              )
+      selected=${selected% } # Strip trailing space not to repeat "-o nospace"
+      if [[ -n $selected ]]; then
+        COMPREPLY=("$selected")
+      else
+        COMPREPLY=("$cur")
+      fi
+      bind '"\e[0n": redraw-current-line' 2> /dev/null
+      printf '\e[5n'
+      return 0
+    else
+      _fzf_handle_dynamic_completion "$cmd" "${rest[@]}"
+    fi
+  }
+
+  _fzf_path_completion() {
+    __fzf_generic_path_completion _fzf_compgen_path "-m" "" "$@"
+  }
+
+  # Deprecated. No file only completion.
+  _fzf_file_completion() {
+    _fzf_path_completion "$@"
+  }
+
+  _fzf_dir_completion() {
+    __fzf_generic_path_completion _fzf_compgen_dir "" "/" "$@"
+  }
+
+  _fzf_complete_kill() {
+    _fzf_proc_completion "$@"
+  }
+
+  _fzf_proc_completion() {
+    local transformer
+    transformer='
+    if [[ $FZF_KEY =~ ctrl|alt|shift ]] && [[ -n $FZF_NTH ]]; then
+      nths=( ${FZF_NTH//,/ } )
+      new_nths=()
+      found=0
+      for nth in ${nths[@]}; do
+        if [[ $nth = $FZF_CLICK_HEADER_NTH ]]; then
+          found=1
+        else
+          new_nths+=($nth)
+        fi
+      done
+      [[ $found = 0 ]] && new_nths+=($FZF_CLICK_HEADER_NTH)
+      new_nths=${new_nths[*]}
+      new_nths=${new_nths// /,}
+      echo "change-nth($new_nths)+change-prompt($new_nths> )"
+    else
+      if [[ $FZF_NTH = $FZF_CLICK_HEADER_NTH ]]; then
+        echo "change-nth()+change-prompt(> )"
+      else
+        echo "change-nth($FZF_CLICK_HEADER_NTH)+change-prompt($FZF_CLICK_HEADER_WORD> )"
+      fi
+    fi
+  '
+    _fzf_complete -m --header-lines=1 --no-preview --wrap --color fg:dim,nth:regular \
+                  --bind "click-header:transform:$transformer" -- "$@" < <(
+      command ps -eo user,pid,ppid,start,time,command 2> /dev/null ||
+        command ps -eo user,pid,ppid,time,args 2> /dev/null || # For BusyBox
+        command ps --everyone --full --windows                 # For cygwin
+    )
+  }
+
+  _fzf_proc_completion_post() {
+    __fzf_exec_awk '{print $2}'
+  }
+
+  # To use custom hostname lists, override __fzf_list_hosts.
+  # The function is expected to print hostnames, one per line as well as in the
+  # desired sorting and with any duplicates removed, to standard output.
+  #
+  # e.g.
+  #   # Use bash-completions’s _known_hosts_real() for getting the list of hosts
+  #   __fzf_list_hosts() {
+  #     # Set the local attribute for any non-local variable that is set by _known_hosts_real()
+  #     local COMPREPLY=()
+  #     _known_hosts_real ''
+  #     printf '%s\n' "${COMPREPLY[@]}" | command sort -u --version-sort
+  #   }
+  if ! declare -F __fzf_list_hosts > /dev/null; then
+    __fzf_list_hosts() {
+      command sort -u \
+              <(
+        # Note: To make the pathname expansion of "~/.ssh/config.d/*" work
+        # properly, we need to adjust the related shell options.  We need to
+        # unset "set -f" and "GLOBIGNORE", which disable the pathname expansion
+        # totally or partially.  We need to unset "dotglob" and "nocaseglob" to
+        # avoid matching unwanted files.  We need to unset "failglob" to avoid
+        # outputting the error messages to the terminal when no matching is
+        # found.  We need to set "nullglob" to avoid attempting to read the
+        # literal filename '~/.ssh/config.d/*' when no matching is found.
+        set +f
+        GLOBIGNORE=
+        shopt -u dotglob nocaseglob failglob
+        shopt -s nullglob
+
+        __fzf_exec_awk '
+          # Note: mawk <= 1.3.3-20090705 does not support the POSIX brackets of
+          # the form [[:blank:]], and Ubuntu 18.04 LTS still uses this
+          # 16-year-old mawk unfortunately.  We need to use [ \t] instead.
+          match(tolower($0), /^[ \t]*host(name)?[ \t]*[ \t=]/) {
+            $0 = substr($0, RLENGTH + 1) # Remove "Host(name)?=?"
+            sub(/#.*/, "")
+            for (i = 1; i <= NF; i++)
+              if ($i !~ /[*?%]/)
+                print $i
+          }
+        ' ~/.ssh/config ~/.ssh/config.d/* /etc/ssh/ssh_config 2> /dev/null
+      ) \
+              <(
+        __fzf_exec_awk -F ',' '
+          match($0, /^[][a-zA-Z0-9.,:-]+/) {
+            $0 = substr($0, 1, RLENGTH)
+            gsub(/[][]|:[^,]*/, "")
+            for (i = 1; i <= NF; i++)
+              print $i
+          }
+        ' ~/.ssh/known_hosts 2> /dev/null
+      ) \
+              <(
+        __fzf_exec_awk '
+          {
+            sub(/#.*/, "")
+            for (i = 2; i <= NF; i++)
+              if ($i != "0.0.0.0")
+                print $i
+          }
+        ' /etc/hosts 2> /dev/null
+      )
+    }
+  fi
+
+  _fzf_host_completion() {
+    _fzf_complete +m -- "$@" < <(__fzf_list_hosts)
+  }
+
+  # Values for $1 $2 $3 are described here
+  # https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion.html
+  # > the first argument ($1) is the name of the command whose arguments are being completed,
+  # > the second argument ($2) is the word being completed,
+  # > and the third argument ($3) is the word preceding the word being completed on the current command line.
+  _fzf_complete_ssh() {
+    case $3 in
+      -i | -F | -E)
+        _fzf_path_completion "$@"
+        ;;
+      *)
+        local user=
+        [[ $2 =~ '@' ]] && user="${2%%@*}@"
+        _fzf_complete +m -- "$@" < <(__fzf_list_hosts | __fzf_exec_awk -v user="$user" '{print user $0}')
+        ;;
+    esac
+  }
+
+  _fzf_var_completion() {
+    _fzf_complete -m -- "$@" < <(
+      declare -xp | command sed -En 's|^declare [^ ]+ ([^=]+).*|\1|p'
+    )
+  }
+
+  _fzf_alias_completion() {
+    _fzf_complete -m -- "$@" < <(
+      alias | command sed -En 's|^alias ([^=]+).*|\1|p'
+    )
+  }
+
+  # fzf options
+  complete -o default -F _fzf_opts_completion fzf
+  # fzf-tmux is a thin fzf wrapper that has only a few more options than fzf
+  # itself. As a quick improvement we take fzf's completion. Adding the few extra
+  # fzf-tmux specific options (like `-w WIDTH`) are left as a future patch.
+  complete -o default -F _fzf_opts_completion fzf-tmux
+
+  # Default path completion
+  __fzf_default_completion() {
+    __fzf_generic_path_completion _fzf_compgen_path "-m" "" "$@"
+
+    # Dynamic completion loader has updated the completion for the command
+    if [[ $? -eq 124 ]]; then
+      # We trigger _fzf_setup_completion so that fuzzy completion for the command
+      # still works. However, loader can update the completion for multiple
+      # commands at once, and fuzzy completion will no longer work for those
+      # other commands. e.g. pytest -> py.test, pytest-2, pytest-3, etc
+      _fzf_setup_completion path "$1"
+      return 124
+    fi
+  }
+
+  # Set fuzzy path completion as the default completion for all commands.
+  # We can't set up default completion,
+  # 1. if it's already set up by another script
+  # 2. or if the current version of bash doesn't support -D option
+  complete | command grep -q __fzf_default_completion ||
+    complete | command grep -- '-D$' | command grep -qv _comp_complete_load ||
+    complete -D -F __fzf_default_completion -o default -o bashdefault 2> /dev/null
+
+  d_cmds="${FZF_COMPLETION_DIR_COMMANDS-cd pushd rmdir}"
+
+  # NOTE: $FZF_COMPLETION_PATH_COMMANDS and $FZF_COMPLETION_VAR_COMMANDS are
+  # undocumented and subject to change in the future.
+  #
+  # NOTE: Although we have default completion, we still need to set up completion
+  # for each command in case they already have completion set up by another script.
+  a_cmds="${FZF_COMPLETION_PATH_COMMANDS-"
+  awk bat cat code diff diff3
+  emacs emacsclient ex file ftp g++ gcc gvim head hg hx java
+  javac ld less more mvim nvim patch perl python ruby
+  sed sftp sort source tail tee uniq vi view vim wc xdg-open
+  basename bunzip2 bzip2 chmod chown curl cp dirname du
+  find git grep gunzip gzip hg jar
+  ln ls mv open rm rsync scp
+  svn tar unzip zip"}"
+  v_cmds="${FZF_COMPLETION_VAR_COMMANDS-export unset printenv}"
+
+  # Preserve existing completion
+  # iank: added ||: at the end, exit is nonzero due to some commands not having a completion spec.
+  __fzf_orig_completion < <(complete -p $d_cmds $a_cmds $v_cmds unalias kill ssh 2> /dev/null ||:)
+
+  if type _comp_load > /dev/null 2>&1; then
+    # _comp_load was added in bash-completion 2.12 to replace _completion_loader.
+    # We use it without -D option so that it does not use _comp_complete_minimal as the fallback.
+    _fzf_completion_loader=_comp_load
+  elif type __load_completion > /dev/null 2>&1; then
+    # In bash-completion 2.11, _completion_loader internally calls __load_completion
+    # and if it returns a non-zero status, it sets the default 'minimal' completion.
+    _fzf_completion_loader=__load_completion
+  elif type _completion_loader > /dev/null 2>&1; then
+    _fzf_completion_loader=_completion_loader
+  fi
+
+  __fzf_defc() {
+    local cmd func opts REPLY
+    cmd="$1"
+    func="$2"
+    opts="$3"
+    if __fzf_orig_completion_instantiate "$cmd" "$func"; then
+      eval "$REPLY"
+    else
+      eval "complete -F \"$func\" $opts \"$cmd\""
+    fi
+  }
+
+  # Anything
+  for cmd in $a_cmds; do
+    __fzf_defc "$cmd" _fzf_path_completion "-o default -o bashdefault"
+  done
+
+  # Directory
+  for cmd in $d_cmds; do
+    __fzf_defc "$cmd" _fzf_dir_completion "-o bashdefault -o nospace -o dirnames"
+  done
+
+  # Variables
+  for cmd in $v_cmds; do
+    __fzf_defc "$cmd" _fzf_var_completion "-o default -o nospace -v"
+  done
+
+  # Aliases
+  __fzf_defc unalias _fzf_alias_completion "-a"
+
+  # Processes
+  __fzf_defc kill _fzf_proc_completion "-o default -o bashdefault"
+
+  # ssh
+  __fzf_defc ssh _fzf_complete_ssh "-o default -o bashdefault"
+
+  unset cmd d_cmds a_cmds v_cmds
+
+  _fzf_setup_completion() {
+    local kind fn cmd
+    kind=$1
+    fn=_fzf_${1}_completion
+    if [[ $# -lt 2 ]] || ! type -t "$fn" > /dev/null; then
+      echo "usage: ${FUNCNAME[0]} path|dir|var|alias|host|proc COMMANDS..."
+      return 1
+    fi
+    shift
+    __fzf_orig_completion < <(complete -p "$@" 2> /dev/null)
+    for cmd in "$@"; do
+      case "$kind" in
+        dir) __fzf_defc "$cmd" "$fn" "-o nospace -o dirnames" ;;
+        var) __fzf_defc "$cmd" "$fn" "-o default -o nospace -v" ;;
+        alias) __fzf_defc "$cmd" "$fn" "-a" ;;
+        *) __fzf_defc "$cmd" "$fn" "-o default -o bashdefault" ;;
+      esac
+    done
+  }
+  #----END shfmt
+
+fi
+### end: completion.bash ###
index a3e509a7fe2990f0b7ebb38fe499f39df12598ee..2a6c3a8ea7f155c4cd78fd0a813f19a42f4bd160 100755 (executable)
@@ -45,7 +45,7 @@ f=/etc/i3/config
 if [[ -e /etc/i3 && ! -w /etc/i3 ]]; then
   sudo chown -R iank:iank /etc/i3
 fi
-cat common.conf i3.conf $(if [[ -s ~/i3-myx.conf ]]; then echo ~/i3-myx.conf; fi) >$f
+cat common.conf i3.conf "$(if [[ -s ~/i3-myx.conf ]]; then echo ~/i3-myx.conf; fi)" >$f
 
 if [[ $I3SOCK ]]; then
   echo $0: i3-msg $i3_cmd
index f89abe70b2b30373fe2fdf554327058c8f8a6aa5..a5cd2506f48c41e519270c81a84d0e6cc64f337d 100755 (executable)
@@ -6,19 +6,28 @@ cd "$this_dir"
 
 . .bashrc
 
-# "a", as in, pass to sk -a
+tmp_brc2=$(mktemp)_brc2
+# "a", as in, pass to shk -a
 a_files=(
-  brc2
+  $tmp_brc2
   install-my-scripts
 )
 
 a_sourced_files=(
   script-files
   beet-data
+  beetag
+  bash_unpublished/source-semi-priv
 )
 
+ignore_files=(
+  fzf-brc
+  )
+
 declare -a ls_files standard_files
 
+sed 's/^# source fsf-script-lib # for shellcheck-this-repo/source fsf-script-lib/' brc2  >$tmp_brc2
+
 # so, shellcheck doesn't like files that declare variables that are just
 # used in other files that source them. Using -a like this is the only
 # way to solve it. We can't just -a on everything because then we would
@@ -30,14 +39,14 @@ tmp=$(git ls-files && git ls-files --others --exclude-standard)
 mapfile -t ls_files <<<"$tmp"
 for f in "${ls_files[@]}"; do
   skip=false
-  for fignore in ${a_files[@]} ${a_sourced_files[@]}; do
+  for fignore in ${ignore_files[@]} ${a_files[@]} ${a_sourced_files[@]}; do
     if [[ $f == "$fignore" ]]; then
       skip=true
       break
     fi
   done
   if $skip; then continue; fi
-  if sk-p "$f" && [[ $f != *.conf ]]; then
+  if shk-p "$f" && [[ $f != *.conf ]]; then
     standard_files+=("$f")
   fi
 done
index b9f2fe5c81a3ede785eb48f04642537770df46dd..eebb0789e5e857b03eb49d189d8949a88b91c775 100755 (executable)
@@ -469,9 +469,6 @@ write-status() {
 
 } # end write-status
 
-deactivated_sshd=false
-lock_check_fails=0
-
 # This prevents me having to mute notifications when I'm going to bed.
 mute() {
   local locked