GNU स्क्रीन पर बल शीर्षक


9

डिफ़ॉल्ट रूप से, एक स्क्रीन सत्र का शीर्षक दर्ज अंतिम कमांड का नाम है, जो मेरे लिए ठीक है, लेकिन कुछ मामलों में मैं इसे बदलना चाहूंगा। मैं कमांड जानता हूं Ctrl- A Aलेकिन यह केवल अगले कमांड तक शीर्षक बदल देता है, और मैं चाहूंगा कि जब तक मैं तय न कर लूं, तब तक वह वहां बने रहें।

संपादित करें: यहाँ preexecमैं अपने में पाया समारोह है.zshrc

if [[ "$TERM" == "screen" ]]; then
   local CMD=${1[(wr)^(*=*|sudo|-*)]}
   echo -n "\ek$CMD\e\\"
fi

जवाबों:


9

निर्भर करता है कि चीजें कैसे सेट की जाती हैं, लेकिन डिफ़ॉल्ट रूप से, इस तरह से कुछ काम करना चाहिए।

settitle() {
    printf "\033k$1\033\\"
}

फिर भागो:

settitle NEWTITLE

देखें स्क्रीन शीर्षक डॉक्स और जीएनयू स्क्रीन पूछे जाने वाले प्रश्न अधिक जानकारी के लिए।

दिया Ctrl+ A Aकेवल अगले आदेश तक इसे बदल रहा है, यह संभवतः $PS1(सभी गोले), या $PROMPT_COMMAND/ DEBUG trap(केवल बैश) या precmd/ preexec(केवल zsh) द्वारा निर्धारित किया जा रहा है ।

आपको किसी भी जगह की तलाश करनी चाहिए जो \eउसके \033साथ kया \\उसके बाद दिखाई देती है, मूल रूप से settitleऊपर मेरे उदाहरण की तरह ।

अपडेट करें

आपने कहा कि आपके पास एक प्रथा थी preexec

इसे इसे क्यों न बदलें:

if [[ "$TERM" == "screen" ]]; then
   local CMD=${1[(wr)^(*=*|sudo|-*)]}
   echo -n "\ek${TITLE:-$CMD}\e\\"
fi

तब आप चलाकर एक कस्टम शीर्षक सेट कर सकते हैं:

TITLE="my title"

और दौड़कर शीर्षक को अनसेट करें

TITLE=

बदलने के लिए मत भूलना precmdऔर $PS1यदि आवश्यक हो तो भी।

एएसआईडीई

तुम भी सभी टर्मिनलों (जैसे को यह विस्तार कर सकता है xterm, gnome-terminalकठिन कोडिंग नहीं द्वारा, आदि) \ekऔर \e\\

यह मेरा इसे करने का तरीका है:

terminit()
{
    # determine the window title escape sequences
    case "$TERM" in
    aixterm|dtterm|putty|rxvt|xterm*)
        titlestart='\033]0;'
        titlefinish='\007'
        ;;
    cygwin)
        titlestart='\033];'
        titlefinish='\007'
        ;;
    konsole)
        titlestart='\033]30;'
        titlefinish='\007'
        ;;
    screen*)
        # status line
        #titlestart='\033_'
        #titlefinish='\033\'
        # window title
        titlestart='\033k'
        titlefinish='\033\'
        ;;
    *)
        if type tput >/dev/null 2>&1
        then
            if tput longname >/dev/null 2>&1
            then
                titlestart="$(tput tsl)"
                titlefinish="$(tput fsl)"
            fi
        else
            titlestart=''
            titlefinish=''
        fi
        ;;
    esac
}


# or put it inside a case $- in *i* guard
if test -t 0; then
    terminit
fi

# set the xterm/screen/etc. title
settitle()
{
    test -z "${titlestart}" && return 0

    printf "${titlestart}$*${titlefinish}"
}

तो आप अपने preexecको बदल सकते हैं :

if [[ "$TERM" == "screen" ]]; then
   local CMD=${1[(wr)^(*=*|sudo|-*)]}
   settitle "${TITLE:-$CMD}"
fi

आप जो कमांड देते हैं, वह ठीक वैसा ही काम करता है Ctrl-A A। और प्रॉम्प्ट के बारे में, आपका मतलब है कि मुझे संशोधित $PS1करना है जब भी मैं चाहता हूं कि शीर्षक नहीं बदलना चाहिए?
gregseth

मेरा मतलब है कि यह जांच ईएससी कुछ ईएससी शामिल नहीं है। Ditto PROMPT_COMMAND
मिकेल

ईएससी लिखा जा सकता है \eया \033
मिकेल

स्क्रीन शीर्षक डॉक्स लिंक में आवश्यक जानकारी होनी चाहिए
मिकेल

5

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

यदि कमांड चल रहा है, तो विंडो शीर्षक के रूप में प्रकट होता है, यह preexecफ़ंक्शन (zsh में), या बैश के तहत एक अनुकरण द्वारा किया जाता है ।

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

की तरह एक एस्केप अनुक्रम के लिए देखो \e]0;new title\a, \e]2;new title\aया \eknew title\e\\अपने खोल आरंभीकरण फ़ाइल में ( ~/.bashrc, ~/.zshrc, ...)। अगर वहाँ कुछ भी नहीं प्रासंगिक, सेटिंग सिस्टम फ़ाइल में हो सकता है (उदाहरण के लिए /etc/bash.bashrc, /etc/zsh/zshrc); फिर उस पैरामीटर या फ़ंक्शन को अपने स्वयं के आरंभीकरण फ़ाइल में अधिलेखित करें।

मिकेल का जवाब एक शीर्षक शीर्षक के लिए देखें preexec


धन्यवाद, आपने इसे बहुत स्पष्ट कर दिया है। मुझे वास्तव preexecमें मेरे .zshrc में परिभाषित एक फ़ंक्शन मिला है । बात यह है, कि मैं जो व्यवहार चाहता हूं ... ज्यादातर समय। मैं इसे एक विशिष्ट स्क्रीन पर फ्लाई पर अक्षम करना चाहूंगा। शायद एक चर है जिसे मैं preexecफ़ंक्शन में प्राप्त कर सकता हूं जब मैं मैन्युअल रूप से शीर्षक सेट करता हूं, या ऐसा कुछ?
gregseth

@gregseth: सामान्य रूप से समझाना थोड़ा कठिन है, लेकिन यदि आप अपने preexecकार्य को पोस्ट करते हैं, तो मैं या कोई और शायद एक साधारण बदलाव का सुझाव दे सकता है।
गिलेस एसओ- बुराई को रोकना '

मैं उल्लेख करने जा रहा था preexec, लेकिन ग्रेग ने कहा कि वह उपयोग नहीं कर रहा था zsh। वह मुझे सिखा देंगे। ;-)
मिकेल

@ मिकेल: मेरी व्याख्या आपसे बेहतर थी, लेकिन आपका नया preexecडिजाइन मेरे से बेहतर है।
गिल्स एसओ- बुराई को रोकें '

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