From: Ian Kelling Date: Fri, 6 Feb 2026 03:23:29 +0000 (-0500) Subject: fix shellcheck, failed fzf sl experiment X-Git-Url: https://iankelling.org/git/?a=commitdiff_plain;h=c1ecd483fc204cd632b96b611f0b4cf8dc5a2793;p=distro-setup fix shellcheck, failed fzf sl experiment --- diff --git a/beetag b/beetag index c0d7ff6..38eb1cc 100755 --- 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 fde7dcb..0b5b6f7 100644 --- 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 372c7b2..6375a9c 100644 --- 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 '$'\n' )* ; ::= [^\n]* ( $'\n' )* - __fzf_exec_awk "$script" | # ( $'\t'$'\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 e427d19..abfc453 100644 --- 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; diff --git a/filesystem/usr/local/bin/bk-backup b/filesystem/usr/local/bin/bk-backup index 1c32607..f864a3f 100755 --- a/filesystem/usr/local/bin/bk-backup +++ b/filesystem/usr/local/bin/bk-backup @@ -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 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 '$'\n' )* ; ::= [^\n]* ( $'\n' )* + __fzf_exec_awk "$script" | # ( $'\t'$'\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 ### diff --git a/i3-sway/gen b/i3-sway/gen index a3e509a..2a6c3a8 100755 --- a/i3-sway/gen +++ b/i3-sway/gen @@ -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 diff --git a/shellcheck-this-repo b/shellcheck-this-repo index f89abe7..a5cd250 100755 --- a/shellcheck-this-repo +++ b/shellcheck-this-repo @@ -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 diff --git a/system-status b/system-status index b9f2fe5..eebb078 100755 --- a/system-status +++ b/system-status @@ -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