कैसे एक zsh प्रॉम्प्ट में पथ स्वरूपित करने के लिए?


23

मैं एक पठनीय रंग का रास्ता पसंद करूंगा। उदाहरण के लिए, केवल% ~ का उपयोग करने के बजाय ~/path/to/fooमैं ~$RED/$NOCOLORpath$RED/$NOCOLORto$RED/$NOCOLORfooपथ विभाजकों को उजागर करने के लिए इसे प्रारूपित करना चाहूंगा ।

क्या मैं PROMPT की सामग्री को परिभाषित कर सकता हूं ताकि प्रत्येक प्रदर्शन पर पथ अभिव्यक्ति का पुनर्मूल्यांकन हो जाए? ${${(%):-%~}//\//_some_format_expression/}स्पष्ट रूप से कुछ काम नहीं करता है।

या क्या मुझे इसे आगे हैक करना चाहिए, और हर बार जब हम एक निर्देशिका बदल रहे हैं, तो रीसेट प्राप्त करने के लिए PROMPT मान को मजबूर करें?

पथ स्वरूपण लक्ष्य को प्राप्त करने वाले किसी भी समाधान का स्वागत किया जाएगा।

धन्यवाद :)


यदि आप अभी भी मौजूद हैं, तो आप इसके लिए एक सर्वोत्तम उत्तर देना चाह सकते हैं :)
डैन रोसेनस्टार्क

जवाबों:


37

zsh

इसे इस्तेमाल करे:

setopt PROMPT_SUBST
PROMPT='%{$(pwd|grep --color=always /)%${#PWD}G%} %(!.%F{red}.%F{cyan})%n%f@%F{yellow}%m%f%(!.%F{red}.)%#%f '

यहाँ शीघ्र का टूटना है:

  • PROMPT_SUBST प्रॉम्प्ट (और पैरामीटर विस्तार और अंकगणितीय विस्तार) में कमांड प्रतिस्थापन पर जाता है
  • %{...%} - एक भागने का क्रम
  • $(pwd|grep --color=always /)- वर्तमान निर्देशिका को प्रिंट करें और उजागर करें /- रंग $ GREP_COLORS पर्यावरण चर (या इसके डिफ़ॉल्ट मान) पर निर्भर करेगा - बोल्ड लाल डिफ़ॉल्ट है
  • %${#PWD}G- वर्तमान निर्देशिका के नाम के अक्षरों में लंबाई का उपयोग एक गड़बड़ मान के रूप में करें। यह शेल %{को स्ट्रिंग की वास्तविक लंबाई के बजाय पूर्ववर्ती वर्ण अनुक्रम (" " "के बाद ) की लंबाई पर विचार करता है जिसमें एएनएसआई एस्केप सीक्वेंस शामिल हैं। यह शेल को प्रांप्ट के अंत के सापेक्ष कर्सर की स्थिति के बारे में भ्रमित होने से बचाता है।
    - - - - - - - यह उस भाग का अंत है जो आपके प्रश्न का उत्तर देता है - - - - - - -
  • %(!.%F{red}.%F{cyan}) - अगर यह एक विशेषाधिकार प्राप्त खोल (रूट) है तो अग्रभूमि का रंग लाल हो सकता है, अन्यथा सियान
  • %n - उपयोगकर्ता नाम का उत्पादन
  • %f - अग्रभूमि रंग को डिफ़ॉल्ट पर रीसेट करें
  • @ - संकेत पर एक शाब्दिक
  • %F{yellow} - अग्रभूमि का रंग पीला करें
  • %m - मेजबाननाम आउटपुट
  • %f - अग्रभूमि रंग को डिफ़ॉल्ट पर रीसेट करें
  • %(!.%F{red}.) - अगर यह एक विशेषाधिकार प्राप्त शेल (रूट) है तो अग्रभूमि का रंग लाल करने के लिए सेट करें
  • %#- #एक विशेषाधिकार प्राप्त खोल के लिए या %एक अप्रकाशित के लिए आउटपुट
  • %f - अग्रभूमि रंग को डिफ़ॉल्ट पर रीसेट करें

मैंने जोर देने के लिए इस प्रॉम्प्ट में सबसे पहले रास्ता रखा, क्योंकि प्रश्न मार्ग की चिंता करता है।

वैकल्पिक शब्द

यहाँ zsh के लिए एक संस्करण है जो स्लैश रंग को बदलता है, जो इस बात पर निर्भर करता है कि क्या आप $GREP_COLORSवेरिएबल में हेरफेर करके रूट (विशेषाधिकार प्राप्त) हैं :

setopt PROMPT_SUBST
PROMPT='%{$(pwd|([[ $EUID == 0 ]] && GREP_COLORS="mt=01;31" grep --color=always /|| GREP_COLORS="mt=01;34" grep --color=always /))%${#PWD}G%} %(!.%F{red}.%F{cyan})%n%f@%F{yellow}%m%f%(!.%F{red}.)%#%f '

दे घुमा के

आप बैश में इसी तरह का संकेत दे सकते हैं। इस उदाहरण में, मैंने उपयोगकर्ता और होस्टनाम को पहले रखा है और स्लैश का रंग भी बदल जाता है जब UID 0. होता है। चेतावनी: यह बैश के $PS1शीघ्र चर को अधिलेखित करता है। जब तक आप कुछ विशेष नहीं कर रहे हैं तब तक यह समस्या नहीं होनी चाहिए या जब आप उस चर को सीधे सेट करते हैं तो व्यवहार में बदलाव की उम्मीद है और यह प्रभाव में है। इसके अलावा, यह " usercolor" नामक एक चर का उपयोग करता है, जो किसी और चीज से टकरा सकता है, हालांकि इस पूरी चीज को एक फ़ंक्शन में रखा जा सकता है और चर को स्थानीय घोषित किया जा सकता है।

PROMPT_COMMAND='usercolor="\[\033[0;36m\]";[[ $EUID == 0 ]] && usercolor="\[\033[1;31m\]";PS1="$(pwd)";PS1="$usercolor\u\[\033[0m\]@\[\033[0;33m\]\h\[\033[0m\]:${PS1//\//$usercolor/\[\033[0m\]}$usercolor\\$\[\033[0m\] "'

वैकल्पिक शब्द

मैंने इस तथ्य का फायदा उठाया कि बैश में सशर्त रूप से स्लैश (grep का उपयोग करने के बजाय) को रंगीन करने के लिए पैरामीटर विस्तार प्रतिस्थापन का उपयोग करने के लिए zsh की "गड़बड़" सुविधा नहीं है।


मुझे बेवकूफ कहें, लेकिन मेरे पास एक ही गलत हिस्सा था जो PROMPT परिभाषा में एकल उद्धरणों के बजाय दोहरे उद्धरण चिह्नों का उपयोग था। धन्यवाद :)
निकोलस डुमाज़ेट

@ न्यूडज़्म, मजाकिया, मैंने कल उस समस्या पर लगभग 20 मिनट बिताए कहीं :) :)
डैन रोसेनस्टार्क

1
यह बड़े पैमाने पर (geeky) और शांत है। धन्यवाद ...
डैन रोसेनस्टार्क

किसी भी विचार कैसे बैश में यह करने के लिए, या यह बाश में काम क्यों नहीं करता है? मेरे लिए बैश के साथ यह सिर्फ पहली निर्देशिका में अटक जाता है जब मैं अपना टर्मिनल शुरू करता हूं, और जब मैं घूमता हूं तो अपडेट नहीं करता। मैंने सिर्फ $ (pwd | grep --color = always /) लिया और अपने PS1 में डाल दिया और अजीब व्यवहार किया। संपादित करें: ओह! बैश अनुभाग योग्य नहीं देखा।
इब्राहिम

