Tmux की एक फलक चौड़ाई कैसे तय करें?


4

मान लीजिए कि मैंने एक विंडो को 2 पैन में विभाजित किया है, सही में चौड़ाई 20 सेल है। लेकिन जब मैं बाहरी टर्मिनल एमुलेटर का आकार बदलता हूं, तो फलक की चौड़ाई बदल जाती है।

क्या इसको ठीक करने का कोई तरीका है? क्योंकि मैं 20 कोशिकाओं के लिए फिट होने के लिए स्वरूपित जानकारी प्रदर्शित करना चाहता हूं

जवाबों:


4

जहाँ तक मैं बता सकता हूँ, tmux के पास न्यूनतम मान तक चौड़ाई तय करने के लिए कोई सेटिंग नहीं है, केवल एक अधिकतम मूल्य के लिए। ऐसा इसलिए है क्योंकि टर्मिनल विंडो को tmux के न्यूनतम मान से छोटा किया जा सकता है और tmux के पास इसे संभालने का उपयुक्त तरीका नहीं हो सकता है।

कहा जा रहा है, यदि आपके पास अन्य tmux पैन खुले हैं, तो आप PS1 ( PS1='$(resizePane $id)other-stuff') या PROMPT_COMMAND में एक छोटी सी स्क्रिप्ट जोड़ सकते हैं ताकि आप उस सूचना-फलक का लगातार आकार बदल सकें जिसे आप 20c चौड़ाई पर रखना चाहते हैं क्योंकि आप tmux के भीतर अन्य पैन हैं। अनिवार्य रूप से, 1) आप प्रोग्राम खोल सकते हैं, 2) टर्मिनल का आकार बदल सकते हैं, 3) दूसरे फलक में स्थानांतरित करें, 4) प्रकार Enterऔर ब्लाम, फलक का आकार परिवर्तन होता है।

आप के लिए आदमी पृष्ठों को देखना चाहिए

resize-pane [-DLRU] [-t target-pane] [adjustment]

यदि आप वांछित फलक में हैं, तो बस इतना करना चाहिए कि बाईं ओर से चौड़ाई को छोटा करना है -L से या दाएं -R से x वर्णों को 20 पर पहुंचने के लिए आवश्यक है। अनिवार्य रूप से, यदि फलक एक दीवार से लंबा है। फलक की तुलना में, यह सिकुड़ने के लिए दिशा और विस्तार के लिए विपरीत का उपयोग करें। यदि मेरा फलक दाईं दीवार के बगल में है, तो चौड़ाई को कम करने के लिए -R का उपयोग करें और इसे बड़ा करने के लिए -L करें।

सही मात्रा में वर्ण प्राप्त करने के लिए, आपको फलक की वर्तमान चौड़ाई जानने की आवश्यकता है, जो यदि आप टाइप करते हैं, तो फलक के साथ पाया जा सकता है

tmux list-panes

मुझे अभी तक यह बताने का कोई तरीका नहीं है कि आप वर्तमान में कौन से फलक नंबर को छोड़कर Prefix+qया टाइप कर रहे हैं

tmux display-panes

यह हमें वर्तमान विंडो में सभी पैन की आईडी नंबर देगा। यदि हम आईडी # ($ आईडी) जानते हैं कि यह सही दीवार के खिलाफ है, तो हम फलक को 20 वर्णों तक विस्तृत कर सकते हैं:

paneWidths=$(tmux list-panes | awk '{print $2}' | cut -c 2- | cut -f 1 -d'x')
currentWidth=$(echo $paneWidths | sed $id'q;d')
resizeNum=$(expr $currentWidth - 20)

tmux resize-pane -R -t $id $resizeNum

ध्यान दें कि resizeNum ऋणात्मक नहीं हो सकता है। यदि यह ऋणात्मक है, तो आकार बदलने के लिए दूसरे पक्ष का उपयोग करें (यह स्वचालित हो सकता है, लेकिन मैं आपको छोड़ दूंगा)। इसके अलावा, यदि आप इसे अपने प्रोग्राम के कोड में शामिल करते हैं, तो आप "-t $ id" भाग की उपेक्षा कर सकते हैं, लेकिन मुझे आपके प्रोग्राम के भीतर से $ id खोजने का कोई तरीका नहीं पता है।

यह आपके लिए देखने के लिए भी उपयोग किया जा सकता है tmux setw main-pane-width tmux setw other-pane-width, जो एक नया टाइल प्रारूप फिर से लोड करने पर विशिष्ट फलक की चौड़ाई निर्धारित करेगा। प्रारूपों का उपयोग करने के लिएPrefix+space

उम्मीद है की यह मदद करेगा!

--- स्वचालन पर अधिक जानकारी जोड़ने के लिए संपादित ---

मेरा पिछला विचार, आप के लिए एक नया फलक पर जाने और चलाने के लिए था PS1="$(resizePane $id)${PS1}"और फिर ENTERदूसरे फलक के भीतर मारा ताकि आप नए आकार के फलक में काम करना जारी रख सकें, लेकिन मैंने एक नया विकल्प माना है जो आपके लिए काम कर सकता है ...

मैंने मूल रूप से पोस्ट करने के बाद से इस विचार पर पुनर्विचार किया है और मुझे लगता है कि अगर प्रोग्राम चल रहा है तो यह स्वचालित रूप से स्वचालित हो सकता है जिसमें शेल कमांड भेज सकते हैं। ऐसा इसलिए है क्योंकि हम विंडो को अनिवार्य रूप से विभाजित करके प्रोग्राम चला सकते हैं। यहाँ एक उदाहरण है कि मेरा क्या मतलब है। निम्नलिखित कोड

  1. उपयोगकर्ता चलाता है runCodeSplit.sh, जो
  2. अंतिम फलक और रन के दाईं ओर एक नया फलक क्षैतिज (20c चौड़ाई) विभाजित करता है test.sh
  3. लूप दर्ज करें
  4. वर्तमान फलक आकार की जाँच करता है और आकार बदलने का प्रयास करता है
  5. 10 सेकंड के लिए सोता है (लेकिन आप इसे बदल सकते हैं जो आप चाहते हैं)
  6. 3 और 4 10 बार दोहराता है, फिर बाहर निकलता है

runCodeSplit.sh:

#!/bin/bash
# runCodeSplit.sh

paneID=$(tmux list-panes | wc -l)
echo "pane: $paneID"
echo $(expr $paneID - 1)

# now, open a new pane and run the func
tmux split-window -h -l 20 -t $(expr $paneID - 1 ) "~/test.sh $paneID"

test.sh:

#!/bin/bash
# test.sh
if [[ $# -lt 1 ]] ; then 
    echo "please provide the pane-number" 
    exit 
fi
paneID=$1
i=0
while [[ i -lt 10 ]] ; do
    # find the current width and resize it at every loop
    width=$(tmux list-panes | awk '{print $2}' | cut -c 2- | cut -f 1 -d'x' | sed $(expr $paneID + 1)'q;d')
    resizeNum=$(expr $width - 20)
    echo "$paneID : w $width     r $resizeNum"

    if [[ $resizeNum -gt 0 ]] ; then
        tmux resize-pane -R -t $paneID $resizeNum
    elif [[ $resizeNum -lt 0 ]] ; then
        tmux resize-pane -L -t $paneID $(expr 0 - $resizeNum)
    fi 

    #now, we can do stuff ... 
    let i++
    echo "i= $i / 10"
    sleep 10
done
read -p "Press any key to close this pane ... " -n1 -s

नोट: दुर्भाग्य से, जिस तरह से मैंने इसे ऊपर लागू किया है, आपको वास्तव में इसे केवल एक बार tmux विंडो के अनुसार चलाना चाहिए। समस्या यह है कि हर बार जब आप इसे चलाते हैं, तो वे एक-दूसरे के बगल में झुकेंगे, जो बदले में उन्हें अंतरिक्ष के लिए प्रतिस्पर्धा करेगा (एक दूसरे को विस्तार करने और इसके विपरीत करने के लिए सिकुड़ जाएगा)। आप इस समस्या के आसपास काम करने में सक्षम हो सकते हैं, लेकिन मैं इसका पता लगाने के लिए आपको छोड़ देता हूं।


विस्तृत जवाब के लिए शुक्रिया। आपने कहा कि फलक का आकार बदलने के लिए PS या प्रॉम्प्ट कमांड का उपयोग करें, क्या इसका मतलब मुझे उस फलक पर स्विच करना होगा और आकार को समायोजित करने के लिए Enter दबाएं? क्या टर्मिनल बदलने की घटना को पकड़ने का कोई तरीका है? तो यह स्वचालित आकार बदल सकता है। चूंकि tmux अपने आप में टर्मिनल आकार को बदलने के लिए प्रतिक्रिया कर सकता है।
हाहाहोले

क्षमा करें कि मेरा पिछला उत्तर आपके लिए कम मददगार था। मैंने इसे पुन: प्रकाशित किया और ऊपर एक नया अनुभाग जोड़ा जिससे आप रिसाइज़िंग प्रक्रिया को स्वचालित कर सकते हैं। FYI करें यह मेरे लिए भी उपयोगी है :)
scicalculator

अन्वेषक के रूप में चिह्नित करें। btw, आखिरकार मैंने इस दृष्टिकोण का पालन नहीं किया, क्योंकि मैंने पाया कि मैं जिस शेल का उपयोग करता हूं - zsh - में आकार बदलने पर वापस कॉल करने की क्षमता है, इसलिए मैं समय में tmux आकार का उपयोग कर सकता हूं।
हाहाहोले

FYI करें: वर्तमान फलक संख्या के साथ पाया जा सकता हैtmux display-message -p '#P'
पीटर वी। मॉर्क

2

मैं अपनी विविधता पोस्ट करूँगा क्योंकि यह किसी को चोट नहीं पहुंचाएगा, और शायद किसी को बेहतर के रूप में फिट बैठता है।

मैं इसका उपयोग tmux के अंदर एक irssi सत्र में एक फलक का आकार बदलने के लिए करता हूं जो nicklist.plस्क्रिप्ट से आउटपुट को पढ़ता है । जब मैं विभिन्न टर्मिनलों से जुड़ता हूं, तो फलक अक्सर आकार बदल जाता है, और FIFO के लिए सही ढंग से काम करने के लिए>> 20 कॉलम चौड़ा होना आवश्यक है (और यह मेरे स्क्रीन स्पेस को चुराकर इसे व्यापक होना अनावश्यक है)।

दृढ़ CURRENT_PANE_WIDTHगणना पर ध्यान न दें और यदि आप चाहें तो grep + sed का उपयोग करें। वर्तमान में अधिकतर स्क्रिप्ट को पूरी तरह से शेल में रखने के लिए एक प्रयोग था (निश्चित रूप से, टमक्स कॉल को छोड़कर)। यह शायद सबसे तेज़ है, जो स्वचालन के लिए दिलचस्प हो सकता है जहां स्क्रिप्ट अक्सर चलती है (मैं वर्तमान में इसे एक विशिष्ट कॉल के रूप में चलाता हूं, हालांकि)।

#!/bin/sh
TMUX="/usr/bin/tmux"
TMUX_SESSION="irssi"
TMUX_WINDOW="0"
TMUX_WINDOW_PANE="1"
DESIRED_PANE_WIDTH="20"

error()
{
    printf '%s: error: %s\n' "${0##*/}" "${1}" 1>&2
    exit ${2}
}

# Find with grep and sed. More readable and easier to modify.
#CURRENT_PANE_WIDTH="$(${TMUX} list-panes -t "${TMUX_SESSION}:0 | grep "^${TMUX_WINDOW_PANE}: " | sed 's/^'"${TMUX_WINDOW_PANE}"': \[\([^x]\+\).*/\1/')"

# Find with shell expansion. Because it can be done!
CURRENT_PANE_WIDTH=$(${TMUX} list-panes -t "${TMUX_SESSION}:${TMUX_WINDOW}" |\
while read line; do
    PANE_MATCH="${line#${TMUX_WINDOW_PANE}:\ \[}"
    if [ "${line}" != "${PANE_MATCH}" ]; then
        CURRENT_PANE_WIDTH="${PANE_MATCH%%x*}"
        printf "${PANE_MATCH%%x*}"
        break;
    fi
done)

if [ -z "${CURRENT_PANE_WIDTH}" ]; then
    error 'no matching pane found.' 1
fi

if ! [ "${CURRENT_PANE_WIDTH}" -eq "${CURRENT_PANE_WIDTH}" ]; then
    error 'could not get integer width.' 1
elif ! [ "${CURRENT_PANE_WIDTH}" -eq "${DESIRED_PANE_WIDTH}" ]; then
    RESIZE_NUMBER=$((${CURRENT_PANE_WIDTH} - ${DESIRED_PANE_WIDTH}))
    if [ ${RESIZE_NUMBER} -ge 0 ]; then
        DIRECTION="R"
    else
        DIRECTION="L"
        RESIZE_NUMBER=$((-${RESIZE_NUMBER}))
    fi

    ${TMUX} resize-pane -t "${TMUX_SESSION}:${TMUX_WINDOW}" -${DIRECTION} ${RESIZE_NUMBER}
fi

धन्यवाद। मैं जिस स्थिति में हूं, वह बिल्कुल आपकी ही तरह है, मैं irssi और tmux का भी उपयोग करता हूं। लेकिन इस लिपि को कौन कहे? क्या मुझे इसे पेज 1 में कॉल करना चाहिए?
हौहोले

आप इसे कहीं से भी कॉल कर सकते हैं, क्योंकि इसमें tmux सेशन का नाम आदि शामिल है। व्यक्तिगत रूप से, मैं इसके बजाय एक irssi प्लगइन के रूप में फिर से लिखा है - 510x .se/notes/ पर "ऑटो अपडेट tmux pane का आकार nicklist.pl" पर देखें। पोस्ट / इंस्टॉल_और_सेटअप_BitlBee । मैं कम से कम एक जोड़े के लिए प्लगइन का उपयोग कर रहा हूं, और यह यहां बहुत अच्छा काम करता है।
डैनियल एंडरसन

बहुत बहुत धन्यवाद। जब मैं पर्याप्त प्रतिष्ठा
पाऊंगा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.