Làm thế nào để định dạng đường dẫn trong dấu nhắc zsh?


23

Tôi rất thích có một con đường màu có thể đọc được. Ví dụ, thay vì chỉ sử dụng% ~ để trả về, ~/path/to/footôi muốn định dạng nó ~$RED/$NOCOLORpath$RED/$NOCOLORto$RED/$NOCOLORfoođể làm nổi bật các dấu phân cách đường dẫn.

Tôi có thể xác định nội dung của PROMPT để biểu thức đường dẫn được đánh giá lại trên mỗi màn hình không? Một cái gì đó như ${${(%):-%~}//\//_some_format_expression/}rõ ràng không hoạt động.

Hoặc tôi nên hack điều này hơn nữa và buộc giá trị PROMPT được đặt lại mỗi lần chúng tôi thay đổi một thư mục?

Bất kỳ giải pháp đạt được mục tiêu định dạng đường dẫn sẽ được hoan nghênh.

Cảm ơn :)


nếu bạn vẫn tồn tại, bạn có thể muốn đánh dấu một câu trả lời hay nhất cho việc này :)
Dan Rosenstark

Câu trả lời:


36

zsh

Thử đi:

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

Đây là một sự cố của lời nhắc:

  • PROMPT_SUBST bật thay thế lệnh trong dấu nhắc (và mở rộng tham số và mở rộng số học)
  • %{...%} - một chuỗi thoát
  • $(pwd|grep --color=always /)- in thư mục hiện tại và tô sáng /- màu sẽ phụ thuộc vào biến môi trường $ GREP_COLORS (hoặc giá trị mặc định của nó) - màu đỏ đậm là mặc định
  • %${#PWD}G- sử dụng độ dài tính bằng tên của thư mục hiện tại làm giá trị trục trặc. Điều này làm cho shell xem đây là độ dài của chuỗi ký tự trước (sau " %{") thay vì độ dài thực tế của chuỗi bao gồm các chuỗi thoát ANSI. Điều này giữ cho vỏ không bị nhầm lẫn về vị trí của con trỏ so với cuối dấu nhắc.
    - - - - - - - đây là phần cuối của câu trả lời cho câu hỏi của bạn - - - - - - -
  • %(!.%F{red}.%F{cyan}) - nếu đây là một vỏ đặc quyền (gốc), đặt màu nền trước thành màu đỏ, nếu không thì màu lục lam
  • %n - xuất tên người dùng
  • %f - đặt lại màu nền trước về mặc định
  • @ - một chữ theo dấu
  • %F{yellow} - làm cho màu nền trước màu vàng
  • %m - xuất tên máy chủ
  • %f - đặt lại màu nền trước về mặc định
  • %(!.%F{red}.) - nếu đây là một vỏ đặc quyền (gốc), đặt màu nền trước thành màu đỏ
  • %#- xuất ra một #vỏ đặc quyền hoặc %cho một vỏ không có đặc quyền
  • %f - đặt lại màu nền trước về mặc định

Tôi đặt đường dẫn đầu tiên trong dấu nhắc này để nhấn mạnh, vì câu hỏi liên quan đến đường dẫn.

văn bản thay thế

Đây là phiên bản dành cho zsh thay đổi màu gạch chéo tùy thuộc vào việc bạn có root (đặc quyền) hay không bằng cách thao tác $GREP_COLORSbiến:

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

Bạn có thể làm một dấu nhắc tương tự trong Bash. Trong ví dụ này, tôi đã đặt tên người dùng và tên máy chủ lên trước và màu của dấu gạch chéo cũng thay đổi khi UID bằng 0. Cảnh báo: điều này ghi đè lên $PS1biến nhắc của Bash . Đó không phải là vấn đề trừ khi bạn đang làm điều gì đó đặc biệt hoặc bạn mong muốn hành vi thay đổi khi bạn đặt biến đó trực tiếp và điều này có hiệu lực. Ngoài ra, điều này sử dụng một biến gọi là " usercolor" có thể va chạm với một thứ khác, mặc dù toàn bộ điều này có thể được đặt trong một hàm và biến được khai báo cục bộ.

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\] "'

văn bản thay thế

Tôi đã lợi dụng thực tế là Bash không có tính năng "trục trặc" của zsh để sử dụng thay thế mở rộng tham số để tô màu một cách có điều kiện các dấu gạch chéo (thay vì sử dụng grep).


gọi tôi là ngu ngốc, nhưng phần sai duy nhất tôi có là việc sử dụng dấu ngoặc kép thay vì dấu ngoặc đơn trong định nghĩa PROMPT. Cảm ơn :)
Nicolas Dumazet

@NicDumZ, buồn cười, tôi đã dành khoảng 20 phút cho vấn đề đó vào ngày hôm qua :)
Dan Rosenstark

1
điều này là ồ ạt (geeky và) mát mẻ. Cảm ơn ...
Dan Rosenstark

Bất kỳ ý tưởng làm thế nào để làm điều này trong Bash, hoặc tại sao nó không hoạt động trong Bash? Đối với tôi với Bash, nó chỉ bị kẹt ở thư mục đầu tiên tôi khởi động thiết bị đầu cuối của mình và không cập nhật khi tôi di chuyển xung quanh. Tôi chỉ lấy $ (pwd | grep --color = always /) và đặt nó vào PS1 của tôi và nhận được hành vi lạ. Chỉnh sửa: OH! Không thấy phần Bash lol.
Ibrahim

Trên thực tế, tôi đang cố gắng sử dụng thủ thuật PS1 của bạn cho Bash theo lời nhắc phức tạp hơn của tôi và nó không hoạt động, PWD của tôi lại bị kẹt. Nhưng đoạn trích của bạn hoạt động như là. Mục đích của PROMPT_COMMAND là gì? Đây là những gì tôi đã có: 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\$ "màu sắc được xác định trong github.com/ibrahima/dotfiles/blob/master/.bashrc.d/prompt.sh
Ibrahim

4

Sau khi đi vòng quanh, tôi có thể cung cấp một giải pháp ghi đè 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";
}
  • Có cách nào để cải thiện mã này để thoát khỏi my_pathvar tạm thời không? Tôi không thể trực tiếp thay thế / bên trong% ~ ...
  • Bất kỳ giải pháp sử dụng cú pháp động để tránh gọi trên mỗi thay đổi thư mục dopromptcó thể sạch hơn.

4

Một giải pháp zsh thuần túy:

PROMPT='%n@%m: %{$PR_BOLD_RED%}${${(%):-%~}//\//${PR_BOLD_RED}/%f}%f '
  • ${(%):-%~} là con đường hiện tại.
  • ${xxxxx//\//${PR_BOLD_RED}/%f} thay thế mọi / trong xxxxx bằng một màu đỏ đậm
  • và tất nhiên phải có PROMPT_SUBST.

Tôi đã sử dụng dấu ngoặc kép trong các bài kiểm tra của mình, điều này không cho phép thay thế. Tất cả mọi thứ hoạt động tốt với dấu ngoặc đơn.


Bạn phải $PR_BOLD_REDxác định ở nơi khác. Tôi phải sử dụng PROMPT='%n@%m: %{%B%F{red}%}${${(%):-%~}//\//%B%F{red\}/%b%f}%b%f 'bao gồm cả lối thoát rất kỳ lạ của nẹp xoăn đóng (chỉ) sau lần "đỏ" thứ hai.
Tạm dừng cho đến khi có thông báo mới.

có, tôi sử dụng tên của Aaron Toponce pthree.org/wp-content/uploads/2009/03/zsh_prompt mà tôi thấy hữu ích. Ngoài ra, tôi không phải trốn tránh bất cứ điều gì, nó hoạt động như được cung cấp.
Nicolas Dumazet

0

Đây là nỗ lực của tôi (dựa trên 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
}

Sự khác biệt là tôi đang sử dụng đường dẫn màu, vì vậy tôi cần quay lại màu ban đầu của mình cho đường dẫn một khi dấu gạch chéo được tô màu. Trong trường hợp của tôi, đường dẫn thường có màu vàng và dấu gạch chéo có màu đỏ tươi, sau đó nó trở lại màu vàng. Tôi cũng thích sử dụng chuỗi% F% f vì chúng có vẻ dễ đọc hơn đối với tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.