Разработка
Даниил Шило

Пишем конфигурацию для zsh

zsh — одна из современных командных оболочек UNIX, использующаяся непосредственно как интерактивная оболочка, либо как скриптовый интерпретатор. Zsh является расширенным аналогом, а также имеет обратную совместимость с bourne shell, имея большое количество улучшений.

Wikipedia

Иметь красивый и удобный шелл для человека, который ведет разработку в терминале или просто пользуется им 90% рабочего времени — дело хорошее, ещё лучше если этот шелл хорошо настроен, не подлагивает в больших репозиториях git и предоставляет удобные алиасы, этим сегодня и займемся😊

В результате всех взаимодействий у нас выйдет такой шелл:

Менеджер плагинов

Можно конечно копировать все репозитории ручками, однако, если вы перейдете с одной системы на другую, то вам придётся хранить список репозиториев, которые нужно подкинуть себе😳 Это крайне неудобно, да и на дворе 22-й год, поэтому давайте разберемся в том, какие менеджеры плагинов есть у zsh:

  • antibody
  • antigen
  • zinit
  • zgen
  • zplug
  • zpm

Поговорим о каждом из них чуть подробнее:

antigen - Стандарт де-факто среди менеджеров плагинов для zsh. С помощью него удобно устанавливать файлы, т.к. достаточно просто указать команды в .zshrc, сам пакетный менеджер подхватит все команды и выполнит их. У данного пакетного менеджера есть поддержка установки плагинов из репозитория Oh My Zsh, что делает использование самого шелла ещё более удобным, т.к. для Oh My Zsh написали очень много прекрасных плагинов.

antibody - Предоставляет те же функции, что и antigen, однако является быстрее и делает упор на производительность⚡ Единственный минус у данного менеджера плагинов - то, что он перешёл в maintaince mode, это означает что для него больше не выходят фичи, только фиксятся критические баги.

zgen - Легковесный и простой менеджер плагинов для zsh. Он генерирует отдельный файлик со списком плагинов, проверяет обновления автоматически и практически не влияет на startup time (время запуска шелла в первый раз). Данный менеджер плагинов также поддерживает установку плагино из репозитория Oh My Zsh😊

zinit - Данный менеджер плагинов является очень гибким в настройке. Это единстенный менеджер плагинов, у которого есть Turbo-режим (как написано в самом репозитории). Также сам менеджер плагинов является расширяемым. Для него написаны расширения (annexes), которые добавляют новые команды и функционал.

zplug - Один из очень медленных менеджеров плагинов, который по иронии является самым удобным😅 Обладает функцией параллельной установки/обновления, поддерживает ленивую загрузку плагинов, есть возможность написать пост и пре-хуки для плагинов, не создает лишние файлы при установке плагинов, есть механизм кэша, для того чтобы уменьшать и без того большую задержку startup time’а.

zpm - Разработчик указывает что это один из быстрейших менеджеров для плагинов в zsh (внизу будет график, посмотрим, правда ли это). Поддерживает Oh My Zsh плагины, поддерживает множество систем (Linux, Android, OpenWrt, FreeBSD and macOS), асинхронную загрузку, хуки, сам является расширяемым менеджером для плагинов.

Далее будет информация предоставленная с вот этого репозитория😊 Все картинки распространяются по вот этой лицензии.

Давайте глянем на время установки плагинов различными менеджерами:

И действительно автор zpm не соврал нам и менеджер быстрее всех устанавливает плагины. Однако нас мало волнует время установки, нам нужно быстрое время запуска самого шелла, так как в будущем при работе с шеллом долгий запуск будет нас только раздражать. Вот startup time у разных менеджеров:

Тут мы ясно и четко видим, что время загрузки самих плагинов у antibody, antigen, sheldon и zgen — примерно одинаковое, а вот zpm грузит плагины достаточно долго😳, не говоря уже про zplug🐌

И все-таки какой менеджер плагинов использовать? Одним из лучших по юзабельности является antigen, он является стандартом не просто так. Он достаточно быстро грузит все плагины (как и устанавливает) и не мельтешит перед глазами лишний раз. Один раз установим плагины и забудем даже, что он у нас есть😊

Конфигурация

Для начала нужно создать .zshrc, который будет находится в корневой директории пользователя ($HOME).

