настройка приглашений zsh
Бывает так, что, работая бОльшую часть времени только с одной учётной записи и с одного хоста, осознаешь бессмысленность раздутого на пол-экрана терминала приглашения командной строки наподобие
myuseraccount@mycomputer:/path/to/some/folder $
Зная, что в zsh можно задействовать второе приглашение, справа и, умея пользоваться гуглом, проковырявшись с настройкой конфига, хотелось бы поделиться куском скрипта, который, скопировав в .zshrc, будет делать следующее:
1. в обычном состоянии - показывать в качестве приглашения лишь
[/path/to/current/folder] >
2. при работе за другого пользователя - показывать
[/path/to/current/folder] > [current_username]
3. при работе с другим хостом (например, про соединении по ssh) с учётной записи, которая совпадает с текущим именем пользователя - показывать
[/path/to/current/folder] > [@current_hostname]
4. при работе с другим хостом с другой учётной записи - показывать
[/path/to/current/folder] > [current_username@current_hostname]
5. при работе с машиной, на которой запущен ssh-сервер _и_ есть подсоединённые клиенты - показывать
[/path/to/current/folder/] [@current_hostname]
6. ну и независимо от всего этого, при работе суперюзером ">" будет меняться на классическое "#"
# ... if [[ $EUID == 0 ]]; then #если пользователь - root PS1='[ %~ ] # '; #выставить одно приглашение else PS1='[ %~ ] > '; #в противном случае - другое fi PROMPT=$PS1; function precmd { #функция precmd выполняется после каждой выполненной в терминале команды; #в данном случае, при наличии немалого числа действий в этой функции, #при работе с терминалом не на самой быстрой машине, #можно будет невооружённым глазом заметить #задержку появления приглашения командной строки name=''; host=''; other=''; RPROMPT=''; ssh=`ps ax | grep [s]sh | wc -l`; #проверяется, запущен ли ssh-сервер и есть ли процессы, #имеющие отношение к ssh, помимо самого сервера. if [[ $USERNAME != 'user' ]] && [[ $USERNAME != 'root' ]]; then #если текущее имя пользователя системы #не совпадает с пользователем, с аккаунта которого работаем name='%n'; other=true; fi if [[ $HOST != 'desktop' ]] || [[ $ssh -gt 1 ]]; then #если текущее имя хоста системы не совпадает с хостом, #с которого работаем или если к хосту, #с которого работаем, кто-то подсоединился по ssh host='@%m'; other=true; fi if [[ $other != '$NULL' ]]; then RPROMPT=[$name$host]; title='\e]0;$RPROMPT\a'; else title='\e]0;Terminal\a'; fi if [[ $TERM == 'xterm' ]]; then #если текущий терминал запущен из X-ов #(xterm/rxvt/konsole/gnome-terminal/и т.д.) print -Pn $title; #вывести информацию в заголовке терминала fi } #...
Примечание 0. Не стреляйте в пианиста, он играет, как умеет^W^W^W^W^W^W^Wругайте за качество и стилистику кода - состряпал на скорую руку :-)
Примечание 1. чтобы это всё работало, кусок скрипта (как и zsh-оболочка в качестве shell'а) должен быть у пользователя в конфигурационном файле как на стороне клиента, так и сервера; причём, опять же, чтобы всё это работало "красиво", в случае коннекта к ssh-серверу за другого пользователя, у этого пользователя также должна быть zsh оболочкой по умолчанию и должен быть кусок конфига.
Примечание 2. чтобы работала часть скрипта, отвечающего за >/# , в качестве оболочки для root-аккаунта должна быть также выбрана zsh и такой же кусок скрипта должен находиться в /root/.zshrc
Примечание 3. Если при использовании zsh в домашнем каталоге Вы для настройки каждой из фич используете отдельный конфигурационный файл, то можно поместить скрипт в .zsh_prompt, создав его, а в сам .zshrc, ближе к началу - строчку
. ~/.zsh_prompt
краткий список основных условных переменных zsh:
- %n - имя пользователя
- %m - имя хоста
- %~ - текущая директория
- %? - код завершения последней команды
- %h - номер строки в файле истории текущей команды
Данный совет - всего лишь пример того, как можно, имея общее представление о возможностях конфигурирования zsh, донастроить эту оболочку под себя и заставить отображать любую полезную информацию где угодно.
Happy zshacking :-)
- 4406 просмотров
Страница для печати


Здравствуйте!
Пытаюсь настроить zsh, так сказать, с нуля. Чтобы разобраться и сделать конфиг проще и понятней (например, в конфиге из GRML черт ногу сломит, а самого элементарного нет)...
Вот несколько мелких, но каверзных (в доках ответа нет) вопросов. Настраиваю приглашение.
Хочу, чтобы оно имело вид самый простой вид (без вычурности):
или
Получилось примерно следующее:
Возникают вопросы:
1. Как сделать так, чтобы символ приглашения (% или #) отображался на новой строке - в доках не нашел... может я что-то пропустил?
2. Заметил странную вещь, не то, чтобы "баг", просто странно выглядит. Правое приглашение отстает от края окна на один символ. Так задумано? Вроде как-то нелогично (работает не так, как изначально предполагаешь).
И еще, теперь по поводу вывода автодополнений.
Есть такая возможность - группировать автодополнение по типу (алиасы отдельно, встроенные комманды отдельно, внешние - отдельно)
Часто при этом на экране пишется что-то типа:
"Completing external command"
Я сделал так, что пишется "completing external commands:" (добавил множественное число и двоеточие - так правильнее стилистически и не режет слух)
Опять-таки, мелочь, но... Как сделать так, чтобы и множественное число alias - aliases писалось нормально? Сейчас пишет "aliass"...
Большое спасибо за помощь!
1. Просто
2. Да есть такое, только заметил Ж:-) Не скажу что бы меня этот отступ напрягал
3. Если есть такая увереность в своем английском, то исправления лучше слать в рассылку http://zsh.sourceforge.net/Arc/mlist.html
PS
С zsh идёт десяток стандартных тем для приглашений. Можно поигратся и выбрать или сделать на основе какой то свой
http://linsovet.com/zsh-alias-to-highlight-stderr#comment-4188
Использование условий доступно прямо в теле приглашения:
например проверка root`овости:
Отправить комментарий