Tmux में कमांड टाइप करने पर टैब कैसे पूरा होता है?


22

कुछ कमांड ( kill-sessionऔर kill-server) में एक ही उपसर्ग है।
जब मैं टाइप करता हूं ( prefix:kill-seTab), tmux मुझे कोई परिणाम नहीं देगा।
क्या tmux के अंदर ऑटो-समापन के लिए वाइल्डमेनू दिखाने का विकल्प है?

मैं Ubuntu 12.04 का उपयोग कर रहा हूं


आप किस खोल का उपयोग कर रहे हैं? आप इसे इको $ SHELL
éclairevoyant

1
यह/bin/bash
केव

4
शेल कैसे संबंधित है? जब आप Ctrl + B ,: tmux में टाइप करते हैं, तो आपको tmux कमांड प्रॉम्प्ट दिया जाता है (जैसे जब आप टाइप करते हैं: VIM में, आपको बैश प्रॉम्प्ट नहीं दिया जाता है।) यह एक tmux प्रश्न है, शेल प्रश्न नहीं।
बोबपौल

बैश पूर्ण उत्तर सहायक है, लेकिन tmux के अंदर उपयोग के लिए प्रश्न का उत्तर नहीं देता है। मुझे लगता है कि चूंकि tmux के पास काम करने के लिए ऊर्ध्वाधर स्थान की एक अतिरिक्त रेखा नहीं है, यह सिर्फ टैब पूरा करने के विकल्प की पेशकश नहीं करता है जैसे कि 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-" टाइप किया और टैब को एक गुच्छा दिया। कुछ भी तो नहीं। मैंने एसी जोड़ा, तो उसने कहा "डिटैच-सी" और हिट टैब, यह "डिटैच-क्लाइंट" के लिए पूरा हुआ। यह वही सटीक व्यवहार है जो मैंने पटकथा से पहले अनुभव किया था। लगता है कुछ भी नहीं बदला है।
बोबपौल

6
@bobpaul tmux के भीतर टैब पूरा करने के लिए कह रहा है, बैश जैसे शेल में से नहीं।
जेसन एक्सलसन

1
@kev tmux के भीतर टैब पूरा करने के लिए भी कह रहा है, बैश से नहीं। और ध्यान दें कि इस बैश कमांड पूरा होने के दृष्टिकोण के लिए कुछ संबंधित (पुराने?) कोड github.com/aziz/dotfiles/blob/master/bash/completion/… पर github पर है, लेकिन यह मेरे लिए स्पष्ट नहीं है कि आपका व्यवहार कैसे भिन्न है। शायद luolimao एक पुल अनुरोध में diffs की पेशकश करना चाह सकता है?
nealmcb

यह स्वतः पूर्ण स्क्रिप्ट बैश में महान काम करती है !! धन्यवाद @ लोलिमो!
ट्रेवर सुलिवन

2
मैंने जवाब को नीचे वोट दिया क्योंकि ओपी tmux के भीतर से ऑटो-पूरा करने के लिए कह रहा है, बैश के लिए नहीं। यह उत्तर दूसरी जांच (बैश के लिए पूरा होने) के लिए पूरी तरह से उचित हो सकता है, लेकिन यह उन लोगों को गुमराह करता है जो खोज इंजन के माध्यम से यहां आते हैं और tmux के भीतर से पूरा होने की कोशिश करते हैं।
थियागौफ़एक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.