35

Some commands (kill-session and kill-server) have the same prefix.
When I type (prefix:kill-seTab), tmux won't give me any result.
Is there a option to show wildmenu for auto-completion inside tmux?

I'm using Ubuntu 12.04

kev
  • 13,200

2 Answers2

11

Current answer (command completion within tmux's command-prompt)

This simply works out-of-the-box as of version 3.2 (released April 2021), hence the other answer to this question is incorrect.

tmux command-prompt completion menu

You can use arrow-keys or press the corresponding number key to choose the desired completion. Caveat that this may not work with vi key mappings, which I haven't tested, but I can confirm it works with emacs mappings.

Original Answer (bash completion for tmux)

Obviously I misunderstood the question back when I originally answered, but I am leaving this part of the answer up because shell completions for tmux are a viable alternative to completions within tmux, particularly in scenarios where older versions of tmux are in use.

The following script provides a bash completion for tmux, and I tested it out on my box just now, and it works great. Just copy the script to a file on your computer, and put

   source /path/to/tmux_completion.sh

in your .bashrc and you should be ready to go.


#!/bin/bash

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 | cut -f 1 -d ':')" -- "${cur}") ) } function _tmux_complete_session() { local IFS=$'\n' local cur="${1}" COMPREPLY=( ${COMPREPLY[@]:-} $(compgen -W "$(tmux -q list-sessions | 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 | sed -re 's/([^:]+:).*$/\1/')"
if [[ -n "${session_name}" ]]; then
    sessions="${sessions}

$(tmux -q list-windows -t "${session_name}" | 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
    local all_commands="$(tmux -q list-commands | cut -f 1 -d ' ')"
    COMPREPLY=( ${COMPREPLY[@]:-} $(compgen -W "${all_commands}" -- "${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

Script Source (GPL3 license)

0

No, this is not possible. Tmux internal commands only allows for autocompletion when the typed string is unambiguous.

phil294
  • 349
  • 4
  • 14