Внутри самого .zshrc следует поместить следующее:

### PATH VARIABLES ### ANTIGEN_PATH="$HOME/.config/antigen.zsh" # Путь к самому antigen CARGO_PATH="$HOME/.cargo/bin" # Путь для cargo, если у вас есть установленные утилиты на Rust PYTHON_PATH="$HOME/.local/bin" # Путь к бинарникам Python, если у вас есть они NVM_DIR="$HOME/.nvm" # Путь для Node Version Manager, если он вам нужен HISTFILE="$HOME/.zsh_history" # Файл, в который будет записываться вся история команд на zsh EDITOR="nvim" # Редактор по умолчанию. Можете подставить любой, который вам нравится HISTSIZE=10000 # Количество сохраненных команд в файле SAVEHIST=10000 # Как много команд шелл должен помнить в одной сессии (по команде history) setopt appendhistory # Сохраняем всю историю в файл, чтобы она не стиралась, если мы выключим и включим шелл

Данные настройки у каждого пользователя разные. Хорошей практикой в конфигурации шелла является объявлять все переменные вверху файла, а также допиливать функционал в шелле, которого не хватает стандартными методами (как допиливание сохранения истории из сессии в сессию).

Далее пойдут обычные условия на дополения переменной PATH, данная специальная переменная является строкой, которая подсказывает шеллу откуда таскать бинарники для команд:

# Проверяем есть ли у нас бинарники Cargo if [ -d $CARGO_PATH ]; then export PATH=$CARGO_PATH:$PATH # Добавляем переменную CARGO к PATH fi # Проверяем есть ли у нас бинарники Python if [ -d $PYTHON_PATH ]; then export PATH=$PYTHON_PATH:$PATH # Добавляем переменную PYTHON к PATH fi # Проверяем скачан ли Antigen if [ ! -f $ANTIGEN_PATH ]; then echo "Antigen is not found!" >&2 # Если antigen не скачан, то качаем его curl -L git.io/antigen > $ANTIGEN_PATH fi # Опционально! Все что начинается с данной строки не обязательно должно попадать в ваш .zshrc # Я добавил данный кусочек конфигурации, чтобы вы могли увидеть как можно быстро и удобноо скачать NVM😊 # Проверяем есть ли на системе Node Version Manager if [ -d $NVM_PATH ]; then # Если есть - включаем export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" else # Если нет - качаем curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash fi

Далее наконец-то перейдем к самой установке плагинов🎉 Всё, что нам нужно сделать — подключить сам Antigen, а затем объявить плагины, которые нам нужно скачать😊

### PLUGIN MANAGER ### source $ANTIGEN_PATH # Подключаем сам antigen antigen bundle autojump # Плагин для прыжка по директориям antigen bundle git # Плагин для удобных алиасов git antigen bundle zsh-users/zsh-syntax-highlighting # Подсветка синтаксиса # Проверяем есть ли у нас команда exa type exa &> /dev/null && antigen bundle DarrinTisdale/zsh-aliases-exa # Если есть - добавляем для неё алиасы antigen bundle zsh-users/zsh-autosuggestions # Автодополнение как в Fish antigen bundle reobin/typewritten@main # Тема для zsh # Применяем все настройки, что мы указали😊 antigen apply

Давайте пройдемся по всем плагинам, что я здесь указал😊

  • Autojump — плагин, который позволяет быстро перемещаться по директориям. Как это работает? Мы перемещаемся по директориям и пишем в них любые команды (напр. ls), autojump запоминает данные директории. Затем вы можете просто написать j dev, и autojump сразу прыгнет к папке dev, если у вас она есть и вы в ней работали🤩
  • Git — данный плагин является стандартным в Oh My Zsh. Он добавляет алиасы (сокращения для команд) в шелл. Например git status можно написать как gss, git commit - gc, и так далее😊
  • zsh-syntax-highlighting — плагин, который будет выделять зеленым цветом правильно введенные команды, а красным - нет.
  • zsh-aliases-exa — плагин, который заменяет стандартный ls, на более продвинутый аналог https://github.com/ogham/exa. Exa в свою очередь удобен тем, что может выводить содержимое директорий вместе с иконками из Nerd Fonts, умеет красиво строить колонки из файлов, раскрашивает вывод самостоятельно.
  • zsh-autosuggestions — является одним из самых полезных плагинов в списке, он добавляет автодополнение команд. Если до этого нам приходилось нажимать Ctrl + R, для того чтобы найти команду в поиске истории, то теперь это все делается в реальном времени просто при введении символов. Для того чтобы завершить автодополнение достаточно нажать Ctrl + I или Tab, или Ctrl + E.

