Статистика
Сегодня: Онлайн:
Опрос

Помог ли наш сайт решить Вашу проблему?

View Results

Загрузка ... Загрузка ...

Друзья и коллеги

Технология жизни - технология будущего

#Записки сисадмина

Denis Tulyakov

PostHeaderIcon Zsh: настройка

Пользуюсь и радуюсь. Спасибо товарищу, который мне посоветовал ознакомиться с этим шеллом :) Приходилось иметь дело с разными оболочками, настроить под себя можно любую, насколько она позволяет. Но ни в одной нет такого шикарного автодополнения, как в zsh. Уже «из коробки» работает дополнение команд и директорий, опций огромного количества программ и всё это представляется в виде меню. К тому же, всё это достаточно гибко настраивается. Правда, присутствует в zsh и один непрятный момент — в xterm криво работающие клавиши «Home», «End» и тд. Но это всё решаемо.

Установка.

1
cd /usr/ports/shells/zsh && make install clean

Меняем пользователю шелл

1
2
3
4
5
6
7
8
[lycane]: chpass
Changing user information for lycane.
Shell: /usr/local/bin/zsh
Full Name: Lycane
Office Location:
Office Phone:
Home Phone:
Other information:

Настройка.
Создаем файл конфигурации .zshrc в домашней директории пользователя. Ну и в качестве примера выложу свой конфиг.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#Файл истории
HISTFILE=~/.histfile
#Число команд, сохраняемых в файл истории
HISTSIZE=1000
#Число команд, сохраняемых в сеансе
SAVEHIST=1000
#Дописывание файла истории
setopt  APPEND_HISTORY
#Игнорировать повторения команд
setopt  HIST_IGNORE_ALL_DUPS
#Игнорировать лишние пробелы
setopt  HIST_IGNORE_SPACE
#Удалять пустые строки
setopt  HIST_REDUCE_BLANKS
#Не пищим при дополнении и ошибках
setopt NO_BEEP
#Перейти в директорию, если набрали путь без команды cd
setopt AUTO_CD
#Исправлять неверно набраные команды
setopt CORRECT_ALL
#Вопрос на автокоррекцию
SPROMPT='zsh: Исправить '\''%R'\'' на '\''%r'\'' ? [Yes/No/Abort/Edit] '

Чтобы видеть все процессы для kill или killall. При нажатии Tab автоматически добавится имя процесса

1
2
3
zstyle ':completion:*:processes' command 'ps -xuf'
zstyle ':completion:*:processes' sort false
zstyle ':completion:*:processes-names' command 'ps xho command'

Установка-снятие некоторых опций шелла

1
2
3
4
5
setopt   notify globdots correct pushdtohome cdablevars autolist
setopt   correctall autocd recexact longlistjobs
setopt   autoresume histignoredups pushdsilent noclobber
setopt   autopushd pushdminus extendedglob rcquotes mailwarning
unsetopt bgnice autoparamslash

Можно отключить функцию различения регистров

1
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'

Полезная опция установки лимитов на использование системных ресурсов.

1
2
3
limit stack 8192 # лимит объёма памяти, выделеной под стек, дабы не переполнялся
limit core 0  # Выключаем запись дампов упавших в корку программ
umask 022   # Установка атрибутов доступа создаваемых файлов

Настройка приглашения командной строки.
Основные переменные, которые можно использовать:
%{\e[1;31m%} — цветовой блок; код цвета, в данном случае красный;
%M — полное имя хоста машины;
%m — имя хоста без домена;
%n — имя пользователя;
%~ — текущая директория;
%T — текущее время в 24-часовом формате.
Стоит обратить внимание, что у zsh есть опция установки приглашения с правой стороны, в которой, к примеру, можно выставить текущее время

1
RPROMPT=$'%{\e[1;31m%}[%{\e[1;37m%}%T%{\e[1;31m%}]%{\e[0m%}'

У меня это всё выглядит так, без лишних заморочек

1
2
3
autoload promptinit
promptinit
PROMPT=$'%{\e[1;31m%}[%{\e[1;37m%}%m%{\e[1;31m%}]:%{\e[0m%} '

Подгружаем модули, обеспечивающие расширеные возможности автодополнения

1
2
3
4
5
6
autoload -Uz compinit
compinit
zmodload -a zsh/stat stat
zmodload -a zsh/zpty zpty
zmodload -a zsh/zprof zprof
zmodload -ap zsh/mapfile mapfile

Выбор браузера по умолчанию при открытии веб-страниц

1
2
autoload -U pick-web-browser
alias -s {html,htm,mht}=pick-web-browser

Алиасы. Ну, тут уж есть, где разгуляться душе и упростить работу в консоли. Включайте свой полет фантазии и добавляйте необходимые вам алиасы. Например

1
2
3
4
5
6
7
alias ls='ls -FG'  # цветной ls
alias -g GP='ping ya.ru'    #проверка соединения с интернетом
alias -g MF='sudo mount_msdosfs  -L ru_RU.KOI8-R /dev/da1s1 /mnt/flash0' #смонтировали
alias -g UF='sudo umount /mnt/flash0' #размонтировали
alias grep='grep --color=auto' #цветной grep
alias h='history' #вывод истории введенных команд
alias -s {odt,doc,sxw,rtf}=openoffice.org #устанавливаем чем открывать заданные расширения

Установка нормального поведения клавиш Delete, Home, End и т.д. Запустится программка, которая попросит Вас поочередно нажимать клавиши, которые она будет запоминать. После появится каталог ~/.zkbd, в котором должен появится файлик xterm. Должен, но появится там файлик с несколько другим именем, поэтому ручками его переименовываем в xterm.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
autoload zkbd
[[ ! -d ~/.zkbd ]] && mkdir ~/.zkbd
[[ ! -f ~/.zkbd/$TERM ]] && zkbd
source ~/.zkbd/$TERM

[[ -n ${key[Backspace]} ]] && bindkey "${key[Backspace]}" backward-delete-char
[[ -n ${key[Insert]} ]] && bindkey "${key[Insert]}" overwrite-mode
[[ -n ${key[Home]} ]] && bindkey "${key[Home]}" beginning-of-line
[[ -n ${key[PageUp]} ]] && bindkey "${key[PageUp]}" up-line-or-history
[[ -n ${key[Delete]} ]] && bindkey "${key[Delete]}" delete-char
[[ -n ${key[End]} ]] && bindkey "${key[End]}" end-of-line
[[ -n ${key[PageDown]} ]] && bindkey "${key[PageDown]}" down-line-or-history
[[ -n ${key[Up]} ]] && bindkey "${key[Up]}" up-line-or-search
[[ -n ${key[Left]} ]] && bindkey "${key[Left]}" backward-char
[[ -n ${key[Down]} ]] && bindkey "${key[Down]}" down-line-or-search
[[ -n ${key[Right]} ]] && bindkey "${key[Right]}" forward-char

SSH — автозаполнение хостов, юзеров. Пробелов между %% быть не должно.

1
2
3
hosts=(${${${(f)"$(<$HOME/.ssh/known_hosts)"}%%\ *}%%,*})
zstyle ':completion:*:hosts' hosts $hosts
zstyle ':completion:*:(ssh|scp):*' tag-order '! users'

Отображение в заголовке окна терминала информации о номере консоли, пути и выполняемой команде

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
precmd()
{
[[ -t 1 ]] || return
case $TERM in
*xterm*|rxvt|(dt|k|E)term*) print -Pn "\e]2;[%~] :: %l\a"
;;
esac
}
preexec() {
[[ -t 1 ]] || return
case $TERM in
*xterm*|rxvt|(dt|k|E)term*) print -Pn "\e]2;<$1> [%~] :: %l\a"
;;
esac
}

Ну, для начала этого достаточно. Если появилось желание узнать больше о возможностях zsh, то читаем официальную документацию (офф.сайт zsh), маны (zsh, zshbuiltins, zshcompctl, zshcompwid, zshexpn, zshmodules, zshparam, zshtcpsys, zshzle, zshall, zshcalsys, zshcompsys, zshcontrib, zshmisc, zshoptions, zshroadmap, zshzftpsys) и экспериментируем :)

2 комментария на “Zsh: настройка”

  • lizz says:

    На самом деле не криво, вместо них ctrl+a, ctrl+e. Дело привычки… я привык =). Хотя в линуксах и home с end’ом работают привычно.

  • lycane says:

    ctrl+a, ctrl+e — это из другой оперы :) ими я тоже полЬзуюсЬ, бывает. А то, что у тебя по человечески работают эти клавиши — тебе, наверное, просто повезло :) ибо многочисленные источники, которые пришлосЬ перечитатЬ по теме, гласят, что нифика не работает как надо :) и предлагают вышеизложенный метод настройки этихЪ клавиш как один из вариантов :)

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

PR-CY.ru