วิธีการจัดรูปแบบเส้นทางในพรอมต์ zsh?


23

ฉันชอบที่จะมีเส้นทางสีที่อ่านได้ ตัวอย่างเช่นแทนที่จะใช้% ~ เพื่อย้อนกลับ~/path/to/fooฉันต้องการจัดรูปแบบ~$RED/$NOCOLORpath$RED/$NOCOLORto$RED/$NOCOLORfooเพื่อเน้นตัวแยกเส้นทาง

ฉันสามารถกำหนดเนื้อหาของ PROMPT เพื่อให้นิพจน์เส้นทางได้รับการประเมินอีกครั้งในแต่ละจอแสดงผลได้หรือไม่ สิ่งที่${${(%):-%~}//\//_some_format_expression/}เห็นได้ชัดไม่ทำงาน

หรือฉันควรแฮ็คนี้ต่อไปและบังคับให้ค่า PROMPT ทำการรีเซ็ตทุกครั้งที่เราเปลี่ยนไดเรกทอรี

โซลูชันใด ๆ ที่บรรลุเป้าหมายการจัดรูปแบบเส้นทางจะได้รับการต้อนรับ

ขอบคุณ :)


ถ้าคุณยังคงมีอยู่คุณอาจต้องการที่จะทำเครื่องหมายเป็นคำตอบที่ดีที่สุดสำหรับการนี้ :)
แดน Rosenstark

คำตอบ:


36

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- ใช้ความยาวเป็นอักขระของชื่อของไดเรกทอรีปัจจุบันเป็นค่าความผิดพลาด สิ่งนี้ทำให้เชลล์พิจารณาความยาวของลำดับอักขระก่อนหน้า (หลัง " %{") แทนที่จะเป็นความยาวจริงของสตริงซึ่งรวมถึงลำดับการหลีกเลี่ยงของ ANSI สิ่งนี้ทำให้เชลล์ไม่สับสนเกี่ยวกับตำแหน่งของเคอร์เซอร์ที่สัมพันธ์กับจุดสิ้นสุดของพรอมต์
    - - - - - - - นี่คือจุดสิ้นสุดของส่วนที่ตอบคำถามของคุณ - - - - - - -
  • %(!.%F{red}.%F{cyan}) - ถ้านี่เป็นเปลือกพิเศษ (รูท) ให้ตั้งค่าสีพื้นหน้าเป็นสีแดงมิฉะนั้นจะเป็นสีฟ้า
  • %n - เอาท์พุทชื่อผู้ใช้
  • %f - รีเซ็ตสีพื้นหน้าเป็นค่าเริ่มต้น
  • @ - ตัวอักษรที่เครื่องหมาย
  • %F{yellow} - ทำสีพื้นหน้าเป็นสีเหลือง
  • %m - ส่งออกชื่อโฮสต์
  • %f - รีเซ็ตสีพื้นหน้าเป็นค่าเริ่มต้น
  • %(!.%F{red}.) - ถ้าเป็นเปลือกพิเศษ (รูท) ให้ตั้งค่าสีพื้นหน้าเป็นสีแดง
  • %#- เอาต์พุต a #สำหรับเชลล์ที่มีสิทธิใช้งานหรือ%สำหรับเชลล์ที่ไม่มีสิทธิใช้งาน
  • %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 '

ทุบตี

คุณสามารถทำพรอมต์ที่คล้ายกันใน Bash ในตัวอย่างนี้ฉันได้ใส่ชื่อผู้ใช้และชื่อโฮสต์และสีของเครื่องหมายทับจะเปลี่ยนไปเมื่อ UID เป็น 0 คำเตือน: สิ่งนี้จะเขียนทับ$PS1ตัวแปร prompt ของ Bash นั่นไม่ควรเป็นปัญหาเว้นแต่ว่าคุณกำลังทำอะไรเป็นพิเศษหรือคุณคาดหวังว่าพฤติกรรมจะเปลี่ยนไปเมื่อคุณตั้งค่าตัวแปรนั้นโดยตรงและสิ่งนี้จะมีผล นอกจากนี้ยังใช้ตัวแปรที่เรียกว่า " 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\] "'

ข้อความแสดงแทน

ฉันใช้ประโยชน์จากข้อเท็จจริงที่ว่า Bash ไม่มีคุณสมบัติ "ความผิดพลาด" ของ zsh ในการใช้การแทนที่การขยายพารามิเตอร์เพื่อให้สีสแลชมีเงื่อนไข (แทนที่จะใช้ grep)


เรียกฉันว่าโง่ แต่ส่วนที่ผิดเท่านั้นที่ฉันมีคือการใช้อัญประกาศแทนการอัญประกาศเดี่ยวในการกำหนด PROMPT ขอบคุณ :)
Nicolas Dumazet

@NicDumZ, ตลก, ผมใช้เวลาประมาณ 20 นาทีในการแก้ปัญหาอื่น ๆ ที่เมื่อวานนี้ :)
แดน Rosenstark

1
นี่มันช่างยอดเยี่ยม (geeky and) เท่ห์ ขอบคุณ ...
Dan Rosenstark

มีความคิดวิธีการทำเช่นนี้ใน Bash หรือทำไมมันไม่ทำงานใน Bash สำหรับฉันด้วย Bash มันจะติดอยู่ที่ไดเรกทอรีแรกฉันเริ่มต้นเทอร์มินัลของฉันและไม่อัปเดตเมื่อฉันย้ายไปรอบ ๆ ฉันเพิ่งเอา $ (pwd | grep --color = always /) และใส่มันใน PS1 ของฉันและมีพฤติกรรมที่แปลก แก้ไข: OH! ไม่เห็นส่วน Bash lol
อิบราฮิม

ที่จริงแล้วฉันกำลังพยายามใช้เคล็ดลับ PS1 ของคุณสำหรับ Bash ในการแจ้งที่ซับซ้อนมากขึ้นและมันไม่ทำงาน PWD ของฉันจะติดขัดอีกครั้ง แต่ตัวอย่างของคุณทำงานตามที่เป็นอยู่ PROMPT_COMMAND มีจุดประสงค์อะไร? นี่คือสิ่งที่ฉันมี: PS1="$(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\$ "สีที่กำหนดไว้ในgithub.com/ibrahima/dotfiles/blob/master/.bashrc.d/prompt.sh
Ibrahim

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_pathvar ชั่วคราวหรือไม่ ฉันไม่สามารถแทนที่ / ภายใน% ~ ... ได้โดยตรง
  • โซลูชันใด ๆ ที่ใช้ไวยากรณ์แบบไดนามิกเพื่อหลีกเลี่ยงการเรียกใช้การเปลี่ยนแปลงไดเรกทอรีแต่ละครั้งdopromptน่าจะสะอาดกว่า

4

โซลูชัน zsh บริสุทธิ์:

PROMPT='%n@%m: %{$PR_BOLD_RED%}${${(%):-%~}//\//${PR_BOLD_RED}/%f}%f '
  • ${(%):-%~} เป็นเส้นทางปัจจุบัน
  • ${xxxxx//\//${PR_BOLD_RED}/%f} แทนที่ทุก / in xxxxx ด้วยตัวหนาสีแดง
  • และแน่นอนว่า PROMPT_SUBST จะต้องเปิดใช้งาน

ฉันใช้เครื่องหมายคำพูดคู่ในการทดสอบซึ่งไม่อนุญาตให้ใช้การแทนที่ ทุกอย่างทำงานได้ดีด้วยคำพูดเดียว


คุณต้อง$PR_BOLD_REDกำหนดไว้ที่อื่น ฉันต้องใช้PROMPT='%n@%m: %{%B%F{red}%}${${(%):-%~}//\//%B%F{red\}/%b%f}%b%f 'รวมถึงการหลบหนีที่แปลกมากของการรั้งลอนปิด (เฉพาะ) หลังจาก "แดง" ครั้งที่สอง
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

ใช่ฉันใช้ namings ของ Aaron Toponce pthree.org/wp-content/uploads/2009/03/zsh_promptซึ่งฉันพบว่ามีประโยชน์ นอกจากนั้นฉันไม่จำเป็นต้องหลบหนีอะไรเลยมันทำงานได้ดี
Nicolas Dumazet

0

นี่คือความพยายามของฉัน (ตาม NicDumZ's):

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 เพราะมันอ่านได้ง่ายกว่าสำหรับฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.