як відформатувати шлях у запиті zsh?


23

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

Чи можу я визначити вміст PROMPT, щоб вираз шляху повторно оцінювався на кожному дисплеї? Щось подібне, ${${(%):-%~}//\//_some_format_expression/}очевидно, не працює.

Або мені слід зламати це далі і змусити значення PROMPT для скидання кожного разу, коли ми змінюємо каталог?

Будь-яке рішення для досягнення мети форматування шляху буде вітатися.

Спасибі :)


якщо ви все ще існуєте, можливо, ви захочете відзначити найкращу відповідь на це :)
Dan Rosenstark

Відповіді:


37

зш

Спробуйте це:

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 - скидання кольору переднього плану до типового

Я ставлю шлях першим у цьому підказці для наголосу, оскільки питання стосується шляху.

alt текст

Ось версія для 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. Попередження: це перезаписує $PS1змінну підказки 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\] "'

alt текст

Я скористався тим, що у Bash немає функції "glitch" zsh, щоб використовувати підстановку розширення параметрів, щоб умовно забарвити косої риски (замість використання grep).


назвіть мене дурним, але єдиною помилковою частиною в мене було використання подвійних лапок замість одинарних лапок у визначенні PROMPT. Дякую :)
Ніколас Думазет

@NicDumZ, смішно, я вчора витратив на цю проблему десь 20 хвилин :)
Ден Розенстарк,

1
це масово (прискіпливо і) класно. Дякую ...
Дан Розенстарк,

Будь-яка ідея, як це зробити в Bash, або чому це не працює в Bash? Для мене з Bash він просто застряє в першій папці, в якій запускаю свій термінал, і не оновлюється, коли я переїжджаю. Я щойно взяв $ (pwd | grep --color = завжди /) і поклав це у свій PS1 і отримав дивну поведінку. Редагувати: О! Не бачив розділ 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
Ібрагім

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} замінює кожен / у ххххх жирним червоним кольором
  • і звичайно, PROMPT_SUBST повинен бути включений.

У своїх тестах я використовував подвійні лапки, що не дозволяє замінити. Все працює добре з одинарними цитатами.


Ви, мабуть, $PR_BOLD_REDвизначились деінде. Мені доводиться використовувати в PROMPT='%n@%m: %{%B%F{red}%}${${(%):-%~}//\//%B%F{red\}/%b%f}%b%f 'тому числі дуже дивну втечу закриваючої фігурної дужки (тільки) після другого "червоного".
Призупинено до подальшого повідомлення.

так, я використовую назви Aaron Toponce pthree.org/wp-content/uploads/2009/03/zsh_prompt, які я вважаю корисними. Крім того, мені нічого не потрібно уникати, це працює як передбачено.
Nicolas Dumazet

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.