Zsh के सही प्रॉम्प्ट के अंत में बेकार जगह को हटाना ($ RPROMPT)


18

Zsh में, मेरे राइट प्रॉम्प्ट के दाईं ओर हमेशा एक स्पेस कैरेक्टर होता है। मैंने बहुत ही सरल तरीके से प्रयास किया ।zshrc जैसे:

PROMPT="#"
RPROMPT="*"

स्क्रीन के दाईं ओर * के बाद हमेशा एक स्थान होता है।

यहाँ एक स्क्रीनशॉट है जो समस्या दिखा रहा है (मैंने एक पंक्ति में स्थान का चयन किया है)। http://i.imgur.com/cnfa2eJ.png

धन्यवाद।

जवाबों:


20

टी एल; डॉ

आपको बस इसे अपने ~/.zshrc(या आपके त्वरित विषय के रूप में फ़ाइल में) रखना होगा :

ZLE_RPROMPT_INDENT=0

विवरण

ZSH के 5.0.2 तक के संस्करणों में ZSH के सी सोर्स कोड में एक वैल्यू कहा जाता है rprompt_off(जो राइट-मार्जिन ऑफसेट सेट करता है) को हार्ड-कोड किया गया था 1

लेकिन 5.0.5 रिलीज में डेवलपर्स ने ZLE_RPROMPT_INDENTपर्यावरण चर को सेट करके इस डिफ़ॉल्ट मान को ओवरराइड करने की क्षमता को जोड़ा ।

तर्क यह "मांगपत्र के लिए" क्योंकि कुछ पुराने टर्मिनल स्क्रॉल करता है, तो प्रदर्शन के अंतिम सेल उस में एक चरित्र था शुरू होता है।

5.0.5 से पहले ZSH के संस्करणों के लिए

यदि आप ZSH के पुराने संस्करण पर हैं और अपडेट नहीं कर सकते हैं, तो आप निम्नलिखित दोनों को करके भी उस स्थान से छुटकारा पा सकते हैं:

  1. ट्रिक ZSH सोच में है कि आपका RPROMPT एक ऐसा अक्षर है जो वास्तव में मानक अदृश्य अनुक्रम आवरण का उपयोग कर रहा है:%{...%}
  2. फिर टर्मो का उपयोग करके कर्सर-बैक एस्केप अनुक्रम भेजना: %{terminfo[cub1]}

अधिक जानकारी के लिए मेलिंग सूची में FAQ और इस संदेश को देखें।


5
यह भी इनपुट कर्सर को एक वर्ण को बाईं ओर रखता है जहां यह सामान्य रूप से होता है। इस प्रश्न में संकेतों का उपयोग करते हुए, उदाहरण के लिए, कर्सर को सही के बजाय तुरंत हैश मार्क पर रखा गया है। (मेरे लिए, ऑफ़सेट को शून्य से कम मान पर सेट करने से संकेत और कर्सर सही स्थानों पर दिखाई देते हैं। Zsh 5.0.8 और 5.2 के साथ अवलोकन किया गया।)
रोब कैनेडी

5.2 में मेरे लिए काम करता है।
एंथनी माइकल कुक

5
यह मेरे लिए 5.2 में काम करता है, लेकिन अब मेरे पास प्रॉम्प्ट के साथ समस्याएँ हैं: PROMPT में अंतिम चरित्र गायब हो गया है और चालू इनपुट के पहले चरित्र के साथ उस अंतिम वर्ण को भरता है। उदाहरण के लिए %git<Tab>रूपांतर%ggit
रोबोसलोन

आपको ZSH के नए संस्करणों के लिए ट्रिक्स का उपयोग करने की आवश्यकता नहीं है।
एंथनी माइकल कुक

5
ZLE_RPROMPT_INDENT = 0 सेट करने के बाद, मैंने बाईं ओर संकेत के साथ एक ही ड्राइंग गड़बड़ मुद्दों को देखा, जो कि ऊपर दिए गए कुछ विवरणों को बताता है। हालाँकि, लगभग सब कुछ अपेक्षा के अनुसार काम करता है यदि मैं 0 के बजाय -1 का उपयोग करता हूं, अर्थात ZLE_RPROMPT_INDENT = -1। मैंने उस टिप को github.com/bhilburn/powerlevel9k/issues/… पर देखा । लगभग, क्योंकि -1 के साथ यह macOS पर टर्मिनल विंडो की निचली रेखा का उपयोग नहीं करता है।
मार्क लियानैज

2

मैंने ज़ीश रखवाले को एक बग रिपोर्ट भेजी है, लेकिन ऐसा लगता है कि यह व्यवहार डिजाइन द्वारा है। हालाँकि इस मुद्दे ने मुझे इतना परेशान कर दिया कि मैंने खुद को अस्थायी फिक्स के रूप में zsh को पैच और संकलन करने का फैसला किया। यदि आप OS X पर हैं और Homebrew का उपयोग करते हैं (आपको चाहिए), तो आप दौड़ लगाकर मेरे पैच सहित zsh स्थापित कर सकते हैं:

brew install https://gist.github.com/padde/7963205/raw/eaedcc557859a40db87282fc39256fccd52d0aad/zsh.rb

आप की संभावना जोड़ना चाहते हैं जाएगा /usr/local/bin/zshकरने के लिए /etc/shellsऔर chsh -s /usr/local/bin/zshबाद में। अंत में, यहाँ कच्चा है जो किसी के लिए भी अलग है:

diff --git a/Src/Zle/zle_refresh.c b/Src/Zle/zle_refresh.c
index 17b78ce..f136178 100644
--- a/Src/Zle/zle_refresh.c
+++ b/Src/Zle/zle_refresh.c
@@ -1576,7 +1576,7 @@ zrefresh(void)
    else
        put_rpmpt = rprompth == 1 && rpromptbuf[0] &&
        !strchr(rpromptbuf, '\t') &&
-       (int)ZR_strlen(nbuf[0]) + rpromptw < winw - 1;
+       (int)ZR_strlen(nbuf[0]) + rpromptw < winw;
     } else {
 /* insert >.... on first line if there is more text before start of screen */
    ZR_memset(nbuf[0], zr_sp, lpromptw);
@@ -1631,9 +1631,9 @@ zrefresh(void)
    if (put_rpmpt && !iln && !oput_rpmpt) {
        int attrchange;

-       moveto(0, winw - 1 - rpromptw);
+       moveto(0, winw - rpromptw);
        zputs(rpromptbuf, shout);
-       vcs = winw - 1;
+       vcs = winw;
    /* reset character attributes to that set by the main prompt */
        txtchange = pmpt_attr;
        /*

PWS (zsh अनुचर) ने केवल एक विस्तारित पैच पोस्ट किया है , इसलिए RPROMPT इंडेंटेशन जल्द ही, आधिकारिक '' स्रोतों में होना चाहिए।
22

लिंक पोस्ट करने के लिए धन्यवाद। अगली रिलीज का इंतजार कर रहे हैं!
पैट्रिक ऑस्सिटी

1

मुझे लगता है कि दाईं ओर का सफेद स्थान हार्ड-कोडेड है। लेकिन आप zshनिम्न सेटिंग के साथ ट्रिक कर सकते हैं :

RPROMPT="%{*%}"

जो सिद्धांत रूप में बताता है zshकि तारा बिना किसी वर्ण के रहता है; से man zshmisc:

%{...%} शाब्दिक पलायन अनुक्रम के रूप में एक स्ट्रिंग शामिल करें। ब्रेसिज़ के भीतर स्ट्रिंग को कर्सर की स्थिति नहीं बदलनी चाहिए। (...)

दोष यह है, कि आप रिक्त को "अंत" में स्थानांतरित करते हैं PROMPT:

| PROMPT = "#" |
| RPROMPT = "% {*%}" |
| # ■ * |

|प्रतीकों टर्मिनल किनारों निरूपित, कर्सर ■।


एक और विचार COLUMNS1 से बढ़ाना होगा :

COLUMNS=$((COLUMNS + 1))

लेकिन किसी को केवल शीघ्र प्रतिपादन के लिए ऐसा करने के तरीके के बारे में सोचना होगा, लेकिन कमांड के लिए नहीं। और यह मल्टी-लाइन कमांड लाइन पर प्रत्येक लाइन पर अंतिम वर्ण को निगल जाएगा।


1
धन्यवाद। मैंने% {...%} चाल के साथ खेलने की कोशिश की, अपने समय और सही स्थिति को प्रदर्शित करने वाली स्थिति से निपटने के लिए। मुझे PROMPT पर अतिरिक्त स्थान से ऐतराज नहीं है क्योंकि मेरे पास आमतौर पर एक है। हालांकि, इस समाधान के साथ एक बड़ी खामी है: जब मैं TAB के साथ ऑटो-पूर्णता को सक्रिय करता हूं, तो अतिरिक्त स्थान हटा दिया जाता है और यह अजीब चीजें कर रहा है :)
Frozax
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.