2013-11-19 16:29:36 +00:00
|
|
|
|
# ____ ____
|
|
|
|
|
# / __/___ / __/
|
|
|
|
|
# / /_/_ / / /_
|
|
|
|
|
# / __/ / /_/ __/
|
2020-03-31 13:18:09 +00:00
|
|
|
|
# /_/ /___/_/ completion.bash
|
2013-11-19 16:29:36 +00:00
|
|
|
|
#
|
2024-05-07 10:31:13 +00:00
|
|
|
|
# - $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)
|
2013-11-19 16:29:36 +00:00
|
|
|
|
|
2024-04-09 15:46:09 +00:00
|
|
|
|
if [[ $- =~ i ]]; then
|
2023-10-08 16:19:28 +00:00
|
|
|
|
|
2019-02-28 07:13:59 +00:00
|
|
|
|
|
2016-01-19 16:09:58 +00:00
|
|
|
|
# To use custom commands instead of find, override _fzf_compgen_{path,dir}
|
2024-03-13 11:56:31 +00:00
|
|
|
|
#
|
|
|
|
|
# _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@^\./@@'
|
|
|
|
|
# }
|
2016-01-19 16:09:58 +00:00
|
|
|
|
|
|
|
|
|
###########################################################
|
|
|
|
|
|
2017-01-07 16:30:31 +00:00
|
|
|
|
# To redraw line after fzf closes (printf '\e[5n')
|
2021-11-03 14:26:25 +00:00
|
|
|
|
bind '"\e[0n": redraw-current-line' 2> /dev/null
|
2017-01-07 16:30:31 +00:00
|
|
|
|
|
2024-04-19 13:40:38 +00:00
|
|
|
|
__fzf_defaults() {
|
|
|
|
|
# $1: Prepend to FZF_DEFAULT_OPTS_FILE and FZF_DEFAULT_OPTS
|
|
|
|
|
# $2: Append to FZF_DEFAULT_OPTS_FILE and FZF_DEFAULT_OPTS
|
|
|
|
|
echo "--height ${FZF_TMUX_HEIGHT:-40%} --bind=ctrl-z:ignore $1"
|
|
|
|
|
command cat "${FZF_DEFAULT_OPTS_FILE-}" 2> /dev/null
|
|
|
|
|
echo "${FZF_DEFAULT_OPTS-} $2"
|
|
|
|
|
}
|
|
|
|
|
|
2020-02-19 15:28:16 +00:00
|
|
|
|
__fzf_comprun() {
|
2021-08-14 11:33:21 +00:00
|
|
|
|
if [[ "$(type -t _fzf_comprun 2>&1)" = function ]]; then
|
2020-02-19 15:28:16 +00:00
|
|
|
|
_fzf_comprun "$@"
|
2022-10-16 08:15:19 +00:00
|
|
|
|
elif [[ -n "${TMUX_PANE-}" ]] && { [[ "${FZF_TMUX:-0}" != 0 ]] || [[ -n "${FZF_TMUX_OPTS-}" ]]; }; then
|
2020-02-19 15:28:16 +00:00
|
|
|
|
shift
|
2020-03-31 13:18:09 +00:00
|
|
|
|
fzf-tmux ${FZF_TMUX_OPTS:--d${FZF_TMUX_HEIGHT:-40%}} -- "$@"
|
2020-02-19 15:28:16 +00:00
|
|
|
|
else
|
|
|
|
|
shift
|
|
|
|
|
fzf "$@"
|
|
|
|
|
fi
|
2017-01-07 16:30:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
2020-11-11 14:44:47 +00:00
|
|
|
|
__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]}"
|
2020-11-13 15:59:29 +00:00
|
|
|
|
[[ "$f" = _fzf_* ]] && continue
|
2020-11-11 14:59:21 +00:00
|
|
|
|
printf -v "_fzf_orig_completion_${cmd//[^A-Za-z0-9_]/_}" "%s" "${comp} %s ${cmd} #${f}"
|
2022-10-16 08:15:19 +00:00
|
|
|
|
if [[ "$l" = *" -o nospace "* ]] && [[ ! "${__fzf_nospace_commands-}" = *" $cmd "* ]]; then
|
|
|
|
|
__fzf_nospace_commands="${__fzf_nospace_commands-} $cmd "
|
2020-11-11 14:44:47 +00:00
|
|
|
|
fi
|
|
|
|
|
fi
|
|
|
|
|
done
|
2014-07-17 15:22:49 +00:00
|
|
|
|
}
|
|
|
|
|
|
[bash] Refactor access to "_fzf_orig_complete_${cmd//[^A-Za-z0-9_]/_}"
In the current codebase, for the original completion settings, the
pieces of the codes to determine the variable name and to access the
stored data are scattered. In this patch, we define functions to
access these variables. Those functions will be used in a coming
patch.
* This patch also resolves an inconsistent escaping of "$cmd": $cmd is
escaped as ${...//[^A-Za-z0-9_]/_} in some places, but it is escaped
as ${...//[^A-Za-z0-9_=]/_} in some other places. The latter leaves
the character "=" in the command name, which causes an issue because
"=" cannot be a part of a variable name. For example, the following
test case produces an error message:
$ COMP_WORDBREAKS=${COMP_WORDBREAKS//=}
$ _test1() { COMPREPLY=(); }
$ complete -vF _test1 cmd.v=1.0
$ _fzf_setup_completion path cmd.v=1.0
$ cmd.v=1.0 [TAB]
bash: _fzf_orig_completion_cmd_v=1_0: invalid variable name
The behavior of leaving "=" was present from the beginning when
saving the original completion is introduced in commit 91401514, and
this does not seem to be a specific reasoning. In this patch, we
replace "=" as well as the other non-identifier characters.
* Note: In this patch, the variable REPLY is used to return values
from functions. This design is to make it useful with the value
substitutions, a new Bash feature of the next release 5.3, which is
taken from mksh.
2024-03-10 07:31:55 +00:00
|
|
|
|
# @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"
|
|
|
|
|
}
|
|
|
|
|
|
2013-11-19 16:29:36 +00:00
|
|
|
|
_fzf_opts_completion() {
|
2015-04-16 05:20:29 +00:00
|
|
|
|
local cur prev opts
|
2013-11-19 16:29:36 +00:00
|
|
|
|
COMPREPLY=()
|
|
|
|
|
cur="${COMP_WORDS[COMP_CWORD]}"
|
2015-04-16 05:20:29 +00:00
|
|
|
|
prev="${COMP_WORDS[COMP_CWORD-1]}"
|
2014-07-14 03:48:31 +00:00
|
|
|
|
opts="
|
2024-06-03 00:44:36 +00:00
|
|
|
|
+c --no-color
|
|
|
|
|
+i --no-ignore-case
|
|
|
|
|
+s --no-sort
|
2023-10-11 01:54:50 +00:00
|
|
|
|
+x --no-extended
|
2024-06-03 00:44:36 +00:00
|
|
|
|
--ansi
|
|
|
|
|
--bash
|
2023-10-11 01:54:50 +00:00
|
|
|
|
--bind
|
2024-06-03 00:44:36 +00:00
|
|
|
|
--border
|
|
|
|
|
--border-label
|
|
|
|
|
--border-label-pos
|
2023-10-11 01:54:50 +00:00
|
|
|
|
--color
|
2017-01-07 16:30:31 +00:00
|
|
|
|
--cycle
|
2024-06-03 00:44:36 +00:00
|
|
|
|
--disabled
|
|
|
|
|
--ellipsis
|
|
|
|
|
--expect
|
2023-10-11 01:54:50 +00:00
|
|
|
|
--filepath-word
|
2024-06-03 00:44:36 +00:00
|
|
|
|
--fish
|
2023-10-11 01:54:50 +00:00
|
|
|
|
--header
|
|
|
|
|
--header-first
|
2024-06-03 00:44:36 +00:00
|
|
|
|
--header-lines
|
2023-10-11 01:54:50 +00:00
|
|
|
|
--height
|
2024-06-03 00:44:36 +00:00
|
|
|
|
--highlight-line
|
|
|
|
|
--history
|
|
|
|
|
--history-size
|
|
|
|
|
--hscroll-off
|
|
|
|
|
--info
|
|
|
|
|
--jump-labels
|
|
|
|
|
--keep-right
|
|
|
|
|
--layout
|
|
|
|
|
--listen
|
|
|
|
|
--listen-unsafe
|
|
|
|
|
--literal
|
|
|
|
|
--man
|
|
|
|
|
--margin
|
|
|
|
|
--marker
|
2023-10-11 01:54:50 +00:00
|
|
|
|
--min-height
|
2024-06-03 00:44:36 +00:00
|
|
|
|
--no-bold
|
|
|
|
|
--no-clear
|
|
|
|
|
--no-hscroll
|
|
|
|
|
--no-mouse
|
|
|
|
|
--no-scrollbar
|
|
|
|
|
--no-separator
|
2023-10-11 01:54:50 +00:00
|
|
|
|
--no-unicode
|
|
|
|
|
--padding
|
2024-06-03 00:44:36 +00:00
|
|
|
|
--pointer
|
|
|
|
|
--preview
|
|
|
|
|
--preview-label
|
|
|
|
|
--preview-label-pos
|
|
|
|
|
--preview-window
|
|
|
|
|
--print-query
|
|
|
|
|
--print0
|
|
|
|
|
--prompt
|
|
|
|
|
--read0
|
|
|
|
|
--reverse
|
|
|
|
|
--scheme
|
|
|
|
|
--scroll-off
|
|
|
|
|
--separator
|
|
|
|
|
--sync
|
2023-10-11 01:54:50 +00:00
|
|
|
|
--tabstop
|
2024-06-03 00:44:36 +00:00
|
|
|
|
--tac
|
|
|
|
|
--tiebreak
|
|
|
|
|
--tmux
|
|
|
|
|
--track
|
2023-10-11 01:54:50 +00:00
|
|
|
|
--version
|
2024-06-03 00:44:36 +00:00
|
|
|
|
--with-nth
|
|
|
|
|
--with-shell
|
|
|
|
|
--zsh
|
|
|
|
|
-0 --exit-0
|
|
|
|
|
-1 --select-1
|
|
|
|
|
-d --delimiter
|
|
|
|
|
-e --exact
|
|
|
|
|
-f --filter
|
|
|
|
|
-h --help
|
|
|
|
|
-i --ignore-case
|
|
|
|
|
-m --multi
|
|
|
|
|
-n --nth
|
|
|
|
|
-q --query
|
2023-10-11 01:54:50 +00:00
|
|
|
|
--"
|
2013-11-19 16:29:36 +00:00
|
|
|
|
|
2015-04-16 05:20:29 +00:00
|
|
|
|
case "${prev}" in
|
2023-10-11 01:54:50 +00:00
|
|
|
|
--scheme)
|
|
|
|
|
COMPREPLY=( $(compgen -W "default path history" -- "$cur") )
|
|
|
|
|
return 0
|
|
|
|
|
;;
|
2015-04-16 05:20:29 +00:00
|
|
|
|
--tiebreak)
|
2023-10-11 01:54:50 +00:00
|
|
|
|
COMPREPLY=( $(compgen -W "length chunk begin end index" -- "$cur") )
|
2015-04-16 05:20:29 +00:00
|
|
|
|
return 0
|
|
|
|
|
;;
|
2015-04-23 13:43:48 +00:00
|
|
|
|
--color)
|
2023-10-11 01:54:50 +00:00
|
|
|
|
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") )
|
2015-04-23 13:43:48 +00:00
|
|
|
|
return 0
|
|
|
|
|
;;
|
2023-10-11 01:54:50 +00:00
|
|
|
|
--border-label-pos|--preview-label-pos)
|
|
|
|
|
COMPREPLY=( $(compgen -W "center bottom top" -- "$cur") )
|
2015-06-13 15:43:44 +00:00
|
|
|
|
return 0
|
|
|
|
|
;;
|
2015-04-16 05:20:29 +00:00
|
|
|
|
esac
|
|
|
|
|
|
2016-03-02 14:59:42 +00:00
|
|
|
|
if [[ "$cur" =~ ^-|\+ ]]; then
|
|
|
|
|
COMPREPLY=( $(compgen -W "${opts}" -- "$cur") )
|
2013-11-19 16:29:36 +00:00
|
|
|
|
return 0
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
return 0
|
|
|
|
|
}
|
|
|
|
|
|
2014-12-04 15:15:14 +00:00
|
|
|
|
_fzf_handle_dynamic_completion() {
|
[bash] Refactor access to "_fzf_orig_complete_${cmd//[^A-Za-z0-9_]/_}"
In the current codebase, for the original completion settings, the
pieces of the codes to determine the variable name and to access the
stored data are scattered. In this patch, we define functions to
access these variables. Those functions will be used in a coming
patch.
* This patch also resolves an inconsistent escaping of "$cmd": $cmd is
escaped as ${...//[^A-Za-z0-9_]/_} in some places, but it is escaped
as ${...//[^A-Za-z0-9_=]/_} in some other places. The latter leaves
the character "=" in the command name, which causes an issue because
"=" cannot be a part of a variable name. For example, the following
test case produces an error message:
$ COMP_WORDBREAKS=${COMP_WORDBREAKS//=}
$ _test1() { COMPREPLY=(); }
$ complete -vF _test1 cmd.v=1.0
$ _fzf_setup_completion path cmd.v=1.0
$ cmd.v=1.0 [TAB]
bash: _fzf_orig_completion_cmd_v=1_0: invalid variable name
The behavior of leaving "=" was present from the beginning when
saving the original completion is introduced in commit 91401514, and
this does not seem to be a specific reasoning. In this patch, we
replace "=" as well as the other non-identifier characters.
* Note: In this patch, the variable REPLY is used to return values
from functions. This design is to make it useful with the value
substitutions, a new Bash feature of the next release 5.3, which is
taken from mksh.
2024-03-10 07:31:55 +00:00
|
|
|
|
local cmd ret REPLY orig_cmd orig_complete
|
2014-12-04 15:15:14 +00:00
|
|
|
|
cmd="$1"
|
|
|
|
|
shift
|
2015-07-03 23:47:10 +00:00
|
|
|
|
orig_cmd="$1"
|
[bash] Refactor access to "_fzf_orig_complete_${cmd//[^A-Za-z0-9_]/_}"
In the current codebase, for the original completion settings, the
pieces of the codes to determine the variable name and to access the
stored data are scattered. In this patch, we define functions to
access these variables. Those functions will be used in a coming
patch.
* This patch also resolves an inconsistent escaping of "$cmd": $cmd is
escaped as ${...//[^A-Za-z0-9_]/_} in some places, but it is escaped
as ${...//[^A-Za-z0-9_=]/_} in some other places. The latter leaves
the character "=" in the command name, which causes an issue because
"=" cannot be a part of a variable name. For example, the following
test case produces an error message:
$ COMP_WORDBREAKS=${COMP_WORDBREAKS//=}
$ _test1() { COMPREPLY=(); }
$ complete -vF _test1 cmd.v=1.0
$ _fzf_setup_completion path cmd.v=1.0
$ cmd.v=1.0 [TAB]
bash: _fzf_orig_completion_cmd_v=1_0: invalid variable name
The behavior of leaving "=" was present from the beginning when
saving the original completion is introduced in commit 91401514, and
this does not seem to be a specific reasoning. In this patch, we
replace "=" as well as the other non-identifier characters.
* Note: In this patch, the variable REPLY is used to return values
from functions. This design is to make it useful with the value
substitutions, a new Bash feature of the next release 5.3, which is
taken from mksh.
2024-03-10 07:31:55 +00:00
|
|
|
|
if __fzf_orig_completion_get_orig_func "$cmd"; then
|
|
|
|
|
"$REPLY" "$@"
|
2022-10-16 08:15:19 +00:00
|
|
|
|
elif [[ -n "${_fzf_completion_loader-}" ]]; then
|
2019-04-30 17:35:51 +00:00
|
|
|
|
orig_complete=$(complete -p "$orig_cmd" 2> /dev/null)
|
2024-03-17 06:36:33 +00:00
|
|
|
|
$_fzf_completion_loader "$@"
|
2014-12-04 15:15:14 +00:00
|
|
|
|
ret=$?
|
2017-12-02 18:06:10 +00:00
|
|
|
|
# _completion_loader may not have updated completion for the command
|
2021-08-14 11:33:21 +00:00
|
|
|
|
if [[ "$(complete -p "$orig_cmd" 2> /dev/null)" != "$orig_complete" ]]; then
|
2020-11-11 14:44:47 +00:00
|
|
|
|
__fzf_orig_completion < <(complete -p "$orig_cmd" 2> /dev/null)
|
2024-03-10 07:32:25 +00:00
|
|
|
|
|
|
|
|
|
# Update orig_complete by _fzf_orig_completion entry
|
|
|
|
|
[[ $orig_complete =~ ' -F '(_fzf_[^ ]+)' ' ]] &&
|
|
|
|
|
__fzf_orig_completion_instantiate "$cmd" "${BASH_REMATCH[1]}" &&
|
|
|
|
|
orig_complete=$REPLY
|
|
|
|
|
|
2022-10-16 08:15:19 +00:00
|
|
|
|
if [[ "${__fzf_nospace_commands-}" = *" $orig_cmd "* ]]; then
|
2018-02-15 02:56:07 +00:00
|
|
|
|
eval "${orig_complete/ -F / -o nospace -F }"
|
|
|
|
|
else
|
|
|
|
|
eval "$orig_complete"
|
|
|
|
|
fi
|
2017-12-02 18:06:10 +00:00
|
|
|
|
fi
|
2024-03-29 07:20:50 +00:00
|
|
|
|
[[ $ret -eq 0 ]] && return 124
|
2014-12-04 15:15:14 +00:00
|
|
|
|
return $ret
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-05 10:34:38 +00:00
|
|
|
|
__fzf_generic_path_completion() {
|
2020-02-19 15:28:16 +00:00
|
|
|
|
local cur base dir leftover matches trigger cmd
|
2022-07-29 12:50:59 +00:00
|
|
|
|
cmd="${COMP_WORDS[0]}"
|
|
|
|
|
if [[ $cmd == \\* ]]; then
|
|
|
|
|
cmd="${cmd:1}"
|
|
|
|
|
fi
|
2013-11-19 16:29:36 +00:00
|
|
|
|
COMPREPLY=()
|
2015-05-11 01:17:33 +00:00
|
|
|
|
trigger=${FZF_COMPLETION_TRIGGER-'**'}
|
2013-11-19 16:29:36 +00:00
|
|
|
|
cur="${COMP_WORDS[COMP_CWORD]}"
|
2023-10-03 11:04:56 +00:00
|
|
|
|
if [[ "$cur" == *"$trigger" ]] && [[ $cur != *'$('* ]] && [[ $cur != *':='* ]] && [[ $cur != *'`'* ]]; then
|
2013-12-23 14:16:07 +00:00
|
|
|
|
base=${cur:0:${#cur}-${#trigger}}
|
2023-10-03 11:04:56 +00:00
|
|
|
|
eval "base=$base" 2> /dev/null || return
|
2013-11-19 16:29:36 +00:00
|
|
|
|
|
2022-10-16 08:15:19 +00:00
|
|
|
|
dir=
|
2018-06-02 01:40:33 +00:00
|
|
|
|
[[ $base = *"/"* ]] && dir="$base"
|
2016-03-02 14:59:42 +00:00
|
|
|
|
while true; do
|
2021-08-14 11:33:21 +00:00
|
|
|
|
if [[ -z "$dir" ]] || [[ -d "$dir" ]]; then
|
2013-11-23 11:09:56 +00:00
|
|
|
|
leftover=${base/#"$dir"}
|
|
|
|
|
leftover=${leftover/#\/}
|
2021-08-14 11:33:21 +00:00
|
|
|
|
[[ -z "$dir" ]] && dir='.'
|
|
|
|
|
[[ "$dir" != "/" ]] && dir="${dir/%\//}"
|
2024-03-13 11:56:31 +00:00
|
|
|
|
matches=$(
|
2024-04-19 13:40:38 +00:00
|
|
|
|
export FZF_DEFAULT_OPTS=$(__fzf_defaults "--reverse --scheme=path" "${FZF_COMPLETION_OPTS-} $2")
|
|
|
|
|
unset FZF_DEFAULT_COMMAND FZF_DEFAULT_OPTS_FILE
|
2024-03-13 11:56:31 +00:00
|
|
|
|
if declare -F "$1" > /dev/null; then
|
|
|
|
|
eval "$1 $(printf %q "$dir")" | __fzf_comprun "$4" -q "$leftover"
|
|
|
|
|
else
|
2024-05-07 10:31:13 +00:00
|
|
|
|
if [[ $1 =~ dir ]]; then
|
|
|
|
|
walker=dir,follow
|
|
|
|
|
rest=${FZF_COMPLETION_DIR_OPTS-}
|
|
|
|
|
else
|
|
|
|
|
walker=file,dir,follow,hidden
|
|
|
|
|
rest=${FZF_COMPLETION_PATH_OPTS-}
|
|
|
|
|
fi
|
|
|
|
|
__fzf_comprun "$4" -q "$leftover" --walker "$walker" --walker-root="$dir" $rest
|
2024-03-13 11:56:31 +00:00
|
|
|
|
fi | while read -r item; do
|
|
|
|
|
printf "%q " "${item%$3}$3"
|
|
|
|
|
done
|
|
|
|
|
)
|
2017-07-31 05:08:17 +00:00
|
|
|
|
matches=${matches% }
|
2022-10-16 08:15:19 +00:00
|
|
|
|
[[ -z "$3" ]] && [[ "${__fzf_nospace_commands-}" = *" ${COMP_WORDS[0]} "* ]] && matches="$matches "
|
2021-08-14 11:33:21 +00:00
|
|
|
|
if [[ -n "$matches" ]]; then
|
2013-11-23 11:09:56 +00:00
|
|
|
|
COMPREPLY=( "$matches" )
|
2013-11-19 16:29:36 +00:00
|
|
|
|
else
|
2013-11-23 11:16:46 +00:00
|
|
|
|
COMPREPLY=( "$cur" )
|
2013-11-19 16:29:36 +00:00
|
|
|
|
fi
|
2017-01-07 16:30:31 +00:00
|
|
|
|
printf '\e[5n'
|
2013-11-23 11:16:46 +00:00
|
|
|
|
return 0
|
2013-11-19 16:29:36 +00:00
|
|
|
|
fi
|
2023-10-11 04:07:47 +00:00
|
|
|
|
dir=$(command dirname "$dir")
|
2013-11-23 11:37:53 +00:00
|
|
|
|
[[ "$dir" =~ /$ ]] || dir="$dir"/
|
2013-11-23 11:09:56 +00:00
|
|
|
|
done
|
2014-07-03 15:08:37 +00:00
|
|
|
|
else
|
2015-03-04 03:59:23 +00:00
|
|
|
|
shift
|
2014-07-03 15:08:37 +00:00
|
|
|
|
shift
|
|
|
|
|
shift
|
2014-12-04 15:15:14 +00:00
|
|
|
|
_fzf_handle_dynamic_completion "$cmd" "$@"
|
2013-11-19 16:29:36 +00:00
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-05 10:34:38 +00:00
|
|
|
|
_fzf_complete() {
|
2020-03-11 09:29:39 +00:00
|
|
|
|
# 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
|
|
|
|
|
|
2020-02-19 15:28:16 +00:00
|
|
|
|
local cur selected trigger cmd post
|
2023-10-11 04:07:47 +00:00
|
|
|
|
post="$(caller 0 | command awk '{print $2}')_post"
|
|
|
|
|
type -t "$post" > /dev/null 2>&1 || post='command cat'
|
2015-10-05 10:34:38 +00:00
|
|
|
|
|
2015-05-11 01:17:33 +00:00
|
|
|
|
trigger=${FZF_COMPLETION_TRIGGER-'**'}
|
2024-03-12 23:31:14 +00:00
|
|
|
|
cmd="${COMP_WORDS[0]}"
|
2014-07-14 03:48:31 +00:00
|
|
|
|
cur="${COMP_WORDS[COMP_CWORD]}"
|
2023-10-03 11:04:56 +00:00
|
|
|
|
if [[ "$cur" == *"$trigger" ]] && [[ $cur != *'$('* ]] && [[ $cur != *':='* ]] && [[ $cur != *'`'* ]]; then
|
2014-07-14 03:48:31 +00:00
|
|
|
|
cur=${cur:0:${#cur}-${#trigger}}
|
|
|
|
|
|
2024-04-19 13:40:38 +00:00
|
|
|
|
selected=$(
|
|
|
|
|
FZF_DEFAULT_OPTS=$(__fzf_defaults "--reverse" "${FZF_COMPLETION_OPTS-} $str_arg") \
|
|
|
|
|
FZF_DEFAULT_OPTS_FILE='' \
|
|
|
|
|
__fzf_comprun "${rest[0]}" "${args[@]}" -q "$cur" | $post | command tr '\n' ' ')
|
2015-10-05 10:34:38 +00:00
|
|
|
|
selected=${selected% } # Strip trailing space not to repeat "-o nospace"
|
2021-08-14 11:33:21 +00:00
|
|
|
|
if [[ -n "$selected" ]]; then
|
2014-07-14 03:48:31 +00:00
|
|
|
|
COMPREPLY=("$selected")
|
2019-09-29 05:45:58 +00:00
|
|
|
|
else
|
|
|
|
|
COMPREPLY=("$cur")
|
2014-07-14 03:48:31 +00:00
|
|
|
|
fi
|
2019-09-29 05:45:58 +00:00
|
|
|
|
printf '\e[5n'
|
|
|
|
|
return 0
|
2014-07-14 03:48:31 +00:00
|
|
|
|
else
|
2020-03-11 09:29:39 +00:00
|
|
|
|
_fzf_handle_dynamic_completion "$cmd" "${rest[@]}"
|
2014-07-14 03:48:31 +00:00
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-05 10:34:38 +00:00
|
|
|
|
_fzf_path_completion() {
|
2017-07-31 05:08:17 +00:00
|
|
|
|
__fzf_generic_path_completion _fzf_compgen_path "-m" "" "$@"
|
2013-11-20 03:28:41 +00:00
|
|
|
|
}
|
|
|
|
|
|
2016-01-19 16:09:58 +00:00
|
|
|
|
# Deprecated. No file only completion.
|
2013-11-20 03:28:41 +00:00
|
|
|
|
_fzf_file_completion() {
|
2016-01-19 16:09:58 +00:00
|
|
|
|
_fzf_path_completion "$@"
|
2013-11-19 16:29:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_fzf_dir_completion() {
|
2017-07-31 05:08:17 +00:00
|
|
|
|
__fzf_generic_path_completion _fzf_compgen_dir "" "/" "$@"
|
2013-11-19 16:29:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
2015-10-05 10:34:38 +00:00
|
|
|
|
_fzf_complete_kill() {
|
2020-04-17 15:51:06 +00:00
|
|
|
|
_fzf_proc_completion "$@"
|
|
|
|
|
}
|
2013-11-29 08:49:48 +00:00
|
|
|
|
|
2020-04-17 15:51:06 +00:00
|
|
|
|
_fzf_proc_completion() {
|
2023-04-01 10:52:34 +00:00
|
|
|
|
_fzf_complete -m --header-lines=1 --preview 'echo {}' --preview-window down:3:wrap --min-height 15 -- "$@" < <(
|
|
|
|
|
command ps -eo user,pid,ppid,start,time,command 2> /dev/null ||
|
|
|
|
|
command ps -eo user,pid,ppid,time,args # For BusyBox
|
2020-04-17 15:51:06 +00:00
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_fzf_proc_completion_post() {
|
2023-10-11 04:07:47 +00:00
|
|
|
|
command awk '{print $2}'
|
2013-11-29 08:49:48 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-09-26 18:37:04 +00:00
|
|
|
|
# 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.
|
2023-10-12 16:00:43 +00:00
|
|
|
|
#
|
|
|
|
|
# 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
|
|
|
|
|
# }
|
2023-09-26 18:37:04 +00:00
|
|
|
|
if ! declare -F __fzf_list_hosts > /dev/null; then
|
2023-10-12 16:00:43 +00:00
|
|
|
|
__fzf_list_hosts() {
|
|
|
|
|
command cat <(command tail -n +1 ~/.ssh/config ~/.ssh/config.d/* /etc/ssh/ssh_config 2> /dev/null | command grep -i '^\s*host\(name\)\? ' | command awk '{for (i = 2; i <= NF; i++) print $1 " " $i}' | command grep -v '[*?%]') \
|
|
|
|
|
<(command grep -oE '^[[a-z0-9.,:-]+' ~/.ssh/known_hosts 2> /dev/null | command tr ',' '\n' | command tr -d '[' | command awk '{ print $1 " " $1 }') \
|
2023-10-29 00:05:30 +00:00
|
|
|
|
<(command grep -v '^\s*\(#\|$\)' /etc/hosts 2> /dev/null | command grep -Fv '0.0.0.0' | command sed 's/#.*//') |
|
|
|
|
|
command awk '{for (i = 2; i <= NF; i++) print $i}' | command sort -u
|
2023-10-12 16:00:43 +00:00
|
|
|
|
}
|
2023-09-26 18:37:04 +00:00
|
|
|
|
fi
|
2023-09-17 15:15:04 +00:00
|
|
|
|
|
2019-12-20 09:39:22 +00:00
|
|
|
|
_fzf_host_completion() {
|
2023-09-26 18:21:09 +00:00
|
|
|
|
_fzf_complete +m -- "$@" < <(__fzf_list_hosts)
|
2023-09-17 15:15:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# 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%%@*}@"
|
2023-09-26 18:21:09 +00:00
|
|
|
|
_fzf_complete +m -- "$@" < <(__fzf_list_hosts | command awk -v user="$user" '{print user $0}')
|
2023-09-17 15:15:04 +00:00
|
|
|
|
;;
|
|
|
|
|
esac
|
2015-10-05 10:34:38 +00:00
|
|
|
|
}
|
|
|
|
|
|
2019-12-20 09:39:22 +00:00
|
|
|
|
_fzf_var_completion() {
|
2020-03-11 09:29:39 +00:00
|
|
|
|
_fzf_complete -m -- "$@" < <(
|
2023-10-11 04:07:47 +00:00
|
|
|
|
declare -xp | command sed -En 's|^declare [^ ]+ ([^=]+).*|\1|p'
|
2015-10-05 10:34:38 +00:00
|
|
|
|
)
|
2014-07-14 03:48:31 +00:00
|
|
|
|
}
|
2013-12-22 11:42:11 +00:00
|
|
|
|
|
2019-12-20 09:39:22 +00:00
|
|
|
|
_fzf_alias_completion() {
|
2020-03-11 09:29:39 +00:00
|
|
|
|
_fzf_complete -m -- "$@" < <(
|
2023-10-11 04:07:47 +00:00
|
|
|
|
alias | command sed -En 's|^alias ([^=]+).*|\1|p'
|
2015-10-05 10:34:38 +00:00
|
|
|
|
)
|
2013-12-22 11:42:11 +00:00
|
|
|
|
}
|
|
|
|
|
|
2014-07-03 15:08:37 +00:00
|
|
|
|
# fzf options
|
2015-06-13 15:43:44 +00:00
|
|
|
|
complete -o default -F _fzf_opts_completion fzf
|
2022-07-15 06:53:23 +00:00
|
|
|
|
# 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
|
2013-11-19 16:29:36 +00:00
|
|
|
|
|
2024-04-27 05:11:08 +00:00
|
|
|
|
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.
|
|
|
|
|
a_cmds="${FZF_COMPLETION_PATH_COMMANDS-"
|
2023-03-27 03:21:37 +00:00
|
|
|
|
awk bat cat diff diff3
|
2023-01-22 17:21:04 +00:00
|
|
|
|
emacs emacsclient ex file ftp g++ gcc gvim head hg hx java
|
2015-11-06 13:22:35 +00:00
|
|
|
|
javac ld less more mvim nvim patch perl python ruby
|
2016-01-19 16:09:58 +00:00
|
|
|
|
sed sftp sort source tail tee uniq vi view vim wc xdg-open
|
2014-07-03 15:08:37 +00:00
|
|
|
|
basename bunzip2 bzip2 chmod chown curl cp dirname du
|
|
|
|
|
find git grep gunzip gzip hg jar
|
|
|
|
|
ln ls mv open rm rsync scp
|
2024-04-27 05:11:08 +00:00
|
|
|
|
svn tar unzip zip"}"
|
|
|
|
|
v_cmds="${FZF_COMPLETION_VAR_COMMANDS-export unset printenv}"
|
2014-07-03 15:08:37 +00:00
|
|
|
|
|
|
|
|
|
# Preserve existing completion
|
2024-04-25 07:53:43 +00:00
|
|
|
|
__fzf_orig_completion < <(complete -p $d_cmds $a_cmds $v_cmds unalias kill ssh 2> /dev/null)
|
2014-07-17 15:22:49 +00:00
|
|
|
|
|
2024-03-17 06:36:33 +00:00
|
|
|
|
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
|
2014-07-03 15:08:37 +00:00
|
|
|
|
fi
|
|
|
|
|
|
2019-08-09 02:11:29 +00:00
|
|
|
|
__fzf_defc() {
|
[bash] Refactor access to "_fzf_orig_complete_${cmd//[^A-Za-z0-9_]/_}"
In the current codebase, for the original completion settings, the
pieces of the codes to determine the variable name and to access the
stored data are scattered. In this patch, we define functions to
access these variables. Those functions will be used in a coming
patch.
* This patch also resolves an inconsistent escaping of "$cmd": $cmd is
escaped as ${...//[^A-Za-z0-9_]/_} in some places, but it is escaped
as ${...//[^A-Za-z0-9_=]/_} in some other places. The latter leaves
the character "=" in the command name, which causes an issue because
"=" cannot be a part of a variable name. For example, the following
test case produces an error message:
$ COMP_WORDBREAKS=${COMP_WORDBREAKS//=}
$ _test1() { COMPREPLY=(); }
$ complete -vF _test1 cmd.v=1.0
$ _fzf_setup_completion path cmd.v=1.0
$ cmd.v=1.0 [TAB]
bash: _fzf_orig_completion_cmd_v=1_0: invalid variable name
The behavior of leaving "=" was present from the beginning when
saving the original completion is introduced in commit 91401514, and
this does not seem to be a specific reasoning. In this patch, we
replace "=" as well as the other non-identifier characters.
* Note: In this patch, the variable REPLY is used to return values
from functions. This design is to make it useful with the value
substitutions, a new Bash feature of the next release 5.3, which is
taken from mksh.
2024-03-10 07:31:55 +00:00
|
|
|
|
local cmd func opts REPLY
|
2015-10-11 15:27:30 +00:00
|
|
|
|
cmd="$1"
|
|
|
|
|
func="$2"
|
|
|
|
|
opts="$3"
|
[bash] Refactor access to "_fzf_orig_complete_${cmd//[^A-Za-z0-9_]/_}"
In the current codebase, for the original completion settings, the
pieces of the codes to determine the variable name and to access the
stored data are scattered. In this patch, we define functions to
access these variables. Those functions will be used in a coming
patch.
* This patch also resolves an inconsistent escaping of "$cmd": $cmd is
escaped as ${...//[^A-Za-z0-9_]/_} in some places, but it is escaped
as ${...//[^A-Za-z0-9_=]/_} in some other places. The latter leaves
the character "=" in the command name, which causes an issue because
"=" cannot be a part of a variable name. For example, the following
test case produces an error message:
$ COMP_WORDBREAKS=${COMP_WORDBREAKS//=}
$ _test1() { COMPREPLY=(); }
$ complete -vF _test1 cmd.v=1.0
$ _fzf_setup_completion path cmd.v=1.0
$ cmd.v=1.0 [TAB]
bash: _fzf_orig_completion_cmd_v=1_0: invalid variable name
The behavior of leaving "=" was present from the beginning when
saving the original completion is introduced in commit 91401514, and
this does not seem to be a specific reasoning. In this patch, we
replace "=" as well as the other non-identifier characters.
* Note: In this patch, the variable REPLY is used to return values
from functions. This design is to make it useful with the value
substitutions, a new Bash feature of the next release 5.3, which is
taken from mksh.
2024-03-10 07:31:55 +00:00
|
|
|
|
if __fzf_orig_completion_instantiate "$cmd" "$func"; then
|
|
|
|
|
eval "$REPLY"
|
2015-10-11 15:27:30 +00:00
|
|
|
|
else
|
|
|
|
|
complete -F "$func" $opts "$cmd"
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
2013-11-20 03:28:41 +00:00
|
|
|
|
# Anything
|
2014-07-03 15:08:37 +00:00
|
|
|
|
for cmd in $a_cmds; do
|
2019-08-09 02:11:29 +00:00
|
|
|
|
__fzf_defc "$cmd" _fzf_path_completion "-o default -o bashdefault"
|
2013-11-20 03:28:41 +00:00
|
|
|
|
done
|
2013-11-19 16:29:36 +00:00
|
|
|
|
|
2016-01-19 16:09:58 +00:00
|
|
|
|
# Directory
|
|
|
|
|
for cmd in $d_cmds; do
|
2024-04-04 04:20:10 +00:00
|
|
|
|
__fzf_defc "$cmd" _fzf_dir_completion "-o bashdefault -o nospace -o dirnames"
|
2016-01-19 16:09:58 +00:00
|
|
|
|
done
|
|
|
|
|
|
2024-04-25 07:53:43 +00:00
|
|
|
|
# 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"
|
|
|
|
|
|
2023-09-17 15:15:04 +00:00
|
|
|
|
# ssh
|
|
|
|
|
__fzf_defc ssh _fzf_complete_ssh "-o default -o bashdefault"
|
|
|
|
|
|
2024-04-25 07:53:43 +00:00
|
|
|
|
unset cmd d_cmds a_cmds v_cmds
|
2019-02-28 07:13:59 +00:00
|
|
|
|
|
2019-08-08 06:35:52 +00:00
|
|
|
|
_fzf_setup_completion() {
|
2019-08-09 02:11:29 +00:00
|
|
|
|
local kind fn cmd
|
|
|
|
|
kind=$1
|
|
|
|
|
fn=_fzf_${1}_completion
|
|
|
|
|
if [[ $# -lt 2 ]] || ! type -t "$fn" > /dev/null; then
|
2020-04-17 15:51:06 +00:00
|
|
|
|
echo "usage: ${FUNCNAME[0]} path|dir|var|alias|host|proc COMMANDS..."
|
2019-08-08 06:35:52 +00:00
|
|
|
|
return 1
|
|
|
|
|
fi
|
|
|
|
|
shift
|
2020-11-11 14:44:47 +00:00
|
|
|
|
__fzf_orig_completion < <(complete -p "$@" 2> /dev/null)
|
2019-08-08 06:35:52 +00:00
|
|
|
|
for cmd in "$@"; do
|
2019-08-09 02:11:29 +00:00
|
|
|
|
case "$kind" in
|
2019-12-20 09:39:22 +00:00
|
|
|
|
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" ;;
|
2019-08-09 02:11:29 +00:00
|
|
|
|
esac
|
2019-08-08 06:35:52 +00:00
|
|
|
|
done
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-09 15:46:09 +00:00
|
|
|
|
fi
|