Последним плагином перед antigen apply является тема для самого шелла😊 Это Typewritten, минималистичная тема, которая имеет асинхронный Git Status

Если вам была интересна данная статья и вы хотите больше подобного материала, то советую вам подписаться на мой канал, я хоть и не часто, но выкладываю там что-то интересное✨

0
13 комментариев
Написать комментарий...
Igor

На mac есть fig намного удобнее чем куча плагинов

Ответить
Развернуть ветку
Даниил Шило
Автор

Вы правы) Сам жду, когда решение сделают кроссплатформенным) Однако, fig - просто автодополнение, а сами плагины для шелла позволяют расширить функционал как угодно😊

Ответить
Развернуть ветку
Александр Котовский

Fig активно собирает и передает телеметрию, историю команд, висит в фоне отдельным процессом, требует регистрации и шлет маркетинговые письма на почту, скоро и деньги собирать начнет. Проще запомнить десяток ежедневных команд.

Ответить
Развернуть ветку
Юрий Б.

1. спасибо за труд по написанию статьи. на канал подписался.

2. заходишь такой по удаленке на сервак, коих у тебя много, а там нет никакого zsh. потому может быть лучше освоить то, что в стандарте поставляется? баш обычный?

Ответить
Развернуть ветку
Memento Vivere
потому может быть лучше освоить то, что в стандарте поставляется? баш обычный?

По умолчанию само собой нужно знать основы. Но если есть возможность упростить жизнь на рабочем месте, ускорить стандартные процессы и поставить удобную тему, то почему бы это не сделать?

Ответить
Развернуть ветку
Юрий Б.

Потому что изучаешь основы, так как серваков много, ставить доп. софт туда надо согласовывать или вообще там интернета нет. А потом изучаешь ещё что-то по второму разу уже как бы для удобной работы. Получается, два раза. Пример, конечно, у меня притянутый за уши, но многофакторность всех решений часто недооценивается. Свои факторы под мой случай я развернул в этом комментарии.

Исходя из этого

если есть возможность упростить жизнь на рабочем месте, ускорить стандартные процессы и поставить удобную тему

то надо так делать, а если такой возможности нет, то не надо.

No offense.

Ответить
Развернуть ветку
Рекорд Надоев

Использую ohmyzsh с темой agnoster.

Плагины через zinit:

zdharma/fast-syntax-highlighting
zsh-users/zsh-autosuggestions
zsh-users/zsh-completions

В какой-то момент сидеть на arch/ubuntu/mint становилось больно, в итоге с ноута перешел на ПК и тут решил, что будет только Win10.

Долго страдал от того, что нет норм терминала (ConEmu, cmder, Tabby - хорошие, но много кривых мест) под Win, но недавно открыл для себя Windows Terminal и оказалось, что это классная штука для моих нужд (если Powerline шрифты установить, конечно).

В итоге сижу в Win10, оболочка zsh в WSL2 через Windows Terminal и чувствую себя как на Ubuntu, но со всеми плюсами Win10 как для юзверя.

Звучит костыльно (так оно и есть), но меня все устраивает.

Ответить
Развернуть ветку
Даниил Шило
Автор

Рад, что вы нашли для себя решение!
Но, не легче ли сидеть на Powershell? Для него есть Oh My PoSh, а также множество алиасов команд из Bash для Powershell😊

https://ohmyposh.dev/
—-
Не стоит забывать, что WSL2 все ещё пилят, когда я его использовал были некоторые косяки с производительностью, а также было не совсем удобно работать с файловой системой (заходить нужно было по-моему в /D/..., что на мой взгляд немного неудобно, когда корневые директории идут с большой буквы).

Ответить
Развернуть ветку
Рекорд Надоев
не легче ли сидеть на Powershell?

Не знаю, не юзаю Powershell.
А в чем конкретно он может что-то упростить?

