Skip to main content

Установка Zsh с Oh-My-Zsh и темой Jovial: полное руководство

Это пошаговая инструкция по настройке современного и красивого терминала с использованием Zsh, фреймворка Oh-My-Zsh, темы Jovial и полезных плагинов. Руководство подходит для Debian, Ubuntu, CentOS, Fedora и других популярных дистрибутивов Linux.

Что мы получим в итоге

  • Zsh вместо bash — мощный shell с автодополнениями и историей команд
  • Oh-My-Zsh — фреймворк с сотнями тем и плагинов
  • Тема Jovial — красивый промпт с контекстными emoji и информацией о Git
  • Полезные плагины: автодополнения, подсветка синтаксиса, умный поиск по истории
  • Современные утилиты: eza вместо ls, bat вместо cat

Шаг 1: Установка Zsh и базовых инструментов

Debian/Ubuntu

sudo apt update
sudo apt install -y zsh git curl ca-certificates autojump

CentOS/RHEL/Fedora

# Для CentOS 7/RHEL 7
sudo yum install -y zsh git curl ca-certificates autojump-zsh

# Для CentOS 8+/RHEL 8+/Fedora
sudo dnf install -y zsh git curl ca-certificates autojump-zsh

Arch Linux

sudo pacman -S zsh git curl ca-certificates autojump

Alpine Linux

sudo apk add zsh git curl ca-certificates

Проверка установки:

zsh --version
# Должно вывести: zsh 5.8 или новее

Шаг 2: Установка дополнительных утилит (опционально)

eza — современная замена ls

Debian/Ubuntu 22.04+:

sudo apt install -y eza

Для старых версий или других дистрибутивов:

# Скачать последнюю версию с GitHub
wget -c https://github.com/eza-community/eza/releases/latest/download/eza_x86_64-unknown-linux-gnu.tar.gz -O - | sudo tar xz -C /usr/local/bin

bat — улучшенный cat с подсветкой синтаксиса

Debian/Ubuntu:

sudo apt install -y bat

# В Debian пакет называется batcat, создаём симлинк
sudo ln -s /usr/bin/batcat /usr/local/bin/bat

CentOS/Fedora:

sudo dnf install -y bat

Arch Linux:

sudo pacman -S bat

Проверка:

eza --version  # Должна показать версию
bat --version  # Должна показать версию

Если утилиты недоступны — не страшно, в конфигурации есть безопасные fallback на стандартные ls и cat.


Шаг 3: Смена стандартного shell на Zsh

Определяем путь к zsh:

command -v zsh
# Обычно: /usr/bin/zsh или /bin/zsh

Устанавливаем zsh как shell по умолчанию:

# Замените /usr/bin/zsh на ваш путь, если он отличается
chsh -s /usr/bin/zsh

# Или для конкретного пользователя (от root):
sudo chsh -s /usr/bin/zsh username

Важно: Изменения вступят в силу после повторного входа в систему или перезапуска терминала.

Проверка:

echo $SHELL
# Должно вывести: /usr/bin/zsh

Шаг 4: Установка Oh-My-Zsh

Скачиваем и устанавливаем Oh-My-Zsh:

sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

Скрипт автоматически:

  • Создаст директорию ~/.oh-my-zsh
  • Создаст базовый файл ~/.zshrc
  • Предложит сделать zsh shell по умолчанию (если ещё не сделано)

Альтернативный способ (ручная установка):

git clone https://github.com/ohmyzsh/ohmyzsh.git ~/.oh-my-zsh
cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc

Шаг 5: Установка плагинов

Создаём директорию для кастомных плагинов

mkdir -p ~/.oh-my-zsh/custom/plugins

zsh-autosuggestions — автодополнения на основе истории

git clone https://github.com/zsh-users/zsh-autosuggestions \
  ~/.oh-my-zsh/custom/plugins/zsh-autosuggestions

zsh-syntax-highlighting — подсветка команд в реальном времени

git clone https://github.com/zsh-users/zsh-syntax-highlighting \
  ~/.oh-my-zsh/custom/plugins/zsh-syntax-highlighting

zsh-history-enquirer — умный поиск по истории

git clone https://github.com/zthxxx/zsh-history-enquirer \
  ~/.oh-my-zsh/custom/plugins/zsh-history-enquirer

Jovial — плагин и тема (2 в 1)

git clone https://github.com/zthxxx/jovial \
  ~/.oh-my-zsh/custom/plugins/jovial

Шаг 6: Установка темы Jovial

Создаём симлинк темы:

mkdir -p ~/.oh-my-zsh/custom/themes

ln -sf ~/.oh-my-zsh/custom/plugins/jovial/jovial.zsh-theme \
       ~/.oh-my-zsh/custom/themes/jovial.zsh-theme

Шаг 7: Настройка .zshrc

Создаём резервную копию (если файл уже существует):

cp ~/.zshrc ~/.zshrc.backup

Открываем .zshrc в редакторе:

nano ~/.zshrc
# или
vim ~/.zshrc

Заменяем содержимое на следующее:

# === GUARD: выполнять только в zsh ===
[ -n "$ZSH_VERSION" ] || return

# === Oh-My-Zsh ===
export ZSH="$HOME/.oh-my-zsh"
ZSH_THEME="jovial"

# === Плагины ===
# ВАЖНО: zsh-syntax-highlighting должен быть последним!
plugins=(
  git
  autojump
  bgnotify
  zsh-history-enquirer
  zsh-autosuggestions
  jovial
  zsh-syntax-highlighting
)

source "$ZSH/oh-my-zsh.sh"

# === Настройки Jovial ===
typeset -g JOVIAL_EXEC_THRESHOLD_SECONDS=1

# === Терминал ===
export TERM="xterm-256color"
export COLORTERM="truecolor"

# === Локаль (для корректного отображения emoji) ===
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8

# === Алиасы для eza (с безопасным fallback на ls) ===
if command -v eza >/dev/null 2>&1; then
  alias ls='eza --icons=auto --group-directories-first --git'
  alias ll='eza -l --icons=auto --group-directories-first --git'
  alias la='eza -la --icons=auto --group-directories-first --git'
  alias lt='eza --tree --level=2 --icons=auto'
  alias lsize='eza -l --sort=size --icons=auto'
else
  alias ls='ls --color=auto'
  alias ll='ls -l --color=auto'
  alias la='ls -la --color=auto'
fi

# === Алиасы для bat/batcat (с fallback на cat) ===
if command -v bat >/dev/null 2>&1; then
  alias cat='bat --paging=never --style=plain'
elif command -v batcat >/dev/null 2>&1; then
  alias cat='batcat --paging=never --style=plain'
fi
export BAT_PAGER="less -FR"
export BAT_THEME="ansi"

# === Контекстные "эмоции" стрелки Jovial ===
typeset -g JOV_ARROW_DEFAULT='%(?.(◕‿◕).(╥﹏╥%))'
typeset -g JOV_ARROW_KUBE='%(?.(\_(ツ)_/¯).(╥﹏╥%))'
typeset -g JOV_ARROW_CONT='%(?.(⌐■_■).(╥﹏╥%))'

autoload -Uz add-zsh-hook
typeset -g JOV_LAST_CMD_BASE=''

jov_store_last_cmd() {
  local line="${2:-$1}"
  emulate -L zsh -o extendedglob
  line="${line##[[:space:]]##}"
  local base="${line%%[[:space:]]*}"
  
  if [[ "$base" == (sudo|doas) ]]; then
    local rest="${line#*[[:space:]]}"
    base="${rest%%[[:space:]]*}"
  fi
  JOV_LAST_CMD_BASE="$base"
}

preexec_functions=(${preexec_functions:#jov_store_last_cmd})
preexec_functions+=('jov_store_last_cmd')

jov_apply_context_face() {
  local expr="$JOV_ARROW_DEFAULT"
  case "$JOV_LAST_CMD_BASE" in
    kubectl|k|helm)                      expr="$JOV_ARROW_KUBE" ;;
    docker|docker-compose|podman|nerdctl) expr="$JOV_ARROW_CONT" ;;
    *)                                   expr="$JOV_ARROW_DEFAULT" ;;
  esac
  JOVIAL_SYMBOL[arrow]="$expr"
  JOVIAL_SYMBOL[arrow.git-clean]="$expr"
  JOVIAL_SYMBOL[arrow.git-dirty]="$expr"
}

