Ну, во первых, обо всем по порядку. Для того чтобы воспользоваться возможностями zsh в Mac OS X ничего дополнительно устанавливать не прийдется. Эта оболочка присутствует как в десктопной, так и в серверной версии дистрибутива. Активировать ее можно несколькими путями. Либо в настройках Terminal на первой вкладке в Command (complete path) вписать /bin/zsh, либо глобально. Если окончательно решили перейти на него, то лучше воспользоваться вторым способом. Для этого идем в System Preference, Accounts, жмем на иконку замка и вводим пароль пользователя. Затем нажать правой кнопкой мыши по имени пользователя, появится меню Advanced Options. Заходим туда и в графе Login shell меняем значение /bin/bash на /bin/zsh. Для применение изменений система рекомендует перезагрузиться, но фактически достаточно перелогиниться. Сразу после включения вы не увидите никаких новых фишек. Ну, разве что новую систему автодополнения, о который еще поговорим позже. Для того чтобы вкусить все прелести zsh нужно его настроить. Создаем в корне пользовательской директории несколько файлов:
touch ~/.zshrctouch ~/.zsh_historymkdir .zsh && touch ~/.zsh/cache
Основной конфигурационный файл будет находится в файле ~/.zsh. Его и будем редактировать. Конфиг у меня простой, но не маленький. Поэтому, постараюсь его комментировать поэтапно, а в конце поста дам ссылку на полный файл. Первое что я настроил это строка приглашения. Вариаций по ее настройке огромное множество. Хочу сразу предупредить что гибкость этого шелла безумно высока, поэтому я буду говорить о вещах только в рамках своего конфига. Просто остальное читайте в документации. Строк приглашения может несколько. Расположить ее/их можно практически в любом месте. Я предпочитаю отдать дать уважения классике и не извращаться.
PROMPT='%B%F{green}%n@%m%f:%F{blue}%~%f%b%(!.#.$) '
Единственное что я сделал это разукрасил ее в зеленый и синий цвета. Так удобней проследить где начало и конец между выводом какой-либо из команд. Список и описания вышепреведенных значений можно прочитать, например тут — Setting the promt.
Теперь настроим автодополнение. Возможности этой функции еще богаче. По умолчанию предлагается дополнение команд похожее на bash, но только выбор следующего каталога или файла показывается интерактивно.
autoload -U compinit compinit zmodload zsh/complist zstyle ':completion:*' menu yes select
Включаем меню выбора для навигации по дополнениям курсорами или табом. Теперь это больше похоже не на шелл, а на полноценный файловый менеджер.
export CLICOLOR=1 export LSCOLORS=exfxcxdxbxegedabagacad exportexport LS_COLORS='di=34;40:ln=35;40:so=32;40:pi=33;40:ex=31;40:bd=34;46:cd=34;43:su=0;41:sg=0;46:tw=0;42:ow=0;43:'zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}
Включаем цвета в Terminal и задаем раскраску папок и файлов. В данном случае я использую две переменные — LSCOLORS и LS_COLORS. Первая это BSD стиль и она применима на Mac OS и BSD-like системах. Вторая будет работать в GNU/Linux. Таким образом наш конфиг получается универсальным. Если хотите поменять цвета можно воспользоваться специальным веб сервисом — LSCOLORS Generator.
zstyle ':completion:*' use-cache on zstyle ':completion:*' cache-path ~/.zsh/cachesetopt AUTO_CD BSD_ECHO
Включаем использование кэша и решаем проблемы вывода команды echo на Mac OS и иных BSD системах. Также активируем невероятно полезную опцию Autocd. Продемонстрирую то как она работает на примере. С обычной командой cd нам надо набрать имя каталога или его первые буквы, затем жать Tab, потом набрать следующий каталог и так далее, пока не прийдем к конечному. В zsh можно поступить проще. Для того чтобы перейти, например, в директорию /var/www/nginx/snupt.com можно набрать cd /v/w/n/s и нажать Tab. Все остальное сделает zsh. Это очень удобно и очень быстро. Попробуйте один раз и уже трудно будет отказаться.
if [ -e $HOME/.ssh/known_hosts ] ; then hosts=(${${${(f)"$(<$HOME/.ssh/known_hosts)"}%%\ *}%%,*})zstyle ':completion:*:hosts' hosts $hosts fi
Автодополнение SSH хостов. Я работаю с множеством серверов и эта функция также незаменима для меня. Рекомендуется всем администраторам.
export HISTFILE=~/.zsh_historyexport HISTSIZE=1000export SAVEHIST=1000setopt APPEND_HISTORY HIST_IGNORE_ALL_DUPS HIST_IGNORE_SPACE HIST_REDUCE_BLANKS
Включаем протоколирование истории, размер файла, опции игнорирования пустых строк, лишних пробелов и повторяющихся команд.
autoload -U predict-onzle -N predict-onzle -N predict-offbindkey "^X^Z" predict-on # C-x C-zbindkey "^Z" predict-off # C-z
А эта опция с помощью горячих клавиш включает поиск по истории в режиме реального времени прямо в текущей строке. С помощью Ctrl+X+Ctrl+Z включаем, а через Ctrl+Z выключаем. Впрочем в конфиге и так все понятно.
bindkey '^[[3~' delete-char bindkey '^E' expand-cmd-path
Заставляет нормально работать клавишу Delete. До этого она ставила тильды. И активируем клавишу автоподставления полного адреса. Например, пишем команду tcpdump, жмем Ctrl+E и получаем /usr/sbin/tcpdump. Некий аналог whereis.
_force_rehash() { (( CURRENT == 1 )) && rehash return 1 }zstyle ':completion:::::' completer _force_rehash _complete
Этот код нужен для того чтобы zsh находил новые команды без перезахода. Пример. Открыто два терминала. В одном происходит установка приложения, бинарник попадает по одному из путей переменной PATH. Там где ставили мы уже можем его запустить, во втором терминале нет. С помощью force_rehash мы решим эту проблему. Любителям screen посвящается.
alias df='df -h' aliasdu='du -sh'alias grep='egrep --color=auto'hash -d data=/Volumes/Data\ HD/hash -d itunes=/Volumes/Data\ HD/Music/iTunes\ Music/[ -r /etc/debian_version ] && [ -x 'which sudo' ] && alias upgrade='sudo apt-get update && sudo apt-get -u upgrade'
Алиасы это отдельный разговор. Их существует несколько типов. Более подробно читайте в документации. Расскажу только про hash. Это функция которая умеет запоминать каталоги где бы они не находились. В моем домашнем конфиге это путь на внешний винт и в каталог iTunes. Для того чтобы туда попасть нужно просто набрать ~itunes или ~data. На серверах просто незаменимо. С остальным экспериментируйте сами.
autoload -U zcalc zed
У этой командной оболочки есть и свои приложения. Например, калькулятор, текстовый редактор… тестрис. Дада. Тестрис. Можно устроить турнир с emacs’ерами.
Это лишь малая часть функционала zsh. О многом я не сказал, но если вам интересно, то без труда разберетесь. Один раз потратив время на настройку в будущем можно сэкономить много времени. Если вас устраивает мой конфиг можете есть скачать тут — zshrc. Статья получилась сильно гиковская по сравнению с тем что публиковалось раньше. Но часть публики, уверен, оценит. Да и мне полезно, чтобы не забыть. Ниже прилагаю несколько ссылок на хорошую документацию. Вопрос жду, как всегда, в комментариях.