तल पर शीघ्र के साथ XTerm कैसे शुरू करें?


12

XTerm को शुरू करते समय टर्मिनल की पहली लाइन पर प्रॉम्प्ट शुरू होता है। जब कमांड चलता है तो प्रॉम्प्ट तब तक नीचे चला जाता है जब तक कि यह नीचे तक नहीं पहुंचता है, और तब से यह वहां रहता है (नहीं भी Shift- Page Downया माउस इसे बदल सकता है)। इसके बजाय टर्मिनल के शुरू होने के बाद जीवनकाल "विशेष" होना चाहिए, संकेत हमेशा टर्मिनल के नीचे होना चाहिए। कृपया ध्यान दें कि मेरे पास एक बहु-पंक्ति संकेत है

बेशक, इसे अन्यथा पहले की तरह काम करना चाहिए (आउटपुट में रिज़ेज़ेबल, स्क्रॉल करने योग्य, कोई अनावश्यक न्यूलाइन्स नहीं, और कोई आउटपुट रहस्यमय तरीके से गायब नहीं होता है), इसलिए PROMPT_COMMAND='echo;echo;...'या इसी तरह का कोई विकल्प नहीं है। आदर्श रूप से समाधान शेल-विशिष्ट नहीं होना चाहिए।

संपादित करें: वर्तमान समाधान है, जबकि साधारण मामलों में काम कर रहे कुछ मुद्दों है:

  • यह बैश विशिष्ट है । एक आदर्श समाधान अन्य गोले के लिए पोर्टेबल होना चाहिए।
  • यदि अन्य प्रक्रियाएँ संशोधित होती हैं तोPS1 यह विफल हो जाती है । एक उदाहरण virtualenv है, जो (virtualenv)की शुरुआत में जोड़ता है PS1, जो फिर हमेशा गुना के ऊपर गायब हो जाता है।
  • Ctrl- lअब इतिहास के अंतिम पृष्ठ को हटा देता है।

क्या इन मुद्दों से बचने का एक तरीका है, XTerm को कम करना?


किसी तरह, हमें Xterm के स्क्रॉलबार बफर में रिक्त वर्णों को पेश करने की आवश्यकता है।
SHW

3
दरअसल, clearकमांड को निष्पादित करके किसी भी समय संकेत को आसानी से शीर्ष पर वापस ले जाया जा सकता है ।
वेडराइवर

@SHW मुझे उम्मीद थी कि हैक के बजाय इसके लिए एक सेटिंग थी। टर्मिनल हैक्स में मेरे अनुभव में बहुत सूक्ष्म कीड़े पेश करने की प्रवृत्ति है।
l0b0

@werediver लेकिन मैं कभी नहीं चाहता कि यह शीर्ष पर रहे।
l0b0

1
चूँकि केवल शेल ही जानता है कि यह कब संकेत करता है, कोई भी समाधान शेल के संदर्भ में होना चाहिए। यहां तक ​​कि XTerm को फोर्क करने से भी मदद नहीं मिलेगी क्योंकि XTerm को यह नहीं पता है कि इसे आउटपुट के लिए कहा जाता है या नहीं। टर्मिनल के लिए, शेल प्रॉम्प्ट सिर्फ एक और चरित्र अनुक्रम है, जो इसे प्राप्त होने वाले किसी भी अन्य चरित्र अनुक्रम से अलग नहीं हो सकता है।
celtschk

जवाबों:


11

यदि उपयोग कर रहे हैं bash, तो निम्न चाल चलनी चाहिए:

TOLASTLINE=$(tput cup "$LINES")
PS1="\[$TOLASTLINE\]$PS1"

या (कम कुशल क्योंकि यह tputप्रत्येक प्रॉम्प्ट से पहले एक कमांड चलाता है , लेकिन टर्मिनल विंडो के आकार बदलने के बाद काम करता है):

PS1='\[$(tput cup "$LINES")\]'$PS1

tputनिकास कोड को बदलने से रोकने के लिए, आप स्पष्ट रूप से इसे सहेज और रीसेट कर सकते हैं:

PS1='\[$(retval=$?;tput cup "$LINES";exit $retval)\]'$PS1

ध्यान दें कि चर retvalस्थानीय है; यह किसी भी retvalचर को प्रभावित नहीं करता है जो आपने शेल में अन्यथा परिभाषित किया हो।

चूंकि अधिकांश टर्मिनलों की cupक्षमता समान होती है \e[y;xH, आप इसे हार्डकोड भी कर सकते हैं:

PS1='\[\e[$LINES;1H\]'$PS1

यदि आप चाहते हैं कि यह PS1 के बाद के रीसेट के खिलाफ सुरक्षित हो, तो आप PROMPT_COMMANDचर का उपयोग भी कर सकते हैं । यदि सेट किया जाता है, तो प्रॉम्प्ट आउटपुट से पहले इसे कमांड के रूप में चलाया जाता है। तो प्रभाव द्वारा भी प्राप्त किया जा सकता है

PROMPT_COMMAND='(retval=$?;tput cup "$LINES";exit $retval)'

बेशक, रीसेट करते समय PS1यह प्रभावित नहीं करेगा, कुछ अन्य सॉफ़्टवेयर भी बदल सकते हैं PROMPT_COMMAND


कैसे tputकई से अलग echoआदेशों? (जिज्ञासा से पूछते हुए)
SHW

@ l0b0, शायद एक अलग उत्तर के लायक नहीं है। मुझे आशा है कि celtschk को बुरा नहीं लगेगा, मैंने उसका जवाब संपादित किया।
स्टीफन चेजलस

'\[$(tput cup "$LINES")\]' खूबसूरती से काम करता है । धन्यवाद!
l0b0

के साथ एक समस्या है tput: यह रीसेट करने के लिए लगता है $exit_code। का उपयोग करके निश्चित\[\e[$LINES;1H\]
l0b0

1
@ l0b0: मैंने अब एक वर्जन जोड़ा है tputजो एग्जिट कोड को संरक्षित करता है।
celtschk

4

पिछले उत्तर के लिए थोड़ा सा सरलीकरण के रूप में, मैंने इसे केवल चलाना आसान पाया:

tput cup $LINES

की शुरुआत में .bashrcया .zshrc। यह सिर्फ काम करता है।

पेशेवरों:

  • यह केवल एक बार प्रिंट करता है, जब आप अपना शेल शुरू करते हैं

विपक्ष:

  • ^ एल के साथ स्क्रीन को साफ करते समय, यह प्रिंट नहीं करता है और मदद clearकरने के लिए एलियासिंग clear; tput ...नहीं करता है;
  • जब टर्मिनल का आकार बदल दिया जाता है, तो प्रांतीय कहीं और चला जाता है

2

उपयोग $LINESकरने वाले उत्तर अनावश्यक रूप से गैर-पोर्टेबल हैं। जैसा कि किया गया है resize, आप बस xtermमनमाने ढंग से बड़ी लाइन संख्या में स्थिति सेट करने के लिए कह सकते हैं , जैसे,

tput cup 9999 0

(यह मानते हुए कि आपके पास 10 हज़ार लाइनों से छोटी एक विंडो है, स्क्रैचबैक की उपेक्षा )।

चूँकि स्ट्रिंग विंडो को आकार देने के साइड-इफ़ेक्ट के रूप में नहीं बदलेगी, आप इसे एक बार गणना कर सकते हैं, और अपने प्रॉम्प्ट-स्ट्रिंग में एक स्थिर, जैसे

TPUT_END=$(tput cup 9999 0)

और बादमें

PS1="${TPUT_END} myprompt: "

अपनी प्राथमिकताओं के अनुसार।

अन्य प्रक्रियाओं को संशोधित करने के लिए PS1: आपको PS1उन परिवर्तनों के बाद पुनर्मूल्यांकन करना होगा , ताकि यह सुनिश्चित हो सके कि यह वैसा ही है जैसा आप चाहते हैं। लेकिन प्रश्न में पर्याप्त विवरण नहीं है कि बदलाव कहां किया जाए।

और अंत में: बैश की मान्यताओं के कारण टैब-पूर्णता के लिए व्यवहार इस तरह के बदलाव से नहीं मिलता है।


"टैब-पूर्णता के लिए व्यवहार इस तरह के परिवर्तन के साथ क्या नहीं करता है" से आपका क्या मतलब है?
l0b0

मुझे लगता है कि आप मतलब है PS1="${TPUT_END} myprompt: ", या यहाँ तक किPS1="${TPUT_END}${PS1}"
l0b0

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