diff --git a/shell/completion.bash b/shell/completion.bash index 2aec1d6..fcae37a 100644 --- a/shell/completion.bash +++ b/shell/completion.bash @@ -249,17 +249,25 @@ _fzf_dir_completion() { } _fzf_complete_kill() { - [ -n "${COMP_WORDS[COMP_CWORD]}" ] && return 1 - - local selected - selected=$(command ps -ef | sed 1d | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-50%} --min-height 15 --reverse $FZF_DEFAULT_OPTS $FZF_COMPLETION_OPTS --preview 'echo {}' --preview-window down:3:wrap" __fzf_comprun "kill" -m | awk '{print $2}' | tr '\n' ' ') - selected=${selected% } - printf '\e[5n' - - if [ -n "$selected" ]; then - COMPREPLY=( "$selected" ) - return 0 + local trigger=${FZF_COMPLETION_TRIGGER-'**'} + local cur="${COMP_WORDS[COMP_CWORD]}" + if [[ -z "$cur" ]]; then + COMP_WORDS[$COMP_CWORD]=$trigger + elif [[ "$cur" != *"$trigger" ]]; then + return 1 fi + + _fzf_proc_completion "$@" +} + +_fzf_proc_completion() { + _fzf_complete -m --preview 'echo {}' --preview-window down:3:wrap --min-height 15 -- "$@" < <( + command ps -ef | sed 1d + ) +} + +_fzf_proc_completion_post() { + awk '{print $2}' } _fzf_host_completion() { @@ -332,7 +340,7 @@ for cmd in $d_cmds; do __fzf_defc "$cmd" _fzf_dir_completion "-o nospace -o dirnames" done -# Kill completion +# Kill completion (supports empty completion trigger) complete -F _fzf_complete_kill -o default -o bashdefault kill unset cmd d_cmds a_cmds x_cmds @@ -342,7 +350,7 @@ _fzf_setup_completion() { kind=$1 fn=_fzf_${1}_completion if [[ $# -lt 2 ]] || ! type -t "$fn" > /dev/null; then - echo "usage: ${FUNCNAME[0]} path|dir|var|alias|host COMMANDS..." + echo "usage: ${FUNCNAME[0]} path|dir|var|alias|host|proc COMMANDS..." return 1 fi shift diff --git a/shell/completion.zsh b/shell/completion.zsh index 3381f46..2096ad4 100644 --- a/shell/completion.zsh +++ b/shell/completion.zsh @@ -250,6 +250,16 @@ _fzf_complete_unalias() { ) } +_fzf_complete_kill() { + _fzf_complete -m --preview 'echo {}' --preview-window down:3:wrap --min-height 15 -- "$@" < <( + command ps -ef | sed 1d + ) +} + +_fzf_complete_kill_post() { + awk '{print $2}' +} + fzf-completion() { local tokens cmd prefix trigger tail matches lbuf d_cmds setopt localoptions noshwordsplit noksh_arrays noposixbuiltins @@ -274,20 +284,21 @@ fzf-completion() { tokens=(${tokens[0,-2]}) fi + lbuf=$LBUFFER tail=${LBUFFER:$(( ${#LBUFFER} - ${#trigger} ))} # Kill completion (do not require trigger sequence) if [ "$cmd" = kill -a ${LBUFFER[-1]} = ' ' ]; then - matches=$(command ps -ef | sed 1d | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-50%} --min-height 15 --reverse $FZF_DEFAULT_OPTS $FZF_COMPLETION_OPTS --preview 'echo {}' --preview-window down:3:wrap" __fzf_comprun "$cmd" -m | awk '{print $2}' | tr '\n' ' ') - if [ -n "$matches" ]; then - LBUFFER="$LBUFFER$matches" - fi - zle reset-prompt + tail=$trigger + tokens+=$trigger + lbuf="$lbuf$trigger" + fi + # Trigger sequence given - elif [ ${#tokens} -gt 1 -a "$tail" = "$trigger" ]; then + if [ ${#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]}} + [ -n "${tokens[-1]}" ] && lbuf=${lbuf:0:-${#tokens[-1]}} if eval "type _fzf_complete_${cmd} > /dev/null"; then prefix="$prefix" eval _fzf_complete_${cmd} ${(q)lbuf}