# shellcheck shell=bash # shellcheck disable=SC2120,SC2207 # A future refactor can fix this better. cite "about-completion" about-completion "tmux - terminal multiplexer for managing multiple shell sessions" group "terminal" url "https://github.com/tmux/tmux" # 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 _tmux_expand() { [[ "$cur" != "${cur%\\}" ]] && cur="$cur\\" if [[ "$cur" == \~*/* ]]; then eval "cur=$cur" else if [[ "$cur" == \~* ]]; then cur=${cur#\~} COMPREPLY=($(compgen -P '~' -u "$cur")) return ${#COMPREPLY[@]} fi fi } _tmux_filedir() { local IFS=' ' _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+=($(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+=($(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 sessions session_name="$(echo "${cur}" | sed 's/\\//g' | cut -d ':' -f 1)" sessions="$(tmux -q list-sessions 2> /dev/null | sed -re 's/([^:]+:).*$/\1/')" if [[ -n "${session_name}" ]]; then sessions="${sessions} $(tmux -q list-windows -t "${session_name}" 2> /dev/null | sed -re 's/^([^:]+):.*$/'"${session_name}"':\1/')" fi cur=${cur/:/\\\\:} sessions=${sessions/:/\\\\:} COMPREPLY+=($(compgen -W "${sessions}" -- "${cur}")) } _tmux() { local cur prev local i cmd cmd_index option option_index 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} -eq 1 ]]; then #echo "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} -eq 1 ]]; then #echo "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 -le $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}" ;; -c) _tmux_filedir -d ;; -[n | d | s]) options="-d -n -s -t --" ;; *) if [[ ${COMP_WORDS[option_index]} == -- ]]; then _command_offset "${option_index}" else options="-d -n -s -t -c --" 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 [[ -n "${options}" ]]; then COMPREPLY=("${COMPREPLY[@]:-}" $(compgen -W "${options}" -- "${cur}")) fi return 0 } complete -F _tmux tmux # END tmux completion