настройка приглашений zsh


ia аватар

ia - Posted on 31 Октябрь 2008

Бывает так, что, работая бОльшую часть времени только с одной учётной записи и с одного хоста, осознаешь бессмысленность раздутого на пол-экрана терминала приглашения командной строки наподобие

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 :-)

5
Ваша оценка: Ничего Рейтинг: 5 (2 голоса)

Здравствуйте!

Пытаюсь настроить zsh, так сказать, с нуля. Чтобы разобраться и сделать конфиг проще и понятней (например, в конфиге из GRML черт ногу сломит, а самого элементарного нет)...

Вот несколько мелких, но каверзных (в доках ответа нет) вопросов. Настраиваю приглашение.

Хочу, чтобы оно имело вид самый простой вид (без вычурности):

[~/путь/к/каталогу/]                                                      [пользователь@хост]
%команда аргумент1 аргумент2

или

[~/путь/к/каталогу/]                                                      [root@хост]
#команда аргумент1 аргумент2

Получилось примерно следующее:

PS1="[ %~]%#"                            RPS1="[ %n@%m]"

Возникают вопросы:

1. Как сделать так, чтобы символ приглашения (% или #) отображался на новой строке - в доках не нашел... может я что-то пропустил?

2. Заметил странную вещь, не то, чтобы "баг", просто странно выглядит. Правое приглашение отстает от края окна на один символ. Так задумано? Вроде как-то нелогично (работает не так, как изначально предполагаешь).

И еще, теперь по поводу вывода автодополнений.

Есть такая возможность - группировать автодополнение по типу (алиасы отдельно, встроенные комманды отдельно, внешние - отдельно)

Часто при этом на экране пишется что-то типа:

"Completing external command"

Я сделал так, что пишется "completing external commands:" (добавил множественное число и двоеточие - так правильнее стилистически и не режет слух)

Опять-таки, мелочь, но... Как сделать так, чтобы и множественное число alias - aliases писалось нормально? Сейчас пишет "aliass"...

Большое спасибо за помощь!

1. Просто

PS1="[ %~]
%# "

2. Да есть такое, только заметил Ж:-) Не скажу что бы меня этот отступ напрягал

3. Если есть такая увереность в своем английском, то исправления лучше слать в рассылку http://zsh.sourceforge.net/Arc/mlist.html

PS
С zsh идёт десяток стандартных тем для приглашений. Можно поигратся и выбрать или сделать на основе какой то свой
http://linsovet.com/zsh-alias-to-highlight-stderr#comment-4188

Использование условий доступно прямо в теле приглашения:

%(x.true-text.false-text)

например проверка root`овости:

PROMPT = %(!.[ %~ ] # .[ %~ ] > )

Отправить комментарий

Google Friend Connect (leave a quick comment)
loading...
Содержание этого поля является приватным и не предназначено к показу.