From 30b9a95828c45570deab0988bcb087e90b0bed09 Mon Sep 17 00:00:00 2001 From: Patrick Cao Huu Thien Date: Wed, 14 Mar 2018 16:50:30 +0100 Subject: [PATCH] add bash completion for tmux --- bash_completion/README | 1 + bash_completion/tmux.completion.bash | 190 +++++++++++++++++++++++++++ 2 files changed, 191 insertions(+) create mode 100644 bash_completion/README create mode 100644 bash_completion/tmux.completion.bash diff --git a/bash_completion/README b/bash_completion/README new file mode 100644 index 0000000..d5c40b5 --- /dev/null +++ b/bash_completion/README @@ -0,0 +1 @@ +to install completion, juste source file in your .bashrc diff --git a/bash_completion/tmux.completion.bash b/bash_completion/tmux.completion.bash new file mode 100644 index 0000000..e582238 --- /dev/null +++ b/bash_completion/tmux.completion.bash @@ -0,0 +1,190 @@ +#!/usr/bin/env bash +# get on https://raw.githubusercontent.com/Bash-it/bash-it/master/completion/available/tmux.completion.bash +# pcht 2018 + +# 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 + +_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=( ${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="$(echo "${cur}" | sed 's/\\//g' | cut -d ':' -f 1)" + local sessions + + 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="$(echo "${cur}" | sed -e 's/:/\\\\:/')" + sessions="$(echo "${sessions}" | sed -e 's/:/\\\\:/')" + COMPREPLY=( ${COMPREPLY[@]:-} $(compgen -W "${sessions}" -- "${cur}") ) +} + +_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} -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}" ;; + -[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 [[ -n "${options}" ]]; then + COMPREPLY=( ${COMPREPLY[@]:-} $(compgen -W "${options}" -- "${cur}") ) + fi + + return 0 + +} +complete -F _tmux tmux + +# END tmux completion +