Тонкая настройка .zshrc при использовании oh-my-zsh

Тонкая настройка .zshrc при использовании oh-my-zsh

Приветствую!

Сегодня мы рассмотрим процесс конфигурации популярной командной оболочки ZSH⚙️ через файл загрузки окружения .zshrc📝 при использовании фреймворка oh-my-zsh.

Подписывайтесь на наш телеграм @r4ven_me📱, чтобы не пропустить новые публикации на сайте😉. А если есть вопросы или желание пообщаться по тематике – заглядывайте в Вороний чат @r4ven_me_chat🧐.

Демонстрация приведенная в данной статье выполнялась в среде дистрибутива Linux Mint 22🌱 (Ubuntu 24🦍). Аналогичным образом все будет работать и в других популярных дистрибутивах Linux☝️.

Погнали🏎.

TLDR (клик)

# установка необходимых утилит
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, если он существует:

Клик сюда для просмотра содержимого .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.

Полезные материалы

Подписаться
Уведомить о
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии