mirror of
https://github.com/Llewellynvdm/fzf.git
synced 2024-12-23 11:29:01 +00:00
6de1ad9d3d
* Correctly exclude SSH config options with Host SSH config files have 14 options containing 'Host'. Previously The zsh and bash completion scripts would include lines containing these options when doing command-line completion of SSH hosts with `ssh **`. This commit fixes that problem by only including lines with 'host '. * Don't autocomplete SSH hostnames using ? SSH config files support ? as well as * for wildcards in Host lines. This commit excludes lines containing ? for zsh/bash command line completeion using `ssh **`
198 lines
6.0 KiB
Bash
198 lines
6.0 KiB
Bash
# ____ ____
|
|
# / __/___ / __/
|
|
# / /_/_ / / /_
|
|
# / __/ / /_/ __/
|
|
# /_/ /___/_/-completion.zsh
|
|
#
|
|
# - $FZF_TMUX (default: 0)
|
|
# - $FZF_TMUX_HEIGHT (default: '40%')
|
|
# - $FZF_COMPLETION_TRIGGER (default: '**')
|
|
# - $FZF_COMPLETION_OPTS (default: empty)
|
|
|
|
# To use custom commands instead of find, override _fzf_compgen_{path,dir}
|
|
if ! declare -f _fzf_compgen_path > /dev/null; then
|
|
_fzf_compgen_path() {
|
|
echo "$1"
|
|
command find -L "$1" \
|
|
-name .git -prune -o -name .svn -prune -o \( -type d -o -type f -o -type l \) \
|
|
-a -not -path "$1" -print 2> /dev/null | sed 's@^\./@@'
|
|
}
|
|
fi
|
|
|
|
if ! declare -f _fzf_compgen_dir > /dev/null; then
|
|
_fzf_compgen_dir() {
|
|
command find -L "$1" \
|
|
-name .git -prune -o -name .svn -prune -o -type d \
|
|
-a -not -path "$1" -print 2> /dev/null | sed 's@^\./@@'
|
|
}
|
|
fi
|
|
|
|
###########################################################
|
|
|
|
__fzfcmd_complete() {
|
|
[ -n "$TMUX_PANE" ] && [ "${FZF_TMUX:-0}" != 0 ] && [ ${LINES:-40} -gt 15 ] &&
|
|
echo "fzf-tmux -d${FZF_TMUX_HEIGHT:-40%}" || echo "fzf"
|
|
}
|
|
|
|
__fzf_generic_path_completion() {
|
|
local base lbuf compgen fzf_opts suffix tail fzf dir leftover matches
|
|
base=$1
|
|
lbuf=$2
|
|
compgen=$3
|
|
fzf_opts=$4
|
|
suffix=$5
|
|
tail=$6
|
|
fzf="$(__fzfcmd_complete)"
|
|
|
|
setopt localoptions nonomatch
|
|
eval "base=$base"
|
|
[[ $base = *"/"* ]] && dir="$base"
|
|
while [ 1 ]; do
|
|
if [[ -z "$dir" || -d ${dir} ]]; then
|
|
leftover=${base/#"$dir"}
|
|
leftover=${leftover/#\/}
|
|
[ -z "$dir" ] && dir='.'
|
|
[ "$dir" != "/" ] && dir="${dir/%\//}"
|
|
matches=$(eval "$compgen $(printf %q "$dir")" | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --reverse $FZF_DEFAULT_OPTS $FZF_COMPLETION_OPTS" ${=fzf} ${=fzf_opts} -q "$leftover" | while read item; do
|
|
echo -n "${(q)item}$suffix "
|
|
done)
|
|
matches=${matches% }
|
|
if [ -n "$matches" ]; then
|
|
LBUFFER="$lbuf$matches$tail"
|
|
fi
|
|
zle redisplay
|
|
typeset -f zle-line-init >/dev/null && zle zle-line-init
|
|
break
|
|
fi
|
|
dir=$(dirname "$dir")
|
|
dir=${dir%/}/
|
|
done
|
|
}
|
|
|
|
_fzf_path_completion() {
|
|
__fzf_generic_path_completion "$1" "$2" _fzf_compgen_path \
|
|
"-m" "" " "
|
|
}
|
|
|
|
_fzf_dir_completion() {
|
|
__fzf_generic_path_completion "$1" "$2" _fzf_compgen_dir \
|
|
"" "/" ""
|
|
}
|
|
|
|
_fzf_feed_fifo() (
|
|
command rm -f "$1"
|
|
mkfifo "$1"
|
|
cat <&0 > "$1" &
|
|
)
|
|
|
|
_fzf_complete() {
|
|
local fifo fzf_opts lbuf fzf matches post
|
|
fifo="${TMPDIR:-/tmp}/fzf-complete-fifo-$$"
|
|
fzf_opts=$1
|
|
lbuf=$2
|
|
post="${funcstack[2]}_post"
|
|
type $post > /dev/null 2>&1 || post=cat
|
|
|
|
fzf="$(__fzfcmd_complete)"
|
|
|
|
_fzf_feed_fifo "$fifo"
|
|
matches=$(cat "$fifo" | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --reverse $FZF_DEFAULT_OPTS $FZF_COMPLETION_OPTS" ${=fzf} ${=fzf_opts} -q "${(Q)prefix}" | $post | tr '\n' ' ')
|
|
if [ -n "$matches" ]; then
|
|
LBUFFER="$lbuf$matches"
|
|
fi
|
|
zle redisplay
|
|
typeset -f zle-line-init >/dev/null && zle zle-line-init
|
|
command rm -f "$fifo"
|
|
}
|
|
|
|
_fzf_complete_telnet() {
|
|
_fzf_complete '+m' "$@" < <(
|
|
command grep -v '^\s*\(#\|$\)' /etc/hosts | command grep -Fv '0.0.0.0' |
|
|
awk '{if (length($2) > 0) {print $2}}' | sort -u
|
|
)
|
|
}
|
|
|
|
_fzf_complete_ssh() {
|
|
_fzf_complete '+m' "$@" < <(
|
|
command cat <(cat ~/.ssh/config /etc/ssh/ssh_config 2> /dev/null | command grep -i '^host ' | command grep -v '[*?]' | awk '{for (i = 2; i <= NF; i++) print $1 " " $i}') \
|
|
<(command grep -oE '^[[a-z0-9.,:-]+' ~/.ssh/known_hosts | tr ',' '\n' | tr -d '[' | awk '{ print $1 " " $1 }') \
|
|
<(command grep -v '^\s*\(#\|$\)' /etc/hosts | command grep -Fv '0.0.0.0') |
|
|
awk '{if (length($2) > 0) {print $2}}' | sort -u
|
|
)
|
|
}
|
|
|
|
_fzf_complete_export() {
|
|
_fzf_complete '-m' "$@" < <(
|
|
declare -xp | sed 's/=.*//' | sed 's/.* //'
|
|
)
|
|
}
|
|
|
|
_fzf_complete_unset() {
|
|
_fzf_complete '-m' "$@" < <(
|
|
declare -xp | sed 's/=.*//' | sed 's/.* //'
|
|
)
|
|
}
|
|
|
|
_fzf_complete_unalias() {
|
|
_fzf_complete '+m' "$@" < <(
|
|
alias | sed 's/=.*//'
|
|
)
|
|
}
|
|
|
|
fzf-completion() {
|
|
local tokens cmd prefix trigger tail fzf matches lbuf d_cmds
|
|
setopt localoptions noshwordsplit noksh_arrays noposixbuiltins
|
|
|
|
# http://zsh.sourceforge.net/FAQ/zshfaq03.html
|
|
# http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion-Flags
|
|
tokens=(${(z)LBUFFER})
|
|
if [ ${#tokens} -lt 1 ]; then
|
|
zle ${fzf_default_completion:-expand-or-complete}
|
|
return
|
|
fi
|
|
|
|
cmd=${tokens[1]}
|
|
|
|
# Explicitly allow for empty trigger.
|
|
trigger=${FZF_COMPLETION_TRIGGER-'**'}
|
|
[ -z "$trigger" -a ${LBUFFER[-1]} = ' ' ] && tokens+=("")
|
|
|
|
tail=${LBUFFER:$(( ${#LBUFFER} - ${#trigger} ))}
|
|
# Kill completion (do not require trigger sequence)
|
|
if [ $cmd = kill -a ${LBUFFER[-1]} = ' ' ]; then
|
|
fzf="$(__fzfcmd_complete)"
|
|
matches=$(command ps -ef | sed 1d | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-50%} --min-height 15 --reverse $FZF_DEFAULT_OPTS --preview 'echo {}' --preview-window down:3:wrap $FZF_COMPLETION_OPTS" ${=fzf} -m | awk '{print $2}' | tr '\n' ' ')
|
|
if [ -n "$matches" ]; then
|
|
LBUFFER="$LBUFFER$matches"
|
|
fi
|
|
zle redisplay
|
|
typeset -f zle-line-init >/dev/null && zle zle-line-init
|
|
# Trigger sequence given
|
|
elif [ ${#tokens} -gt 1 -a "$tail" = "$trigger" ]; then
|
|
d_cmds=(${=FZF_COMPLETION_DIR_COMMANDS:-cd pushd rmdir})
|
|
|
|
[ -z "$trigger" ] && prefix=${tokens[-1]} || prefix=${tokens[-1]:0:-${#trigger}}
|
|
[ -z "${tokens[-1]}" ] && lbuf=$LBUFFER || lbuf=${LBUFFER:0:-${#tokens[-1]}}
|
|
|
|
if eval "type _fzf_complete_${cmd} > /dev/null"; then
|
|
eval "prefix=\"$prefix\" _fzf_complete_${cmd} \"$lbuf\""
|
|
elif [ ${d_cmds[(i)$cmd]} -le ${#d_cmds} ]; then
|
|
_fzf_dir_completion "$prefix" "$lbuf"
|
|
else
|
|
_fzf_path_completion "$prefix" "$lbuf"
|
|
fi
|
|
# Fall back to default completion
|
|
else
|
|
zle ${fzf_default_completion:-expand-or-complete}
|
|
fi
|
|
}
|
|
|
|
[ -z "$fzf_default_completion" ] && {
|
|
binding=$(bindkey '^I')
|
|
[[ $binding =~ 'undefined-key' ]] || fzf_default_completion=$binding[(s: :w)2]
|
|
unset binding
|
|
}
|
|
|
|
zle -N fzf-completion
|
|
bindkey '^I' fzf-completion
|