oh-my-bash/completions/tmux.completion.sh
2024-09-09 00:48:07 +09:00

182 lines
4.9 KiB
Bash

#! bash oh-my-bash.module
# tmux completion
# See: http://www.debian-administration.org/articles/317 for how to write more.
# Usage: Put "source bash_completion_tmux.sh" into your .bashrc
# Based upon the example at http://paste-it.appspot.com/Pj4mLycDE
function _tmux_expand {
[[ $cur != "${cur%\\}" ]] && cur=$cur'\'
if [[ $cur == \~*/* ]]; then
eval "cur=$cur"
elif [[ $cur == \~* ]]; then
cur=${cur#\~}
COMPREPLY=($(compgen -P '~' -u "$cur"))
((${#COMPREPLY[@]} == 0))
fi
}
function _tmux_filedir {
local IFS=$'\n'
_tmux_expand || return 0
if [[ $1 == -d ]]; then
COMPREPLY=("${COMPREPLY[@]}" $(compgen -d -- "$cur"));
return 0;
fi;
COMPREPLY=("${COMPREPLY[@]}" $(eval "compgen -f -- \"$cur\""))
}
function _tmux_complete_client {
local IFS=$'\n'
local cur=$1
COMPREPLY=("${COMPREPLY[@]}" $(compgen -W "$(tmux -q list-clients 2>/dev/null | cut -f 1 -d ':')" -- "${cur}") )
}
function _tmux_complete_session {
local IFS=$'\n'
local cur=$1
COMPREPLY=("${COMPREPLY[@]}" $(compgen -W "$(tmux -q list-sessions 2>/dev/null | cut -f 1 -d ':')" -- "${cur}") )
}
function _tmux_complete_window {
local IFS=$'\n'
local cur=$1
local session_name=$(<<< "$cur" sed 's/\\//g' | cut -d ':' -f 1)
local sessions
sessions="$(tmux -q list-sessions 2>/dev/null | sed -re 's/([^:]+:).*$/\1/')"
if [[ $session_name ]]; then
sessions="$sessions
$(tmux -q list-windows -t "$session_name" 2>/dev/null | sed -re 's/^([^:]+):.*$/'"$session_name"':\1/')"
fi
cur=$(<<< "$cur" sed -e 's/:/\\\\:/')
sessions=$(<<< "$sessions" sed -e 's/:/\\\\:/')
COMPREPLY=("${COMPREPLY[@]}" $(compgen -W "$sessions" -- "$cur"))
}
function _tmux {
local cur prev
local i cmd cmd_index option option_index
local opts=""
COMPREPLY=()
cur=${COMP_WORDS[COMP_CWORD]}
prev=${COMP_WORDS[COMP_CWORD-1]}
if [[ $prev == -f ]]; then
_tmux_filedir
else
# Search for the command
local skip_next=0
for ((i = 1; i <= COMP_CWORD; i++)); do
if ((skip_next == 1)); then
#_omb_util_print "Skipping"
skip_next=0;
elif [[ ${COMP_WORDS[i]} != -* ]]; then
cmd=${COMP_WORDS[i]}
cmd_index=$i
break
elif [[ ${COMP_WORDS[i]} == -f ]]; then
skip_next=1
fi
done
# Search for the last option command
skip_next=0
for ((i = 1; i <= COMP_CWORD; i++)); do
if ((skip_next == 1)); then
#_omb_util_print "Skipping"
skip_next=0
elif [[ ${COMP_WORDS[i]} == -* ]]; then
option=${COMP_WORDS[i]}
option_index=$i
if [[ ${COMP_WORDS[i]} == -- ]]; then
break
fi
elif [[ ${COMP_WORDS[i]} == -f ]]; then
skip_next=1
fi
done
if ((COMP_CWORD <= cmd_index)); then
# The user has not specified a command yet
COMPREPLY=("${COMPREPLY[@]}" $(compgen -W "$(tmux start-server \; list-commands | cut -d' ' -f1)" -- "$cur"))
else
case $cmd in
attach-session|attach)
case $prev in
-t) _tmux_complete_session "$cur" ;;
*) options="-t -d" ;;
esac ;;
detach-client|detach)
case $prev in
-t) _tmux_complete_client "$cur" ;;
*) options="-t" ;;
esac ;;
lock-client|lockc)
case $prev in
-t) _tmux_complete_client "$cur" ;;
*) options="-t" ;;
esac ;;
lock-session|locks)
case $prev in
-t) _tmux_complete_session "$cur" ;;
*) options="-t -d" ;;
esac ;;
new-session|new)
case $prev in
-t) _tmux_complete_session "$cur" ;;
-[n|d|s]) options="-d -n -s -t --" ;;
*)
if [[ ${COMP_WORDS[option_index]} == -- ]]; then
_command_offset ${option_index}
else
options="-d -n -s -t --"
fi
;;
esac
;;
refresh-client|refresh)
case $prev in
-t) _tmux_complete_client "$cur" ;;
*) options="-t" ;;
esac ;;
rename-session|rename)
case $prev in
-t) _tmux_complete_session "$cur" ;;
*) options="-t" ;;
esac ;;
source-file|source) _tmux_filedir ;;
has-session|has|kill-session)
case $prev in
-t) _tmux_complete_session "$cur" ;;
*) options="-t" ;;
esac ;;
suspend-client|suspendc)
case $prev in
-t) _tmux_complete_client "$cur" ;;
*) options="-t" ;;
esac ;;
switch-client|switchc)
case $prev in
-c) _tmux_complete_client "$cur" ;;
-t) _tmux_complete_session "$cur" ;;
*) options="-l -n -p -c -t" ;;
esac ;;
send-keys|send)
case $option in
-t) _tmux_complete_window "$cur" ;;
*) options="-t" ;;
esac ;;
esac # case $cmd
fi # command specified
fi # not -f
if [[ $options ]]; then
COMPREPLY=("${COMPREPLY[@]}" $(compgen -W "$options" -- "$cur"))
fi
return 0
}
complete -F _tmux tmux
# END tmux completion