TMux에서 명령을 입력 할 때 완료를 탭하는 방법은 무엇입니까?


22

일부 명령 ( kill-sessionkill-server)은 동일한 접두사를 갖습니다.
( prefix:kill-seTab)를 입력하면 tmux가 결과를 제공하지 않습니다.
tmux 내에서 자동 완성을위한 와일드 메뉴를 표시하는 옵션이 있습니까?

우분투 12.04를 사용하고 있습니다.


어떤 쉘을 사용하고 있습니까? echo $ SHELL
éclairevoyant에서

1
그것은이다/bin/bash
케빈

4
쉘은 어떻게 관련되어 있습니까? tmux에서 Ctrl + B 를 입력 하면 tmux 명령 프롬프트가 나타납니다 (VIM에서 :를 입력 할 때와 마찬가지로 bash 프롬프트가 표시되지 않습니다). 이것은 쉘 질문이 아닌 tmux 질문입니다.
bobpaul

bash 완성 답변은 도움이되지만 tmux 내에서 사용하기위한 질문에는 대답하지 않습니다. tmux에는 사용할 수있는 수직 공간이 없기 때문에 bash처럼 탭 완성 옵션을 제공하지는 않지만 적어도 입력 할 때까지 입력을 완료하는 것은 아닙니다. 모호. 따라서 사람들은 bash 옵션을 사용하여 배우고 tmux 옵션을 사용하여 원하는 것을 빨리 찾을 수 있습니다.
nealmcb

답변:


8

다음 스크립트는 tmux에 대한 bash 완성을 제공하며 지금 바로 상자에서 테스트했으며 훌륭하게 작동합니다. 스크립트를 컴퓨터의 파일에 복사하고

   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은 bash와 같은 쉘이 아닌 tmux 내에서 탭 완성을 요청합니다.
Jason Axelson

1
@kev는 bash가 아닌 tmux 내에서 탭 완성을 요구합니다. 그리고이 bash 명령 완성 접근 방식에 대한 관련 (이전?) 코드는 github github.github.com/aziz/dotfiles/blob/master/bash/completion/에 있지만 그 동작이 어떻게 다른지 명확하지 않습니다. 아마도 luolimao가 풀 요청에서 diff를 제공하고 싶을 수도 있습니다.
nealmcb

이 자동 완성 스크립트는 Bash에서 훌륭하게 작동합니다! 감사합니다 @luolimao!
Trevor Sullivan

2
OP가 bash가 아닌 tmux 내에서 자동 완성을 요구하기 때문에 대답에 투표했습니다. 이 답변은 두 번째 질문 (bash의 완성)에 완전히 합리적 일 수 있지만 검색 엔진을 통해 여기에 온 사람들이 tmux 내에서 완성을 찾으려고 오도합니다.
thiagowfx
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.