как отформатировать путь в подсказке zsh?

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

Я могу определить контент ПОДСКАЗКИ так, чтобы выражение пути было переоценено на каждом дисплее? Что-то как ${${(%):-%~}//\//_some_format_expression/} очевидно, не работает.

Или я должен взломать это далее и вынудить БЫСТРОЕ значение быть сброшенным каждый раз, когда мы изменяем каталог?

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

Спасибо :)

23
задан 30.09.2009, 19:26

4 ответа

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

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

alt text

Вот версия для 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

Можно сделать подобную подсказку в 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\] "'

alt text

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

36
ответ дан 07.12.2019, 09:49
  • 1
    называет меня глупым, но единственная неправильная первая часть имела, было использование двойных кавычек вместо одинарных кавычек в БЫСТРОМ определении. Спасибо :) – Nicolas Dumazet 30.10.2009, 11:05

После некоторого движения - вокруг, я могу обеспечить переопределение решения 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 var? Я не могу непосредственно заменить / в % ~...
  • Любое решение с помощью динамического синтаксиса, чтобы не обращаться к каждому изменению каталога doprompt вероятно, инструмент для очистки.
4
ответ дан 07.12.2019, 09:49

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

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

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

4
ответ дан 07.12.2019, 09:49
  • 1
    Вы должны иметь $PR_BOLD_RED определенный в другом месте. Я должен использовать PROMPT='%n@%m: %{%B%F{red}%}${${(%):-%~}//\//%B%F{red\}/%b%f}%b%f ' включая очень странный выход заключительной изогнутой фигурной скобки (только) после второго "красного". – Paused until further notice. 30.10.2009, 13:47
  • 2
    да, я использую обозначения Aaron Toponce pthree.org/wp-content/uploads/2009/03/zsh_prompt, который я нашел полезным. Помимо этого, я ни из чего не должен выходить, это работает как предусмотрено. – Nicolas Dumazet 01.11.2009, 14:44

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

0
ответ дан 07.12.2019, 09:49

Теги

Похожие вопросы