Як вкласти вкладку під час введення команди в tmux?


22

Деякі команди ( kill-sessionі kill-server) мають однаковий префікс.
Коли я prefix:kill-seTabнабираю ( ), tmux не дасть мені жодного результату.
Чи є можливість показати wildmenu для автоматичного завершення всередині tmux?

Я використовую Ubuntu 12.04


Яку оболонку ви використовуєте? Ви можете знайти його з echo $ SHELL
éclairevoyant

1
Це/bin/bash
кев

4
Як пов’язана оболонка? Коли ви вводите Ctrl + B,: у tmux, вам надається командний рядок tmux (точно так само, як під час введення: у VIM, вам не надається запит bash.) Це питання tmux, а не питання оболонки.
бобпаул

Відповідь на завершення bash є корисною, але не відповідає на питання щодо використання всередині tmux. Я здогадуюсь, що оскільки tmux не має додаткової лінії вертикального простору для роботи, він просто не пропонує варіанти заповнення вкладок, як bash, хоча він виконує принаймні завершення того, що ви набираєте, поки не з’явиться неоднозначність. Таким чином, люди можуть використовувати опцію bash для навчання, а також використовувати tmux варіант для швидкості, де вони знають, що хочуть.
nealmcb

Відповіді:


8

Наступний скрипт забезпечує баш-завершення для tmux, і я протестував його на своїй коробці саме зараз, і він чудово працює. Просто скопіюйте скрипт у файл на своєму комп’ютері та поставте

   source /path/to/tmux_completion.sh

у вашому, .bashrcі ви повинні бути готові йти.


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

Джерело сценарію


5
Я зберег цей скрипт і отримав його з мого .bashrc. Я запустив tmux і натиснув "Ctrl + B,:", а потім набрав "detach-" і натиснув вкладку. Нічого. Я додав ac, так що він сказав "detach-c" і натиснувши вкладку, вона завершена до "detach-client". Це точно та ж поведінка, яку я відчував перед сценарієм. Ніби нічого не змінилося.
bobpaul

6
@bobpaul просить завершити вкладку в tmux, а не в оболонці, як bash.
Jason Axelson

1
@kev також просить заповнити вкладку в tmux, а не від bash. І зауважте, що деякий пов'язаний (старіший?) Код для цього підходу до виконання команд bash знаходиться на github за адресою github.com/aziz/dotfiles/blob/master/bash/completion/…, але мені незрозуміло, чим відрізняється їх поведінка. Можливо, luolimao, можливо, захоче запропонувати розліки в запиті на виклик?
nealmcb

Цей сценарій автодоповнення чудово працює в Bash !! Дякую @luolimao!
Тревор Салліван

2
Я проголосував відповідь за те, що ОП просить автоматичне завершення зсередини tmux, а не bash. Ця відповідь може бути цілком розумною для другого запиту (завершення для bash), але він вводить в оману людей, які приходять сюди через пошукові системи, щоб спробувати знайти завершення з tmux.
thiagowfx
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.