Тонкая настройка .zshrc при использовании oh-my-zsh
Приветствую!
Сегодня мы рассмотрим процесс конфигурации популярной командной оболочки ZSH⚙️ через файл загрузки окружения .zshrc
📝 при использовании фреймворка oh-my-zsh.
Подписывайтесь на наш телеграм @r4ven_me📱, чтобы не пропустить новые публикации на сайте😉. А если есть вопросы или желание пообщаться по тематике – заглядывайте в Вороний чат @r4ven_me_chat🧐.
Демонстрация приведенная в данной статье выполнялась в среде дистрибутива Linux Mint 22🌱 (Ubuntu 24🦍). Аналогичным образом все будет работать и в других популярных дистрибутивах Linux☝️.
Погнали🏎.
# установка необходимых утилит
sudo apt update && sudo apt install -y git curl zsh
# опционально: установка bat и exa
sudo apt install -y bat exa fzf || sudo apt install -y bat eza fzf
# бэкап существующего .zshrc
test -e ~/.zshrc && mv ~/{.zshrc,.zshrc_backup}
# скачивание готового .zshrc
curl -fsSL https://raw.githubusercontent.com/r4ven-me/dots/main/.zshrc -o ~/.zshrc
# смена оболочки по умолчанию
[[ $SHELL == *zsh ]] || chsh -s /usr/bin/zsh
# применение изменений для текущей сессии
exec zsh
Предисловие
Если вы много времени проводите в консоли/терминале Linux🧑💻, то вероятно слышали про инструменты, которые облегчают взаимодействие с командной строкой и выводят “юзер экспириенс” на “новый уровень”🤔. Один из таких инструментов — оболочка ZSH и созданный умельцами фреймворк для ее простого и удобного конфигурирования — oh-my-zsh🔥.
Ранее я достаточно много времени потратил на приведение используемой мной оболочки к “идеальному”, на мой взгляд, или близко к тому состоянию🫠.
Ниже я приведу подробное описание своего конфига ZSH в файле .zshrc
✍️, чтобы бы вы понимали, зачем вам это нужно.
После покажу (до безобразия простой🤷♂️) способ установки и применения данного конфига. Все внешние зависимости, такие как сам oh-my-zsh и дополнительные плагины будут установлены автоматически🦾 при первом запуске ZSH.
Процесс ручной установки ZSH + oh-my-zsh описан в отдельной статье.
Описание конфигурации .zshrc
В этом разделе представлено, разделенное по блокам🧱 файла .zshrc
, описание того, что данный конфиг изменяет/дополняет в поведении оболочки ZSH.
ОБЩИЕ НАСТРОЙКИ🛠
- Добавление пользовательских директорий
bin
,.bin
,.local/bin
в переменнуюPATH
для упрощения доступа к пользовательским скриптам; - установка переменных окружения для работы с
oh-my-zsh
(ZSH
,ZSH_CUSTOM
) и корректной поддержки цвета в терминале (TERM
); - выбор темы оболочки в зависимости от среды:
agnoster
— для GUI и псевдотерминальных сеансов (PTS);dpoggi
(без иконок) — для консольных сеансов (TTY);
- отключение автоматического обновления
oh-my-zsh
(команда для обновления вручную:omz update
); - настройка истории команд:
- хранение до 10,000 команд;
- добавление временных меток в формате
yyyy-mm-dd
; - игнорирование повторяющихся записей и команд, начинающихся с пробела;
- общая история между терминальными сессиями🔥.
ПЛАГИНЫ🗃
Для улучшения работы с оболочкой используются следующие плагины:
fzf
— поиск по истории команд с использованием утилитыfzf --exact
черезCtrl+r
;git
— алиасы и утилиты для работы с Git;sudo
— быстрое выполнение последней/текущей команды с sudo через двойное нажатиеEsc
;docker
,kubectl
— вспомогательные команды для Docker и Kubernetes;cmdtime
— измерение времени выполнения команд (выводится в конце последней строки);zsh-autopair
— автоматическое закрытие скобок и кавычек во время введения команды;zsh-completions
— расширенные автодополнения черезTab
в т.ч. подкоманд и ключей команд;zsh-autosuggestions
— подсвечиваемые подсказки на основе истории команд;fast-syntax-highlighting
— подсветка синтаксиса команд;history-substring-search
— поиск по истории при введении части команды через стрелкивверх
/вниз
.
Несколько примеров использования:
Ctrl+r
— вызовfzf
для поиска команды из истории;- при вводе части команды нажмите
Tab
для расширенного автодополнения (подкоманды, имена файлов или опции команд); - при вводе части команды нажмите
вверх
, чтобы найти похожие команды из истории.
ПРИЛОЖЕНИЯ И УТИЛИТЫ🧑💻
- Установлены алиасы для упрощения часто используемых команд:
python
->python3
;- быстрый пинг DNS сервера google по команде
p8
, подсветка вывода командыip
; - выбор редактора по умолчанию (
nvim
илиvim
) + удобные алиасы;
- установка цветовой палитры
Nord
для утилитыfzf
; - использование
bat
/batcat
, как заменыcat
,less
,man
,--help
иtail -f
с подсветкой цветов темыNord
; - замена команды
ls
наexa
/eza
с улучшенными опциями отображения (длинный список, древовидный вывод, сортировка).
Подробнее про bat и exa смотрите в статье: bat, exa – подсветка синтаксиса стандартного вывода в терминале Linux (cat, less, tail и ls).
АВТОМАТИЧЕСКАЯ УСТАНОВКА🦾
При запуске оболочки она автоматически проверяет и устанавливает oh-my-zsh
и недостающие плагины (cmdtime
, zsh-autopair
, zsh-completions
, zsh-autosuggestions
, fast-syntax-highlighting
).
ПРИГЛАШЕНИЕ ОБОЛОЧКИ👋
Убрано отображение user@host
из приглашения оболочки, если используется графическая среда.
Теперь переходим к подготовке и установке.
Подготовка
Установка необходимых пакетов
Предварительно нам необходимо установить саму оболочку zsh
, утилиту для взаимодействия с веб curl
и систему контроля версий git
:
sudo apt update && sudo apt install -y git curl zsh
Также (опционально) рекомендую установить утилиты для подсветки терминального вывода и удобного поиска:
sudo apt install -y bat exa fzf || sudo apt install -y bat eza fzf
Установка powerline шрифта для GUI сеанса
Для корректной отрисовки иконок в вашем терминале во время графической сессии — необходимо использовать специальный мноноширный иконочный powerline шрифт🤯, например, из проекта Nerd fonts.
Мои читатели знают, что я предпочитаю шрифт Hack☝️. Вот простой пример, как его можно установить:
Обратите вниманием, что для выполнения команд потребуются права sudo. Либо установите шрифты только для текущего пользователя в директории
~/.local/share/fonts
.
# создаем директорию шрифта
sudo mkdir /usr/share/fonts/Hack
# скачиваем архив со шрифтами
curl -fsSLO \
$(curl -s https://api.github.com/repos/ryanoasis/nerd-fonts/releases/latest \
| grep browser_download_url \
| grep 'Hack.zip' \
| cut -d '"' -f 4)
# распаковываем архив, коприруем шрифты в систем
sudo unzip ./Hack.zip -d /usr/share/fonts/Hack/ && rm -f ./Hack.zip
В команде
curl
используется механизм подстановки командной строки. Т.е. основной команде на скачивание:curl -fsSLO
передается аргумент, который является результатом выполнения другой команды внутри конструкции$(command)
, выполняющейся предварительно. В итоге основная команда получит прямой URL на zip файл последнего релиза шрифта Hack из GitHub. Команда универсальна.
После установки шрифта, активируйте его в настройках вашего терминала🛠.
В Gnome-terminal это делается так:
Скачивание и применение готовой конфигурации .zshrc
Теперь скачиваем готовый файл .zshrc
с моего GitHub с предварительным бэкапом текущего .zshrc
, если он существует:
#######################
### ОБЩИЕ НАСТРОЙКИ ###
#######################
# Добавление пользовательских директорий в переменную PATH
if [[ -d "$HOME/bin" ]]; then PATH="$HOME/bin:$PATH"; fi
if [[ -d "$HOME/.bin" ]]; then PATH="$HOME/.bin:$PATH"; fi
if [[ -d "$HOME/.local/bin" ]]; then PATH="$HOME/.local/bin:$PATH"; fi
export PATH
export ZSH="$HOME/.config/oh-my-zsh" # Путь к установке Oh My Zsh
export ZSH_CUSTOM="$ZSH/custom" # Путь к пользовательской директории Oh My Zsh
export TERM="xterm-256color" # Установка типа терминала для поддержки цветов
# export TERM="screen-256color" # Альтернативный тип терминала (закомментирован)
# Выбор темы для Oh My Zsh
# Список тем: https://github.com/ohmyzsh/ohmyzsh/wiki/Themes
if [[ -n "$DISPLAY" || $(tty) == /dev/pts* ]]; then
ZSH_THEME="agnoster" # Тема для псевдотерминального сеанса или GUI сеанса
export VIRTUAL_ENV_DISABLE_PROMPT=1 # Отключение стандартного приглашения virtualenv
else
ZSH_THEME="dpoggi" # Тема без иконок для консольного сеанса (tty)
fi
DISABLE_AUTO_UPDATE="true" # Отключение автоматического обновления Oh My Zsh (вручную: omz update)
COMPLETION_WAITING_DOTS="true" # Отображение точек при автодополнении команд
# Настройка истории команд
HIST_STAMPS="yyyy-mm-dd" # Добавление временных меток в историю команд
HISTFILE=~/.zsh_history # Файл для сохранения истории
HISTSIZE=10000 # Максимальное количество записей в истории в памяти
SAVEHIST=10000 # Максимальное количество записей для сохранения в файл
setopt hist_ignore_all_dups # Игнорировать дублирующиеся записи в истории
setopt share_history # Общая история между сессиями
setopt histignorespace # Не сохранять в историю команды, начинающиеся с пробела
###############
### ПЛАГИНЫ ###
###############
plugins=(
fzf # Интеграция с fuzzy finder (Ctrl+r)
git # Алиасы и функции для Git
sudo # Выполнение/повтор последней команды с sudo (двойной Esc)
docker # Вспомогательные команды для Docker
kubectl # Вспомогательные команды для Kubernetes
cmdtime # Измерение времени выполнения команд
zsh-autopair # Автоматическое закрытие скобок и кавычек
zsh-completions # Дополнительные скрипты автодополнения (Tab)
zsh-autosuggestions # Подсказки команд на основе истории
fast-syntax-highlighting # Подсветка синтаксиса для команд
history-substring-search # Поиск в истории по подстроке (стрелки вверх/вниз)
)
# Автоматическая установка oh-my-zsh
if [[ ! -d "$ZSH" && -x $(which git) ]]; then
git clone https://github.com/ohmyzsh/ohmyzsh.git "$ZSH"
fi
# Автоматическая установка выбранных плагинов
if [[ -d "$ZSH_CUSTOM" && -x $(which git) ]]; then
if [[ ! -d "${ZSH_CUSTOM}"/plugins/cmdtime ]]; then
git clone https://github.com/tom-auger/cmdtime \
"${ZSH_CUSTOM}"/plugins/cmdtime
fi
if [[ ! -d "${ZSH_CUSTOM}"/plugins/zsh-autopair ]]; then
git clone https://github.com/hlissner/zsh-autopair \
"${ZSH_CUSTOM}"/plugins/zsh-autopair
fi
if [[ ! -d "${ZSH_CUSTOM}"/plugins/zsh-completions ]]; then
git clone https://github.com/zsh-users/zsh-completions \
"${ZSH_CUSTOM}"/plugins/zsh-completions
fi
if [[ ! -d "${ZSH_CUSTOM}"/plugins/zsh-autosuggestions ]]; then
git clone https://github.com/zsh-users/zsh-autosuggestions \
"${ZSH_CUSTOM}"/plugins/zsh-autosuggestions
fi
if [[ ! -d "${ZSH_CUSTOM}"/plugins/fast-syntax-highlighting ]]; then
git clone https://github.com/zdharma-continuum/fast-syntax-highlighting \
"${ZSH_CUSTOM}"/plugins/fast-syntax-highlighting
reset
fi
fi
###############################
### ИНИЦИАЛИЗАЦИЯ OH-MY-ZSH ###
###############################
source "${ZSH}"/oh-my-zsh.sh # Инициализация Oh My Zsh
autoload -Uz compinit && compinit # Инициализация и включение системы автодополнения
if [[ -r "${HOME}"/.profile ]]; then
source "${HOME}"/.profile # Подключение '.profile', если он существует
fi
############################
### ПРИЛОЖЕНИЯ И УТИЛИТЫ ###
############################
# Python
alias python="python3" # Установка алиаса для python3
# Сеть
alias p8="ping -c3 8.8.8.8" # Быстрая проверка сети (пинг)
alias ip="ip --color" # Включение цветного вывода для команды ip
# Настройка редактора
if [[ -x $(which nvim) ]]; then # Проверка установлен ли nvim (Neovim)
export EDITOR="$(which nvim)" # Установить nvim как редактор по умолчанию
export VISUAL="$(which nvim)" # Установить nvim как визуальный редактор по умолчанию
alias vim="nvim" # Заменить vim на nvim
alias n="nvim" # Установить короткий алиас для nvim
alias N="sudo nvim" # Установить алиас для запуска nvim с sudo
elif [[ -x $(which vim) ]]; then # Проверка установлен ли vim
export EDITOR="$(which vim)" # Установить vim как редактор по умолчанию
export VISUAL="$(which vim)" # Установить vim как визуальный редактор по умолчанию
alias v="vim" # Короткий алиас для vim
alias V="sudo vim" # Алиас для запуска vim с sudo
fi
# Настройка FZF с цветовой схемой Nord
if [[ -x $(which fzf) ]]; then # Проверка установлен ли fzf
export FZF_DEFAULT_OPTS=$FZF_DEFAULT_OPTS'
--color=fg:#e5e9f0,bg:#3b4252,hl:#81a1c1
--color=fg+:#e5e9f0,bg+:#3b4252,hl+:#81a1c1
--color=info:#eacb8a,prompt:#bf6069,pointer:#b48dac
--color=marker:#a3be8b,spinner:#b48dac,header:#a3be8b'
fi
# Определение переменной для использования bat или batcat
if [[ -e $(which batcat) ]]; then # Если установлен batcat, использовать его
export bat="batcat" # Установить алиас для batcat
alias bat="batcat"
elif [[ -e $(which bat) ]]; then # Если установлен bat, использовать его
export bat="bat"
fi
# Конфигурация bat
if [[ -n $bat ]]; then # Если переменная bat задана
export COLORTERM="truecolor" # Включить поддержку True Color
export BAT_THEME="Nord" # Установить тему Nord для bat
export MANPAGER="sh -c 'col -bx | $bat --language=man --style=plain'" # Использовать bat для отображения man
export MANROFFOPT="-c" # Отключить перенос строк в man
alias cat="$bat --style=plain --paging=never" # Использовать bat вместо cat
alias less="$bat --paging=always" # Использовать bat вместо less
if [[ $SHELL == *zsh ]]; then # Если используется zsh, настроить глобальный алиас --help
alias -g -- --help='--help 2>&1 | $bat --language=help --style=plain'
fi
help() { "$@" --help 2>&1 | $bat --language=help --style=plain; } # Вывод справки с bat
tailf() { tail -f "$@" | $bat --paging=never --language=log; } # tail с подсветкой
batdiff() { git diff --name-only --relative --diff-filter=d | xargs $bat --diff; } # Использование bat для git diff
fi
# Использование exa вместо ls
if [[ -x $(which exa) ]]; then # Проверка установлен ли exa
if [[ -n "$DISPLAY" || $(tty) == /dev/pts* ]]; then # Если используется псевдотерминал, включить иконки
alias ls="exa --header --icons"
else
alias ls="exa --header" # Без иконок для консольного сеанса
fi
alias ll="ls --long" # В виде списка
alias l="ls --long --all" # В виде списка + скрытые файлы
alias lm="ls --long --all --sort=modified" # Сортировка по дате изменения
alias lmm="ls -lbHigUmuSa --sort=modified --time-style=long-iso" # Подробный вывод
alias lt="ls --tree" # Древовидный вывод
alias lr="ls --recurse" # Рекурсивный вывод
alias lg="ls --long --git --sort=modified" # Отображение флагов Git
fi
# APT
if [[ -x $(which apt) ]]; then # Проверка что используется apt
alias AU="sudo apt update" # Обновление списка пакетов по команде "AU"
alias AUP="sudo apt upgrade" # Обновление пакетов по команде "AUP"
alias AR="sudo apt autoremove" # Удаление неиспользуемых пакетов по команде "AR"
alias AI="sudo apt install" # Установка пакетов по команде "AI"
alias AUI="sudo apt update && sudo apt install" # Обновление списка и установка по команде "AUI"
fi
# Ansible
if [[ -e $(which ansible) ]]; then # Проверка установлен ли ansible
ap() { ansible-playbook ~/ansible/playbooks/"$@"; } # Функция для выполнения playbook из указанной директории
alias ac="ansible-console" # Запуск консоли ansible
fi
# Tmux
if [[ -e $(which tmux) ]]; then # Проверка установлен ли tmux
alias t="tmux attach -t Work || tmux new -s Work" # Подключение или создание сессии Work
alias T="sudo tmux attach -t Work! || sudo tmux new -s Work!" # Аналогично с sudo
fi
############################
### ПРИГЛАШЕНИЕ ОБОЛОЧКИ ###
############################
# Удаление контекста user@host из приглашения, в случае графического сеанса
if [[ -n "$DISPLAY" ]]; then
prompt_context() { } # Пустая функция для отключения контекста
fi
# бэкап текущего .zshrc
test -e ~/.zshrc && mv ~/{.zshrc,.zshrc_backup}
# скачивание нового .zshrc
curl -fsSL https://raw.githubusercontent.com/r4ven-me/dots/main/.zshrc -o ~/.zshrc
# активация оболочки zsh
exec zsh
- 1-я команда:
test -e ~/.zshrc
— проверяет, существует ли файл.zshrc
в домашней директории (~
);&&
— выполняет следующую команду только в случае успеха предыдущей;mv ~/{.zshrc,.zshrc_backup}
— перемещает (переименовывает) файл.zshrc
в.zshrc_backup
;
- 2-я команда:
curl
— утилита для получения данных из веб;-f
— краткий вывод ошибок;-s
— отключает вывод ошибок и прогресса (silent);-S
— включает вывод ошибок, если режим silent включен;-L
— следует за редиректам, если они есть;-o ~/.zshrc
— сохраняет загруженный файл в указанное место;
- 3-я команда:
exec
— заменяет текущий процесс оболочки (в данном случае саму оболочку) на указанную команду;zsh
— запускает оболочку Zsh.
Отлично👏.
Если вы в десктопном сеансе, у вас будет минималистичный prompt:
В ином случае он будет таким:
Консольный же сеанс будет с использованием темы без иконок:
На данный момент мы просто запустили оболочку zsh
в текущем сеансе☝️. Чтобы сделать zsh
вашей оболочкой по умолчанию (если это не так) выполните команду:
[[ $SHELL == *zsh ]] || chsh -s /usr/bin/zsh
[[ ... ]]
— проверяет условие внутри;$SHELL
— переменная окружения, содержащая путь к текущей оболочке (например,/bin/bash
или/usr/bin/zsh
);== *zsh
— проверяет, заканчивается ли значение переменной$SHELL
наzsh
;||
— выполняет следующую команду только если предыдущая вернула ложь (код возврата не равен 0);chsh
— команда для изменения оболочки пользователя;-s /usr/bin/zsh
— устанавливает Zsh как оболочку по умолчанию для текущего пользователя.
Готово. Для корректного применения изменений рекомендуется выйти из текущего сеанса и зайти заново🚶➡️.
Tab
Ctrl+r
history
Пример работы bat
и exa
:
cat ~/.bashrc
less ~/.zshrc
tailf /var/log/apt/history.log
ls -la
Послесловие
В этот раз мы детально рассмотрели, как настроить поведение оболочки ZSH в файле .zshrc
при использовании популярного фреймворка oh-my-zsh😌.
На мой взгляд, кастомизация своего рабочего пространства (в т.ч. оболочки) значительно увеличивает эффективность🧑💻. Если конечно не заниматься этим фанатично😉. Многие игнорируют данный момент, предпочитая дефолтные настройки. Не могу сказать, что это плохо, просто имея некоторый опыт уяснил для себя: лучше потратить немного (или много) времени на настройку👨🔧 и просто пользоваться полученным конфигом везде, где возможно, тем самым решая различные задачи с большим удобством и меньшим количеством нервов😎.
Например, при вводе команды в терминале постоянно забываешь (или не знаешь🤷♂️), какие ключи у нее есть и что они делают. Приходится прерывать ввод, чтобы посмотреть справку. В случае моей конфигурации, для большинства популярных команд, достаточно просто нажать Tab
, чтобы увидеть подсказку по ключам, которые еще и можно “протабать”👌. Сюда же относится удобство работы с историей команд и так далее😏.
Спасибо, что читаете 😊. Обязательно заглядывайте в нашу телегу: @r4ven_me, чтобы не пропустить новые публикации на сайте. А если остались вопросы – добавляйтесь в Вороний чат. У нас там дружелюбное микросообщество 🚶♀️🐧🚶🐧🚶♂️🐧 и я периодически пересылаю туда разные интересные новости из мира IT.