21

Я хотел бы иметь читаемый цветной путь. Например, вместо простого использования% ~ для возврата ~/path/to/foo я хотел бы отформатировать его в ~$RED/$NOCOLORpath$RED/$NOCOLORto$RED/$NOCOLORfoo чтобы выделить разделители пути.

Могу ли я определить содержимое PROMPT, чтобы выражение пути переоценивалось на каждом дисплее? Что-то вроде ${${(%):-%~}//\//_some_format_expression/} очевидно, не работает.

Или я должен взломать это дальше и заставить сбросить значение PROMPT каждый раз, когда мы меняем каталог?

Любое решение, достигающее цели форматирования пути, будет приветствоваться.

Спасибо :)

4 ответа4

33

ЗШ

Попробуй это:

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 включает подстановку команд в приглашении (и расширение параметров и арифметическое расширение)
  • %{...%} - escape-последовательность
  • $(pwd|grep --color=always /) - распечатать текущий каталог и выделить / - цвет будет зависеть от переменной среды $ GREP_COLORS (или ее значения по умолчанию) - по умолчанию выделен полужирный красный
  • %${#PWD}G - использовать длину в символах имени текущего каталога в качестве значения сбоя. Это заставляет оболочку учитывать это длину предыдущей последовательности символов (после « %{ ») вместо фактической длины строки, которая включает escape-последовательности ANSI. Это предохраняет оболочку от путаницы относительно положения курсора относительно конца подсказки.
    - - - - - - - это конец части, которая отвечает на ваш вопрос - - - - - - -
  • %(!.%F{red}.%F{cyan}) - если это привилегированная оболочка (root), установите цвет переднего плана на красный, в противном случае - голубой
  • %n - вывести имя пользователя
  • %f - сбросить цвет переднего плана на значение по умолчанию
  • @ - буквальный знак
  • %F{yellow} - сделать цвет переднего плана желтым
  • %m - вывести имя хоста
  • %f - сбросить цвет переднего плана на значение по умолчанию
  • %(!.%F{red}.) - если это привилегированная оболочка (root), установите цвет переднего плана на красный
  • %# - вывести # для привилегированной оболочки или % для непривилегированной
  • %f - сбросить цвет переднего плана на значение по умолчанию

Я ставлю путь первым в этой подсказке для акцента, так как вопрос касается пути.

альтернативный текст

Вот версия для zsh, которая меняет цвет косой черты в зависимости от того, являетесь ли вы пользователем root (привилегированным), манипулируя переменной $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. Предупреждение: это перезаписывает переменную приглашения Bash $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\] "'

альтернативный текст

Я воспользовался тем, что в Bash нет функции "сбоя" в zsh, чтобы использовать подстановку расширения параметров для условного окрашивания слешей (вместо использования grep).

3

Чистое решение Zsh:

PROMPT='%n@%m: %{$PR_BOLD_RED%}${${(%):-%~}//\//${PR_BOLD_RED}/%f}%f '
  • ${(%):-%~} - текущий путь.
  • ${xxxxx//\//${PR_BOLD_RED}/%f} заменяет каждое / в xxxxx жирным красным цветом
  • и, конечно, PROMPT_SUBST должен быть включен.

Я использовал двойные кавычки в моих тестах, что не позволяет подстановку. Все отлично работает с одинарными кавычками.

3

После некоторого ухода я могу предоставить решение, переопределяющее 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 , вероятно, более чисто .
0

Вот моя попытка (на основе NicDumZ):

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, поскольку они кажутся мне более читабельными.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .