Làm thế nào để hoàn thành tab khi gõ lệnh trong tmux?


22

Một số lệnh ( kill-sessionkill-server) có cùng tiền tố.
Khi tôi gõ ( prefix:kill-seTab), tmux sẽ không cho tôi bất kỳ kết quả nào.
Có một tùy chọn để hiển thị wildmenu để tự động hoàn thành bên trong tmux không?

Tôi đang sử dụng Ubuntu 12.04


Bạn đang sử dụng vỏ gì? Bạn có thể tìm thấy nó với tiếng vang $ SHELL
éclairevoyant

1
Đó là/bin/bash
kev

4
Vỏ liên quan như thế nào? Khi bạn nhập Ctrl + B,: trong tmux, bạn sẽ được cung cấp một dấu nhắc lệnh tmux (giống như khi bạn nhập: trong VIM, bạn không được cung cấp dấu nhắc bash.) Đây là câu hỏi tmux, không phải câu hỏi shell.
bobpaul

Câu trả lời hoàn thành bash là hữu ích, nhưng không trả lời câu hỏi để sử dụng bên trong tmux. Tôi đoán rằng vì tmux không có thêm một không gian dọc để làm việc, nên nó không cung cấp các tùy chọn hoàn thành tab như bash, mặc dù nó ít nhất hoàn thành những gì bạn đang gõ cho đến khi có mơ hồ. Vì vậy, mọi người có thể sử dụng tùy chọn bash để tìm hiểu và sử dụng tùy chọn tmux cho quickies nơi họ biết những gì họ muốn.
nealmcb

Câu trả lời:


8

Kịch bản sau đây cung cấp một bash hoàn thành cho tmux và tôi đã thử nó ngay trên hộp của mình và nó hoạt động rất tốt. Chỉ cần sao chép tập lệnh vào một tệp trên máy tính của bạn và đặt

   source /path/to/tmux_completion.sh

trong bạn .bashrcvà bạn nên sẵn sàng để đi.


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

Nguồn kịch bản


5
Tôi đã lưu tập lệnh này và lấy nó từ .bashrc của tôi. Tôi bắt đầu tmux và nhấn "Ctrl + B ,:" và sau đó gõ "tách ra" và nhấn tab một bó. Không có gì. Tôi đã thêm ac để nó nói "tách ra" và nhấn tab, nó đã hoàn thành "tách khách". Đây là hành vi chính xác mà tôi đã trải nghiệm trước khi kịch bản. Dường như không có gì thay đổi.
bobpaul

6
@bobpaul đang yêu cầu hoàn thành tab trong tmux, không phải từ vỏ như bash.
Jason Axelson

1
@kev cũng đang yêu cầu hoàn thành tab trong tmux, không phải từ bash. Và lưu ý rằng một số mã liên quan (cũ hơn?) Cho phương pháp hoàn thành lệnh bash này có trên github tại github.com/aziz/dotfiles/blob/master/bash/completion/, nhưng tôi không rõ hành vi của họ khác nhau như thế nào. Có lẽ luolimao có thể muốn cung cấp khác biệt trong một yêu cầu kéo?
nealmcb

Kịch bản tự động hoàn thành này hoạt động rất tốt trong Bash !! Cảm ơn @luolimao!
Trevor Sullivan

2
Tôi đã bỏ phiếu trả lời vì OP đang yêu cầu tự động hoàn thành từ trong tmux, không phải cho bash. Câu trả lời này có thể hoàn toàn hợp lý cho cuộc điều tra thứ hai (hoàn thành cho bash), nhưng nó đánh lừa những người đến đây thông qua các công cụ tìm kiếm để cố gắng tìm ra sự hoàn thành từ bên trong tmux.
thiagowfx
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.