summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2020-04-18 00:51:06 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2020-04-18 02:46:40 +0900
commitc329279339a5f49020f6cb43c714d54e68424700 (patch)
tree04403a4f5261dc72ac2b32aa1c8d2e0399ff7541
parentcf04753ad73bb1fe12de66fe156b0cdd4026f15a (diff)
[completion] Make kill completion more consistent with the others
Support both ordinary completion trigger and empty trigger kill <tab> kill foo**<tab> Close #1988 Close #385
-rw-r--r--shell/completion.bash30
-rw-r--r--shell/completion.zsh25
2 files changed, 37 insertions, 18 deletions
diff --git a/shell/completion.bash b/shell/completion.bash
index 2aec1d64..fcae37a2 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 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
- 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'
+ _fzf_proc_completion "$@"
+}
- if [ -n "$selected" ]; then
- COMPREPLY=( "$selected" )
- return 0
- fi
+_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 3381f463..2096ad4e 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}