วิธีการแท็บเสร็จเมื่อพิมพ์คำสั่งใน 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 ไม่ใช่คำถามเชลล์
bobpaul

คำตอบเสร็จสิ้นการทุบตีเป็นประโยชน์ แต่ไม่ตอบคำถามสำหรับใช้ภายใน tmux ฉันคาดเดาว่าเนื่องจาก tmux ไม่มีพื้นที่แนวตั้งเพิ่มเติมสำหรับใช้งานมันก็ไม่ได้เสนอตัวเลือกการเติมแท็บอย่างที่ bash ทำ แต่อย่างน้อยก็ทำสิ่งที่คุณพิมพ์จนเสร็จ ความคลุมเครือ ดังนั้นผู้ใช้สามารถใช้ตัวเลือก bash เพื่อเรียนรู้และใช้ตัวเลือก tmux สำหรับ quickies ที่พวกเขารู้ว่าสิ่งที่พวกเขาต้องการ
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-" แล้วกด tab a พวง ไม่มีอะไร ฉันเพิ่ม ac ดังนั้นมันจึงบอกว่า "detach-c" และกดแท็บมันเสร็จสมบูรณ์ในการ "แยกไคลเอนต์" นี่เป็นพฤติกรรมเดียวกันที่ฉันเคยพบมาก่อนหน้าสคริปต์ ดูเหมือนจะไม่มีอะไรเปลี่ยนแปลง
bobpaul

6
@ บ๊อบพอลขอให้แท็บเสร็จสมบูรณ์ภายใน tmux ไม่ใช่จากในเชลล์เช่นทุบตี
Jason Axelson

1
@kev ยังขอให้แท็บเสร็จภายใน tmux ไม่ใช่จากการทุบตี และโปรดทราบว่าโค้ดที่เกี่ยวข้อง (เก่ากว่า) สำหรับวิธีการเติมคำสั่ง bash นี้อยู่ใน github ที่github.com/aziz/dotfiles/blob/master/bash/completion/ …แต่มันไม่ชัดเจนสำหรับฉันว่าพฤติกรรมของพวกเขาแตกต่างกันอย่างไร บางที luolimao อาจต้องการเสนอ diffs ในคำขอดึงหรือไม่
nealmcb

สคริปต์การเติมข้อมูลอัตโนมัตินี้ทำงานได้ดีใน Bash !! ขอบคุณ @luolimao!
Trevor Sullivan

2
ฉันโหวตคำตอบลงเพราะ OP ขอให้เติมข้อมูลอัตโนมัติจากภายใน tmux ไม่ใช่เพื่อทุบตี คำตอบนี้อาจสมเหตุสมผลอย่างสมบูรณ์สำหรับการสอบถามครั้งที่สอง (เสร็จสิ้นการทุบตี) แต่ก็ทำให้ผู้ที่มาที่นี่ผ่านเครื่องมือค้นหาเข้าใจผิดเพื่อพยายามค้นหาความสำเร็จจากภายใน tmux
thiagowfx
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.