precmd_functions=(${precmd_functions:#jov_apply_context_face})
precmd_functions+=('jov_apply_context_face')

# === Редакторы (опционально — настройте под себя) ===
export EDITOR="nano"
export VISUAL="nano"

# Если используете VS Code CLI:
# export EDITOR="code --wait --reuse-window"
# export VISUAL="code --wait --reuse-window"

Сохраняем и закрываем редактор (в nano: Ctrl+O, Enter, Ctrl+X).


Шаг 8: Применение изменений

Перезагружаем конфигурацию:

source ~/.zshrc

Или просто выходим и заходим заново:

exit
# Затем снова ssh/логин в систему

Шаг 9: Проверка работы

Проверяем shell:

echo $SHELL
# Ожидается: /usr/bin/zsh

Проверяем тему:

echo $ZSH_THEME
# Ожидается: jovial

Проверяем плагины:

# Начните вводить команду, которую уже использовали —
# должны появиться серые автодополнения (zsh-autosuggestions)

# Введите несуществующую команду — она подсветится красным
# (zsh-syntax-highlighting)

Проверяем алиасы:

ll  # Должен показать красивый вывод с иконками (если установлен eza)
cat ~/.zshrc  # Должен показать подсветку синтаксиса (если установлен bat)

Настройка VS Code Remote-SSH (опционально)

Если вы используете VS Code для подключения к серверу по SSH, нужно указать zsh как терминал по умолчанию.

В настройках VS Code (settings.json):

{
  "terminal.integrated.profiles.linux": {
    "zsh": {
      "path": "/usr/bin/zsh",
      "args": ["-l"]
    }
  },
  "terminal.integrated.defaultProfile.linux": "zsh",
  "terminal.integrated.inheritEnv": false
}

Почему важна первая строка в .zshrc:

[ -n "$ZSH_VERSION" ] || return

Эта строка-страж предотвращает выполнение .zshrc в bash, если VS Code случайно запустит bash вместо zsh. Без неё вы получите ошибки типа "Oh My Zsh can't be loaded from: bash".


Типичные проблемы и решения

Проблема 1: Ошибка "Oh My Zsh can't be loaded from: bash"

Причина: Bash пытается выполнить .zshrc

Решение:

  • Убедитесь, что первая строка в .zshrc: [ -n "$ZSH_VERSION" ] || return
  • Проверьте shell по умолчанию: echo $SHELL
  • В VS Code выберите zsh в настройках терминала

Проблема 2: Не отображаются иконки и emoji

Причина: Отсутствует поддержка UTF-8 или нужен специальный шрифт

Решение:

# Проверьте локаль
echo $LC_ALL $LANG

# Установите UTF-8 локаль
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8

# Добавьте эти строки в .zshrc

Для терминала установите Nerd Font (например, Fira Code Nerd Font, Hack Nerd Font).

Проблема 3: eza или bat не работают

Причина: Пакеты недоступны в репозитории или не установлены

Решение:

  • Конфигурация уже содержит fallback на стандартные утилиты
  • Можно установить вручную из GitHub releases
  • Или просто использовать стандартные ls и cat — они тоже будут работать

Проблема 4: Медленная загрузка shell

Причина: Слишком много плагинов или тяжёлые операции в .zshrc

Решение:

  • Измерьте время загрузки: time zsh -i -c exit
  • Отключите ненужные плагины в массиве plugins=()
  • Используйте ленивую загрузку для редко используемых инструментов

Проблема 5: Автодополнения не работают

Причина: Плагин zsh-autosuggestions не загружен или конфликт

Решение:

# Проверьте наличие плагина
ls ~/.oh-my-zsh/custom/plugins/zsh-autosuggestions

# Убедитесь, что он в списке plugins=() в .zshrc
grep zsh-autosuggestions ~/.zshrc

# Перезагрузите конфигурацию
source ~/.zshrc

Обновление компонентов

Обновление Oh-My-Zsh

Oh-My-Zsh имеет встроенную команду обновления:

omz update

Или вручную:

cd ~/.oh-my-zsh
git pull origin master

Обновление плагинов

cd ~/.oh-my-zsh/custom/plugins/zsh-autosuggestions
git pull

cd ~/.oh-my-zsh/custom/plugins/zsh-syntax-highlighting
git pull

cd ~/.oh-my-zsh/custom/plugins/zsh-history-enquirer
git pull

cd ~/.oh-my-zsh/custom/plugins/jovial
git pull

# Обновляем симлинк темы (если изменилась)
ln -sf ~/.oh-my-zsh/custom/plugins/jovial/jovial.zsh-theme \
       ~/.oh-my-zsh/custom/themes/jovial.zsh-theme

Удаление (откат к bash)

Если решите вернуться к bash:

# Вернуть bash как shell по умолчанию
chsh -s /bin/bash

# Удалить Oh-My-Zsh
rm -rf ~/.oh-my-zsh

# Удалить конфигурацию (сохраните бэкап если нужно)
rm ~/.zshrc

# Восстановить старую конфигурацию
cp ~/.zshrc.backup ~/.zshrc

# Удалить пакеты (опционально)
sudo apt remove --purge zsh eza bat autojump
sudo apt autoremove

Дополнительные настройки

История команд

Добавьте в .zshrc для увеличения размера истории:

HISTFILE=~/.zsh_history
HISTSIZE=10000
SAVEHIST=10000
setopt SHARE_HISTORY          # Общая история между сессиями
setopt HIST_IGNORE_DUPS       # Игнорировать дубликаты
setopt HIST_FIND_NO_DUPS      # Не показывать дубликаты при поиске

Полезные алиасы

# Быстрая навигация
alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'

# Git алиасы
alias gs='git status'
alias ga='git add'
alias gc='git commit'
alias gp='git push'
alias gl='git log --oneline --graph'

# Системные
alias update='sudo apt update && sudo apt upgrade -y'
alias ports='netstat -tulanp'
alias meminfo='free -m -l -t'
alias psgrep='ps aux | grep -v grep | grep -i -e VSZ -e'

# Docker
alias dps='docker ps'
alias dimg='docker images'
alias dlog='docker logs -f'

Включение case-insensitive автодополнений

# Добавьте в .zshrc
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Za-z}'

Заключение

Теперь у вас настроен современный, красивый и функциональный терминал с:

✅ Умными автодополнениями на основе истории
✅ Подсветкой синтаксиса в реальном времени
✅ Красивым промптом с контекстной информацией
✅ Современными утилитами для работы с файлами
✅ Гибкой системой плагинов и тем

Этот setup значительно повысит вашу продуктивность при работе в командной строке и сделает её более приятной визуально.

Полезные ссылки: