Tmux में फलक का शीर्षक


88

अपनी स्थानीय मशीन पर मुझे एक साथ 3 नोड.जेएस इंस्टेंस चल रहे हैं। प्रत्येक के पास "सर्वर" नामक एक tmux विंडो में स्वयं का फलक है। समस्या यह है कि यह पता लगाना आसान नहीं है कि कौन सा नोड किस फलक में चल रहा है, क्योंकि उनके लॉग समान हैं।

मुझे हर फलक के लिए एक शीर्षक चाहिए। जैसा कि मुझे मिला, tmux में यह सुविधा नहीं है: इसमें केवल विंडोज़ के लिए शीर्षक हैं और पैन के लिए नहीं। प्रत्येक नोड के लिए प्रत्येक फलक के अंदर एक अलग tmux सत्र का शुभारंभ एक ओवरकिल की तरह दिखता है।

तो क्या कोई छोटा कार्यक्रम है जो एक कमांड को लॉन्च करता है, एक निर्दिष्ट स्थिति पट्टी के साथ अपने आउटपुट को लपेटता है?

अग्रिम में धन्यवाद


1
संस्करण 2.3 के रूप में tmux फलक शीर्षक का समर्थन करता है, देखें stackoverflow.com/a/37602055/266453
डेनिस जी

जवाबों:


80

tmux प्रति-फलक शीर्षक का समर्थन करता है, लेकिन यह इन शीर्षकों को प्रदर्शित करने के लिए प्रति-फलक स्थान प्रदान नहीं करता है।

आप एस्केप अनुक्रम ESC ]2;… ESC \(जैसे tmux manpage में नाम और शीर्षक नामक अनुभाग देखें) के साथ एक फलक शीर्षक सेट कर सकते हैं । आप इसे शेल से इस तरह कर सकते हैं:

printf '\033]2;%s\033\\' 'title goes here'

प्रत्येक फलक का शीर्षक सिस्टम के होस्टनाम में चूक करता है। डिफ़ॉल्ट रूप से सक्रिय फलक का शीर्षक tmux स्टेटस लाइन के दाईं ओर प्रदर्शित होता है (सत्र चर status-rightका डिफ़ॉल्ट वैश्विक मान है "#22T" %H:%M %d-%b-%y, जो फलक के शीर्षक, समय और दिनांक के 22 वर्ण दिखाता है)।

इसलिए, जब तक आप सक्रिय फलक का शीर्षक (यानी निष्क्रिय फलक का शीर्षक देखने के लिए पैन स्विच करने के लिए तैयार) को देखने में संतुष्ट हैं, आप डिफ़ॉल्ट कार्यक्षमता के साथ प्राप्त कर सकते हैं। बस प्रत्येक फलक के लिए मुख्य कमांड शुरू करने से पहले उचित शीर्षक-सेटिंग एस्केप अनुक्रम भेजें।


यदि आपको कुछ प्रति-फलक जानकारी प्रदर्शित करने के लिए पूरी तरह से एक समर्पित लाइन की आवश्यकता है, तो नेस्टेड tmux सेशन उतना नहीं हो सकता है (अनावश्यक) "ओवरकिल" जैसा कि आप पहले सोच सकते हैं।

सामान्य स्थिति में, कुछ दिए गए टर्मिनल पर एक इनवॉयलेट स्टेटस लाइन प्रदान करने के लिए, आपको एक पूर्ण टर्मिनल (पुनः) एमुलेटर की आवश्यकता होगी जो मूल टर्मिनल और एक नए टर्मिनल (एक कम लाइनों वाला) के बीच बैठता है। आंतरिक टर्मिनल को भेजे गए नियंत्रण अनुक्रमों का अनुवाद करने और उन्हें मूल टर्मिनल के लिए अनुवाद करने के लिए ऐसे (पुनः) अनुकरण की आवश्यकता होती है। उदाहरण के लिए, बाहरी टर्मिनल के निचले भाग में एक कमांड लाइन बनाए रखने के लिए कमांड

अंतिम पंक्ति में जाएं।

आंतरिक टर्मिनल को भेजा जाना चाहिए

अगली पंक्ति में जाएं।

जब बाहरी टर्मिनल के लिए भेजा और भेजा जाता है। इसी तरह, आंतरिक टर्मिनल के लिए भेजा जाने वाला एलएफ बनना चाहिए

यदि कर्सर पिछली रेखा के बगल में है, तो इस रेखा को और इसके ऊपर की सभी रेखाओं को एक पंक्ति तक स्क्रॉल करें, ताकि अगली अगली-अंतिम पंक्ति (अंतिम पंक्ति पर स्थिति रेखा की सुरक्षा) प्रदान की जा सके। अन्यथा, एक एलएफ भेजें।

बाहरी टर्मिनल में।

Tmux और स्क्रीन जैसे प्रोग्राम सिर्फ ऐसे टर्मिनल री-एमुलेटर हैं। निश्चित रूप से, टर्मिनल एमुलेटर के चारों ओर लिपटी हुई अन्य कार्यक्षमता है, लेकिन आपको विश्वसनीय स्थिति रेखा प्रदान करने के लिए टर्मिनल एमुलेशन कोड के एक बड़े हिस्से की आवश्यकता होगी ।


हालांकि, एक हल्के वजन समाधान के रूप में लंबे समय के रूप में है

  1. आपके प्रोग्राम ( Node.js उदाहरण) में उन पैन के साथ सीमित टर्मिनल इंटरैक्शन हैं जिनमें वे चल रहे हैं (यानी कोई कर्सर पोजिशनिंग नहीं), और
  2. जब आपके प्रोग्राम चल रहे हों, तब आप पैन का आकार परिवर्तन न करें।

कई टर्मिनल एमुलेटर की तरह, tmux अपने पैन में "सेट स्क्रॉलिंग क्षेत्र" टर्मिनल कंट्रोल कमांड का समर्थन करता है। आप स्क्रॉलिंग क्षेत्र को टर्मिनल के शीर्ष (या नीचे) एन -1 लाइनों तक सीमित करने के लिए इस कमांड का उपयोग कर सकते हैं और गैर-स्क्रॉलिंग लाइन में कुछ प्रकार के उदाहरण-पहचान पाठ लिख सकते हैं।

प्रतिबंध (कोई कर्सर आंदोलन आदेश की अनुमति नहीं, कोई आकार नहीं देता) की आवश्यकता होती है क्योंकि प्रोग्राम जो आउटपुट उत्पन्न कर रहा है (उदाहरण के लिए Node.js उदाहरण) को पता नहीं है कि स्क्रॉल किसी विशेष क्षेत्र तक सीमित है। यदि आउटपुट-जनरेटिंग प्रोग्राम स्क्रॉलिंग क्षेत्र के बाहर कर्सर को स्थानांतरित करने के लिए हुआ, तो आउटपुट विकृत हो सकता है। इसी तरह, टर्मिनल एमुलेटर शायद स्वचालित रूप से स्क्रॉलिंग क्षेत्र को रीसेट करता है जब टर्मिनल को आकार दिया जाता है (इसलिए "गैर-स्क्रॉलिंग लाइन" शायद स्क्रॉलिंग को समाप्त कर देगा)।

मैंने एक स्क्रिप्ट लिखी जो tputउपयुक्त नियंत्रण अनुक्रम उत्पन्न करने के लिए उपयोग करती है, गैर-स्क्रॉलिंग लाइन में लिखें, और कर्सर को स्क्रॉलिंग क्षेत्र में ले जाने के बाद एक प्रोग्राम चलाएं:

#!/bin/sh

# usage: no_scroll_line top|bottom 'non-scrolling line content' command to run with args
#
#     Set up a non-scrolling line at the top (or the bottom) of the
#     terminal, write the given text into it, then (in the scrolling
#     region) run the given command with its arguments. When the
#     command has finished, pause with a prompt and reset the
#     scrolling region.

get_size() {
    set -- $(stty size)
    LINES=$1
    COLUMNS=$2
}
set_nonscrolling_line() {
    get_size
    case "$1" in
        t|to|top)
            non_scroll_line=0
            first_scrolling_line=1
            scroll_region="1 $(($LINES - 1))"
            ;;
        b|bo|bot|bott|botto|bottom)
            first_scrolling_line=0
            scroll_region="0 $(($LINES - 2))"
            non_scroll_line="$(($LINES - 1))"
            ;;
        *)
            echo 'error: first argument must be "top" or "bottom"'
            exit 1
            ;;
    esac
    clear
    tput csr $scroll_region
    tput cup "$non_scroll_line" 0
    printf %s "$2"
    tput cup "$first_scrolling_line" 0
}
reset_scrolling() {
    get_size
    clear
    tput csr 0 $(($LINES - 1))
}

# Set up the scrolling region and write into the non-scrolling line
set_nonscrolling_line "$1" "$2"
shift 2

# Run something that writes into the scolling region
"$@"
ec=$?

# Reset the scrolling region
printf %s 'Press ENTER to reset scrolling (will clear screen)'
read a_line
reset_scrolling

exit "$ec"

आप इसे इस तरह उपयोग कर सकते हैं:

tmux split-window '/path/to/no_scroll_line bottom "Node instance foo" node foo.js'
tmux split-window '/path/to/no_scroll_line bottom "Node instance bar" node bar.js'
tmux split-window '/path/to/no_scroll_line bottom "Node instance quux" node quux.js'

स्क्रिप्ट का काम बाहर भी होना चाहिए tmux रूप में लंबे समय टर्मिनल का समर्थन करता है के रूप में और उसके प्रकाशित करता है csrऔर cupterminfo क्षमताओं।


आपकी स्क्रिप्ट ठीक वैसे ही काम करती है, जैसी मुझे उम्मीद थी; एकमात्र सवाल: मुझे "non_scroll_line" के रंग को अनुकूलित करने के लिए Google को क्या करना चाहिए?
एंड्रे लुशनिकोव

1
हो सकता है कि "टर्मिनो क्षमता अग्रभूमि पृष्ठभूमि का रंग" (यानी टर्मो मैनपेज में रंग के बारे में पढ़ें)। आप tput"लाइन सामग्री" तर्क में उपयुक्त नियंत्रण दृश्यों को शामिल करने के लिए उपयोग कर सकते हैं । अधिकांश टर्मिनलों के साथ, आप मैजेन्टा (5) के साथ लाइन को "सियान (6) और हरा (3) बना सकते हैं no_scroll_line top "$(tput setaf 6; tput setab 5)Node: $(tput setaf 3)foo$(tput op)" node foo.jssetafअग्रभूमि सेट करता है, setabपृष्ठभूमि सेट opकरता है, टर्मिनलों को डिफ़ॉल्ट रंगों में रीसेट करता है। रंग क्षमताएं आपके टर्मिनल एमुलेशन के आधार पर 0–7, 0–15, 0–87, या 0-255 से एक नंबर लेती हैं।
क्रिस जॉन्सन

हमने अब pymux जारी किया। यह फलक शीर्षक पट्टियाँ प्रदर्शित करता है: github.com/jonathanslenders/pymux
जोनाथन स्लेंडर्स

ऐसा लगता है कि व्यवहार यह है कि फलक शीर्षक शेल में चलाए जा रहे कमांड पर सेट है। जब तक हम एक लंबे समय से चली आ रही प्रक्रिया (जो यह भी जानते हैं कि शीर्षक सेटिंग से बचने के क्रम में आउटपुट कैसे किया जाता है) को अंदर नहीं ले जाते हैं तो यह "स्टिक" नहीं होगा।
स्टीवन लू

4
कृपया नीचे दिए गए उत्तर पर एक नज़र डालें: stackoverflow.com/a/37602055/266453 tmux संस्करण 2.3 के रूप में फलक सीमाओं में शीर्षक का समर्थन करता है।
डेनिस जी

78

इस कार्यक्षमता को इस प्रतिबद्ध में tmux में जोड़ा गया है । यह संस्करण 2.2 में नहीं है, लेकिन ऐसा लगता है कि यह 2.3 में होगा।

इसे सक्षम करने के लिए:

tmux set -g pane-border-status top

या यदि आप पसंद करते हैं:

tmux set -g pane-border-status bottom

अपनी सीमा रेखा के रूप में एक कस्टम पाठ सेट करने के लिए आप इसका उपयोग कर सकते हैं pane-border-format, जैसे:

tmux set -g pane-border-format "#{pane_index} #{pane_current_command}"

1
यह फलक की संख्या और एक डिफ़ॉल्ट शीर्षक दिखाता है। आप इसे कैसे बदल सकते हैं?
ए डी एन

मैं फलक संख्या के बारे में निश्चित नहीं हूं, लेकिन यह अनुक्रम से बचने के लिए एक xterm विंडो शीर्षक की तरह प्रतिक्रिया करता है। उदाहरण के लिए, बैश के साथ, मैंने "user @ host: working dir /" पाने के लिए PS1 = '[\ e] 0; \ u @ \ h: \ w \ a] $' सेट किया है
kevmitch

जहाँ तक मैं समझता हूँ, आप हाथ से पहले उस क्रम को निर्धारित करते हैं। लेकिन कोई शॉर्टकट या कुंजी संयोजन नहीं है जो उन्हें बदलता है। तो, tmuxआपको tmuxइसे बदलने के लिए बाहर कुछ कमांड की आवश्यकता है। सही? या क्या कोई अनुक्रम है जो इसे अपडेट कर सकता है?
ए डी एन

हाँ, आप बस रनिंग शेल में वैरिएबल सेट करते हैं और जब अगला प्रॉम्प्ट खींचा जाता है तो यह अपडेट हो जाता है। मेरे लिए ऐसा लगता है कि tmux थोड़ा स्केच है और केवल तब ही इसे अपडेट किया जाता है जब आप किसी अन्य फलक पर जाते हैं।
केवमिच

आप वास्तव में pane-border-format(सामान्य #{...}प्रारूप) प्रदर्शित करने के लिए फलक के लिए एक कस्टम प्रारूप स्ट्रिंग सेट करने के लिए उपयोग कर सकते हैं । इसे शामिल करने के लिए मैंने आपके उत्तर को संपादित कर दिया है।
डेनिस जी

32

चूंकि tmux 2.6आप कर सकते हैं:

$ tmux select-pane -t {pane} -T {title}

# Examples:
$ tmux select-pane -T title1          # Change title of current pane
$ tmux select-pane -t 1 -T title2     # Change title of pane 1 in current window
$ tmux select-pane -t 2.1 -T title3   # Change title of pane 1 in window 2

आप एक स्थिति पट्टी में प्रति फलक शीर्षक देख सकते हैं:

$ tmux set pane-border-status bottom      # For current window
$ tmux set -g pane-border-status bottom   # For all windows

इसके साथ स्थिति पट्टी अक्षम करें:

$ tmux set pane-border-status off       # For current window
$ tmux set -g pane-border-status off    # For all windows

क्या आपको पता है कि tmux को अपने नीचे से शीर्षक बदलने से रोकने का कोई तरीका है? उदाहरण के लिए, यदि मैं एक फलक का शीर्षक निर्धारित करता हूं और फिर उस फलक में कुछ करता हूं, जैसे cd $HOME, शीर्षक को मूल्य में बदल दिया जाता है $HOME। (मैं इसे tmux 2.8 पर देख रहा हूं।)
pdoherty926

1
@ pdoherty926 शायद आपको पहले ही जवाब मिल गया हो, लेकिन जांच करें set-window-option automatic-rename off
कोई नाम नहीं

मेरे पास है set-option -g allow-rename offमेरे में .tmux.confफ़ाइल।
ईयाल लेविन

1
सुझाव के लिए धन्यवाद। मैं घाव का उपयोग कर रहा हूं pane-border-formatऔर एक उपयोगकर्ता ने चर प्रदान किया है (मुझे यकीन नहीं है कि इस सुविधा के लिए कोई आधिकारिक नाम है) क्या प्रदर्शित करने के लिए। यहाँ एक उदाहरण है।
पौधारथी

14

मैं tmux - टिकट के लिए फलक स्थिति पट्टी पर काम कर रहा हूँ। मेरी विकास शाखा यहाँ github: https://github.com/jonathanslenders/tmux पर देखी जा सकती है

अभी, यह पहले से ही एक कार्यशील नाम "फलक" शीर्षक जोड़ता है । अभी भी कुछ कीड़े हैं, और एपीआई में सुधार होगा। विचार प्रति फलक में एक स्थिति पट्टी बनाने का है, जिसमें सत्र स्थिति पट्टी की तरह कुछ स्वरूपण हो सकते हैं। बाकी tmux की तरह, सब कुछ स्क्रिप्ट योग्य और अनुकूलन योग्य होना चाहिए। जब समाप्त और स्थिर होता है, तो संभवतः इसे आधिकारिक tmux में शामिल किया जाएगा।


जब आप वहां होते हैं, तो क्या आप इसे बना सकते हैं ताकि फलक शीर्षक ब्रेक-फलक के दौरान डिफ़ॉल्ट विंडो शीर्षक बन जाए?
djsadinoff

इस शाखा का tmux में कभी विलय नहीं हुआ था। लेकिन मैंने इसके बजाय pymux बनाया, जिसमें फलक शीर्षक पट्टियाँ हैं: github.com/jonathanslenders/pymux
जोनाथन Slenders

यह कमांड नवीनतम बिल्ड (या तो a24260) पर काम नहीं करता है।
ए डी एन

14

मैं tmux 2.3 संस्करण का उपयोग कर रहा हूं, मुझे लगता है कि सीमा शैली पिछले संस्करणों में समर्थित नहीं है। इसी से मेरा काम बना है:

प्रत्येक फलक के लिए शीर्षक सेट करें:

printf '\033]2;My Pane Title\033\\'

फिर:

tmux set -g pane-border-format "#{pane_index} #T"

9
कम से कम हाल ही में tmux 2.6 के रूप में, आप tmux के भीतर फलक शीर्षक बदल सकते हैं: select-pane -T "my title"यह करता है। तुम भी एक महत्वपूर्ण बंधन स्थापित कर सकते हैं ताकि आपको बस शीर्षक की आपूर्ति करने की आवश्यकता हो:bind-key T command-prompt -p "New title:" 'select-pane -T "%%"'
lucasem

3
@lucasem शायद मैंने इस धागे का पालन नहीं किया है, लेकिन यह उत्तर की तरह लगता है।
प्रतिष्ठित

@lucasem मैं 100% निश्चित नहीं हूं, लेकिन मेरा मानना ​​है कि आपका तरीका (जो कि इस पूरे धागे में IMO सबसे अच्छा और सरल है, tmux के हाल के संस्करणों के लिए) केवल तभी काम करता है जब pane-border-statusविकल्प कुछ ( topया bottom) पर सेट हो ।
cjauvin

11

एक जीआईएफ एक हजार शब्दों के लायक है। ( स्रोत )

tmux-xpanes एक tmux- आधारित टर्मिनल विभक्त है, जो नए जोड़े गए -tविकल्प के माध्यम से प्रत्येक फलक के लिए शीर्षक प्रदर्शित करने का समर्थन करता है।


1
एक जीआईएफ एक हजार शब्दों के लायक है, लेकिन अगर यह कभी लिंक लिंक करता है तो यह किसी के लायक नहीं है।
निधि मोनिका का मुकदमा

7

हाँ ऐसी आज्ञा है tmux:। अपने सत्र को एक नाम दें और इसे एक आंतरिक स्थिति पट्टी में प्रदर्शित किया जाएगा:

TMUX=0 tmux new-session -s my-new-session

2
हाँ, आपके उत्तर के लिए धन्यवाद! लेकिन इस प्रकार मुझे हर फलक में एक नया tmux सेशन शुरू करना होगा, जिसमें उसके नीचे एक शीर्षक हो - तरह का ओवरकिल, है ना?
एंड्री लुश्निकोव

मुझे नहीं पता। क्या यह? या तुमने कोशिश की? अतिरिक्त सत्र कितना अतिरिक्त मेमोरी का उपयोग कर रहा है?
Event_jr

हाँ, मैं आज तक नेस्टेड tmux सत्र का उपयोग कर रहा हूं। मैं स्मृति की खपत और इस तरह की चीजों के बारे में निश्चित नहीं हूं - मैं सिर्फ इस अवधारणा को नापसंद करता हूं 'क्योंकि यह शुद्ध नहीं है।
एंड्री लुश्निकोव

4

यह अल्पावधि में मददगार नहीं है, लेकिन tmux में प्रति-फलक शीर्षक के लिए एक सुविधा अनुरोध है: http://sourceforge.net/tracker/?func=detail&aid=3495916&group_id/200378&atid=973265#

इस बीच, जैसा कि दूसरों ने उल्लेख किया है, घोंसले के शिकार tuxux शालीनता से काम करता है।


0

टी एल; डॉ

अपनी tmux config फाइल में कॉन्फिगर निम्नलिखित को जोड़ें (मेरे मामले में ~/.tmux.conf.local)

# dispaly pane_current_path as the pane title
set -g pane-border-status top
set -g pane-border-format "#{pane_index} #{pane_current_path}"

फिर भागो:

tmux source-file ~/.tmux.con

इसका आनंद लें

आभार https://stackoverflow.com/a/37602055/5121972

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