Я не буду расписывать преимущества ZSH над Bash, отмечу лишь то, что ZSH используется по дефолту во многих дистрибутивах Linux, а также с недавних пор и в macOS (тут должна быть шутка про Торвальдса и его макбук). Главной причиной повсеместной замены bash на zsh является встроенный механизм модулей, поверх которого было навалено такое великолепие, как Oh My Zsh.
Установка:
# В арчеподобных дистрах:
pacman -S zsh
# В дебианоподобных:
apt install zsh
Теперь нужно сделать zsh дефолтным шеллом:
chsh -s $(which zsh)
Главный конфиг zsh называется .zshrc
, там можно, например, объявить пользовательские переменные окружения, но они будут доступны ТОЛЬКО В СЕССИИ ТЕРМИНАЛА. Чтобы они были доступны «везде», их нужно прописать в ~/.zshenv
.
Кучу дотфайлов не очень удобно хранить в пользовательской директории, поэтому все конфиги лучше вынести в ~/.config/zsh
.
Создадим директорию для конфигов zsh:
mkdir -p ~/.config/zsh
Теперь настроим переменные окружения
~/.zshenv
:
# Для начала зададим переменные xdg, если те не заданы
# Эти переменные используются многими программами, и если их не задать, то пользовательская директория будет завалена файлами с точкой в начале имени
# https://wiki.archlinux.org/title/XDG_Base_Directory
export XDG_DATA_HOME="${XDG_DATA_HOME:-$HOME/.local/share}"
export XDG_STATE_HOME="${XDG_STATE_HOME:-$HOME/.local/state}"
export XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-$HOME/.config}"
export XDG_CACHE_HOME="${XDG_CACHE_HOME:-$HOME/.cache}"
# Далее определим эту переменную, чтобы конфиги zsh искались в этой директории
export ZDOTDIR="${XDG_CONFIG_HOME}/zsh"
# Так же добавим пути до бинарников в домашнем каталоге в PATH
# и переместим .zfunc из домашней директории в $ZDOTDIR
typeset -U path fpath
path=(~/.local/bin ~/bin $path)
fpath+=("$ZDOTDIR/.zfunc")
Остальные переменные добавьте по желанию (которые должны быть доступны в программах типа VS Code и т.п., если те запускаются не из терминала).
❗❗❗ После изменения ~/.zshenv
нужно сделать логаут и снова войти под тем же пользователем.
Я уже упомянул про легендарную систему модулей. Модулями (плагинами) легче всего управлять через менеджер плагинов. Я советую использовать antidote – реанкарнацию почившего в бозе antibody. Он позволяет очень просто управлять плагинами через текстовый файл.
Установка в Arch:
yay -S zsh-antidote
В остальных дистрах потребуется немного ручной работы:
git clone --depth=1 https://github.com/mattmc3/antidote.git ${ZDOTDIR:-~}/.antidote
Теперь перейдем к настройке главного конфига.
~/.config/zsh/.zshrc
:
# Зададим путь до директории с плагинами Oh My Zsh
export ZSH="${ZDOTDIR}/oh-my-zsh"
# Вставка \ перед ? и тп
# Меня лично это бесит
DISABLE_MAGIC_FUNCTIONS=true
# Здесь подключается antidote
# Если antidote установлен через пакетный менеджер, то путь до него будет выглядеть примерно так
antidote_zsh='/usr/share/zsh-antidote.zsh'
# Если antidote был скачен через git, иначе закомментируйте следующую строку
antidote_zsh="$ZDOTDIR/.antidote/antidote.zsh"
if [ -f "$antidote_zsh" ]; then
zsh_plugins=${ZDOTDIR:-$HOME}/.zsh_plugins
if [[ ! ${zsh_plugins}.zsh -nt ${zsh_plugins}.txt ]]; then
(
source "$antidote_zsh"
antidote bundle <${zsh_plugins}.txt >${zsh_plugins}.zsh
)
fi
source ${zsh_plugins}.zsh
fi
# Настройки истории
export HISTSIZE=100000
export SAVEHIST=100000
# Файл истории так же храним в ~/.config/zsh
export HISTFILE=$ZDOTDIR/.zsh_history
# Всякие алиасы я предпочитаю хранить как файлы с расширением `.zsh` в ~/.config/zsh/zshrc.d
# Тут мы создаем директорию, если ее нет
if [ ! -d "$ZDOTDIR/zshrc.d" ]; then
mkdir -p "$ZDOTDIR/zshrc.d"
fi
# А тут: подключаем вспомогательные файлы
for src in $ZDOTDIR/zshrc.d/*.zsh; do
. "$src"
done
Минимальный конфиг готов.
А теперь пришло время настраивать и устанавливать все игр… плагины.
Antidote настраивается через текстовый файл. Где с каждой строчки указываются модули/плагины, которые нужно использовать, предварительно выкачав. Например, если плагин находится на https://github.com/zdharma-continuum/fast-syntax-highlighting
, то мы указываем только часть после https://github.com/
, те zdharma-continuum/fast-syntax-highlighting
, если же плагин загружен на другой git-репозиторий исходного кода, то нужно добавить имя домена, например, gitlab.com/[username]/[reponame]
.
Создадим ~/.config/zsh/.zsh_plugins.txt
:
# oh-my-zsh
# Подгрузим содержимое https://github.com/ohmyzsh/ohmyzsh/tree/master/lib
ohmyzsh/ohmyzsh path:lib
# Добавим какие-нибудь плагины
ohmyzsh/ohmyzsh path:plugins/colored-man-pages
ohmyzsh/ohmyzsh path:plugins/colorize
ohmyzsh/ohmyzsh path:plugins/command-not-found
ohmyzsh/ohmyzsh path:plugins/common-aliases
# мне еще нравится этот
# он позволяет добавить к текущей или предыдущей команде sudo, два раза нажав <ESC>
ohmyzsh/ohmyzsh path:plugins/sudo
# этот плагин вставляет закрывающую кавычку или скобку при вводе открывающей...
hlissner/zsh-autopair
# уведомляет о том, что у команды есть алиас
MichaelAquilina/zsh-you-should-use
# подстановка ранее введеных команд
zsh-users/zsh-autosuggestions kind:defer
# автодополнение аргументов
zsh-users/zsh-completions kind:defer
# я обещал превратить терминал в раскраску...
# подсветка синтаксиса zsh (раскрашивание ключевых слов и прочих разделителей разными цветами)
zdharma-continuum/fast-syntax-highlighting kind:defer
# ну и поставим какую-нибудь тему
ohmyzsh/ohmyzsh path:themes/refined.zsh-theme
Скрины с темами можно посмотреть здесь.
Если не устраивают темы oh my zsh, то вот вам одна из самых популярных тем romkatv/powerlevel10k.
Осталось только перезапустить шелл:
exec -l $SHELL
Жду дополнений. Может, и для себя что-то новое узнаю.
Интересные плагины можно найти в репозитории Awesome ZSH Plugins.