настройка приглашений 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 голоса)

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

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

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

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