वास्तव में, मैं अपने अधिक जटिल प्रॉम्प्ट में बैश के लिए आपके PS1 ट्रिक का उपयोग करने की कोशिश कर रहा हूं और यह काम नहीं कर रहा है, मेरा PWD फिर से फंस गया है। लेकिन आपका स्निपेट जैसा है वैसा ही काम करता है। PROMPT_COMMAND का उद्देश्य क्या है? यह वही है जो मैंने प्राप्त किया है: github.com/ibrahima/dotfiles/blob/master/.bashrc.d/prompt.shPS1="$(pwd)"; PS1="${debian_chroot:+($debian_chroot)}\[$bldgrn\]\u@$(fgcolor $hostnamecolor)\h$(resetcolor)\[$txtrst\]:\[$bldblu\]${PS1//\//$txtred/$bldblu}\[\e[00m\]$bldred\$(parse_git_branch)\[$txtrst\] \[$undcyn\]\T \d\[$txtrst\] 95\$ " में परिभाषित रंग
इब्राहिम

4

कुछ जाने के बाद, मैं एक समाधान प्रदान कर सकता हूं chpwd:

doprompt() {
  local my_path=${(%):-%~}
  PROMPT="${yourstuff}${my_path//\//${PR_BOLD_RED}/${reset_color}}${otherstuff}"
}
doprompt

chpwd() {
  doprompt
  # unrelated: set window title
  [[ -t 1 ]] || return;
  print -Pn "\e]2;%n@%m: %~\a";
}
  • क्या अस्थायी कोड से छुटकारा पाने के लिए इस कोड को बेहतर बनाने का कोई तरीका है my_path? मैं सीधे /% ~ के अंदर की जगह नहीं ले सकता ...
  • डायनामिक सिंटैक्स का उपयोग करके प्रत्येक निर्देशिका परिवर्तन पर कॉल करने से बचने का कोई भी उपाय dopromptशायद क्लीनर है।

4

एक शुद्ध zsh समाधान:

PROMPT='%n@%m: %{$PR_BOLD_RED%}${${(%):-%~}//\//${PR_BOLD_RED}/%f}%f '
  • ${(%):-%~} वर्तमान मार्ग है।
  • ${xxxxx//\//${PR_BOLD_RED}/%f} एक बोल्ड लाल रंग के द्वारा xxxxx में हर / को प्रतिस्थापित करता है
  • और निश्चित रूप से PROMPT_SUBST चालू होना चाहिए।

मैं अपने परीक्षणों में दोहरे उद्धरण चिह्नों का उपयोग कर रहा था, जो प्रतिस्थापन की अनुमति नहीं देता है। सिंगल कोट्स के साथ सब कुछ ठीक रहता है।


आपने $PR_BOLD_REDकहीं और परिभाषित किया होगा । मुझे दूसरी "लाल" के बाद समापन घुंघराले ब्रेस (केवल) PROMPT='%n@%m: %{%B%F{red}%}${${(%):-%~}//\//%B%F{red\}/%b%f}%b%f 'के बहुत अजीब भागने सहित उपयोग करना होगा ।
अगली सूचना तक रोक दिया गया।

हाँ, मैं हारून टोपोन्स की प्रार्थना pthree.org/wp-content/uploads/2009/03/zsh_prompt का उपयोग करता हूं जो मुझे उपयोगी लगा। इसके अलावा, मुझे कुछ भी बचने की जरूरत नहीं है, यह काम करता है।
निकोलस डुमाज़ेट

0

यहाँ मेरा प्रयास है (निकुमज़ के आधार पर):

setopt PROMPT_SUBST
# red, green, yellow, blue, magenta, cyan, white, black
# B (bold), K(background color), F(foreground color)

function doprompt {
# this is just the directory (%d could be %~ -- I prefer full path always)
PROMPT='%F{yellow}${${(%):-%d}//\//%F{magenta\}%B/%b%F{yellow\}}%f'
}

function chpwd() {
    doprompt
}

अंतर यह है कि मैं रंगीन पथ का उपयोग कर रहा हूं, इसलिए मुझे स्लैश के रंग में रंग जाने के बाद पथ के लिए अपने मूल रंग में वापस लौटना होगा। मेरे मामले में पथ सामान्य रूप से पीला है, और स्लैश मैजेंटा के साथ रंगीन हो जाता है, फिर यह पीले रंग में लौटता है। मैं भी% F% f अनुक्रमों का उपयोग करना पसंद करता हूं क्योंकि वे मेरे लिए बहुत अधिक पठनीय दिखाई देते हैं।

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