WSL мне в любом случае нужна для docker, так что весь этот зоопарк не только для терминала. К bash я привык за 6+ лет, что не скажешь о Powershell, в который вставляю команды раз в год. Не гуглил никогда аналога ohmyzsh под powershell, но раз он есть, то буду знать.

косяки с производительностью

Не замечено, кроме того, что если цеплять напрямую IDE (PhpStorm) к папке проекта в WSL, то идет бесконечная индексация. Если код держать под Win10, и docker контейнеры будут под WSL, но собираться из Win10, то да, там какие-то лютые затупы, но, видимо, это из-за разных файловых систем, файлы которых надо на лету потом править, что для всяких нескомпилированных штук критично (файлов сотни тысяч). Не знаю где баг, в IDE или в WSL, но если монтировать через Samba /home из WSL, то все летает (не знаю насколько, мб диск выручает - Silicon Power US70). Как можно понять, тут нужны было тоже жестко закостылить.

заходить нужно было по-моему в /D/

сейчас по дискам можно гулять вот так:

cd /mnt/c/...
Ответить
Развернуть ветку
Даниил Шило
Автор
А в чем конкретно он может что-то упростить?

Если вы юзаете докер, то собственно особо ничем) Powershell просто же поставляется как родной шелл, поэтому ощущается на Windows он быстрее (ибо просто не в виртуалке им пользуетесь)

Для докера есть вроде бы нативное решение для Win, не знаю насколько оно костыльное в плане пользования им из терминала, так что WSL2 тут наверное все же лучше)

Не замечено, кроме того, что если цеплять напрямую IDE (PhpStorm) к папке проекта в WSL, то идет бесконечная индексация

Возможно сейчас все стало лучше, но точно помню, что когда сам работал внутри WSL в Neovim, то все жутко тормозило, а также Yarn помню у меня ну очень медленно работал, еле-еле дышал

Ответить
Развернуть ветку
Рекорд Надоев
Для докера есть вроде бы нативное решение для Win

Наверное, вы про docker-desktop. В нем можно выбрать движок контейнеров WSL2, что как бы и должно быть для Linux-контейнеров, иначе это виртуалка с Linux на борту и там уже docker. А мне нужны как раз Linux контейнеры, так как на Win серверами не балуюсь.

Возможно сейчас все стало лучше

Может быть. Я вообще не замечаю разницы от того, что это WSL по скорости работы, то есть пользуясь WSL и нативным Linux Mint никакой разницы не будет. Все-таки, как понимаю, WSL это нативное ядро Linux, которое Microsoft под себя собрали, а какой-то затуп может быть лишь на сети, между оболочкой хоста и конечной системой, но скорости локальной сети большие, так что даже не знаю что может лагать. Вы, видимо, юзали WSL1, там были какие-то баги по скорости работы и поэтому вышла WSL2.

Не очень в WSL разбираюсь, но сейчас проблем между Win и WSL не испытываю ни по быстродействию, ни по удобству. Но ко всему этому нужно было сделать кучу костылей, это правда. Благо все ходы записаны и при переустановке не надо тратить на это все много времени.

https://docs.microsoft.com/en-us/windows/wsl/compare-versions

также Yarn помню у меня ну очень медленно работал

Иногда по фронту приходится подтянуть зависимости проекта через yarn, так вот, если это делать в проекте в ФС WSL2 из оболочки под WSL2 (ну а оно уже может быть открыта через что угодно), то разницы между native Linux Ubuntu и WSL2 Ubuntu не чувствую. Ну то есть я не очень верю, что nvme диск настолько сглаживает эти тормоза (тут быстрее, чем был в Mint на ноуте), так как в итоге разницы визуально нет, хотя прямое сравнение я, конечно же, не проводил.

Ответить
Развернуть ветку
Максим Глущенко

сидел на zsh, но потом перешел на fish - сразу после установки там все что нужно есть - дополнение, раскраски...

Ответить
Развернуть ветку
Даниил Шило
Автор

Проблема Fish в том, что у него синтаксис сильно отличается от bash/zsh. Я пробовал использовать его, но после того как меня заставили ставить отдельный плагин для того чтобы выполнить скрипт на bash или запускать шелл внутри шелла - я отказался от идеи использования😢

Ответить
Развернуть ветку
Читать все 13 комментариев
null