Jak uzupełnić tabulatorem podczas wpisywania polecenia w tmux?

22

Niektóre polecenia ( kill-sessioni kill-server) mają ten sam prefiks.
Kiedy piszę ( prefix:kill-seTab), tmux nie daje mi żadnego rezultatu.
Czy istnieje opcja pokazania wildmenu dla automatycznego uzupełniania w tmuxie?

Używam Ubuntu 12.04

kev
źródło
Jakiej powłoki używasz? Możesz go znaleźć za pomocą echa $ SHELL
éclairevoyant
1
To/bin/bash
kev
4
Jak powiązana jest powłoka? Kiedy wpiszesz Ctrl + B ,: w tmux, pojawi się wiersz polecenia tmux (tak jak podczas pisania: w VIM, nie otrzymasz monitu bash.) To jest pytanie tmux, a nie pytanie shellowe.
bobpaul
Odpowiedź na zakończenie bashu jest pomocna, ale nie odpowiada na pytanie do użycia wewnątrz tmux. Zgaduję, że skoro tmux nie ma dodatkowej linii pionowej przestrzeni do pracy, po prostu nie oferuje opcji uzupełniania tabulatorów, jak robi to bash, chociaż przynajmniej kończy to, co piszesz, dopóki nie pojawi się Dwuznaczność. Tak więc ludzie mogą korzystać z opcji bash, aby się uczyć, i używać opcji tmux do szybkiego dostępu, gdy wiedzą, czego chcą.
nealmcb

Odpowiedzi:

8

Poniższy skrypt zapewnia bashowe zakończenie dla tmux, a ja przetestowałem go teraz na moim urządzeniu i działa świetnie. Wystarczy skopiować skrypt do pliku na komputerze i umieścić

   source /path/to/tmux_completion.sh

w twoim .bashrci powinieneś być gotowy do drogi.


#!/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

Źródło skryptu

éclairevoyant
źródło
5
Zapisałem ten skrypt i pozyskałem go z mojego .bashrc. Zacząłem tmux i nacisnąłem „Ctrl + B,:”, a potem napisałem „detach-” i nacisnąłem kilka kart. Nic. Dodałem ac, więc powiedział „detach-c” i wcisnąłem tab, to zakończyło się na „detach-client”. To jest dokładnie to samo zachowanie, którego doświadczyłem przed scenariuszem. Wydaje się, że nic się nie zmieniło.
bobpaul
6
@ bobpaul prosi o uzupełnienie tabulatora w tmux, a nie w powłoce jak bash.
Jason Axelson
1
@ kev prosi również o uzupełnienie tabulacji w tmux, a nie z bash. I zauważ, że niektóre powiązane (starsze?) Kody do tego sposobu wykonywania poleceń bash znajdują się na github na github.com/aziz/dotfiles/blob/master/bash/completion/…, ale nie jest dla mnie jasne, jak ich zachowanie się różni. Być może luolimao może chcieć zaoferować różnice w żądaniu ściągnięcia?
nealmcb
Ten skrypt autouzupełniania działa świetnie w Bash !! Dzięki @luolimao!
Trevor Sullivan
2
Głosowałem za odrzuceniem odpowiedzi, ponieważ OP prosi o automatyczne uzupełnianie z poziomu tmux, a nie o bash. Ta odpowiedź może być całkowicie uzasadniona w przypadku drugiego zapytania (uzupełnienie bash), ale wprowadza w błąd ludzi, którzy przychodzą tutaj przez wyszukiwarki, aby spróbować znaleźć uzupełnienie z poziomu tmux.
thiagowfx