Настройка красивого терминала Unix с оболочкой Zsh

1
1391
views

Перевод статьи «Configure a beautiful terminal on Unix with Zsh», автор – Deepu K Sasidharan. Перевод опубликован на сайте hexx.in.ua.

Терминал с оболочкой zsh

На протяжении довольного долгого времени я был пользователем Windows, причем совершенно довольным. Но я – разработчик, и в Windows мне не хватало многих вещей. Основная из них – приятная работа с терминалом. Я не фанат закрытой экосистемы Apple, поэтому для меня логичным выбором стал Linux, на который я и перешел почти 3 года назад. Начал я с Ubuntu, а потом выбрал Fedora, и теперь это моя основная операционная система. О моих настройках машины и системы можно почитать здесь.

Я разработчик-senior и лидер open source сообщества, я провожу много времени, работая с терминалом. А если работа с терминалом приятная, это сразу делает вас счастливее и продуктивнее. Дефолтный bash-терминал годится для новичков, но если вы хотите по-настоящему мощный терминал, вам нужно что-то большее, чем bash.

Давайте посмотрим, как можно настроить терминал для продуктивной работы. Я расскажу о настройках, который у меня стоят на моей машине с Fedora. Но то же самое можно воспроизвести в любом дистрибутиве Linux, BSD или на Mac. Надо только найти соответствующие инструкции по установке инструментов.

Итак, список инструментов.

Zsh

Zsh – одна из наиболее полнофункциональных командных оболочек для Unix. Она работает в Linux, Mac, WSL и BSD. Есть альтернативные варианты с похожим функционалом, например Fish, но лично мне нравится Zsh.

1. Проверьте, не установлена ли у вас Zsh. Для этого запустите в терминале команду zsh –version. Если ничего не найдено, установите оболочку, используя свой менеджер пакетов.

  • Fedora: sudo dnf install zsh
  • Mac: brew install zsh zsh-completions
  • RHEL / CentOS: sudo yum update && sudo yum -y install zsh
  • Ubuntu / Debian: sudo apt install zsh
  • Инструкции для других платформ можно найти по ссылке.

2. Теперь сделайте Zsh вашей дефолтной оболочкой, запустив chsh -s $(which zsh).

3. Выйдите из системы и войдите заново (log out / log in), чтобы в дальнейшем использовать вашу новую дефолтную оболочку.

Проверьте, успешно ли прошла смена оболочки, выполнив команду echo $SHELL. Ожидаемый результат – /bin/zsh или что-то подобное.

5. Протестируйте еще раз, проверив версию оболочки: $SHELL --version. Ожидаемый результат – нечто вроде zsh 5.6.2.

Примечание. Если вы установили Zsh впервые, оболочка предложит сделать определенные настройки. Вы можете проигнорировать это предложение, нажав q, поскольку дальше мы все равно займемся настройками.

Oh-My-Zsh

Oh-My-Zsh дает оболочке Zsh суперсилу. Это фреймворк для управления настройками Zsh. В нем есть плагины и темы для Zsh (много).

С Github-страницы Oh-My-Zsh:

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

Просто установите этот фреймворк. Поверьте, он вам нужен 🙂

sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

Эмулятор терминала

При желании вы можете использовать эмулятор терминала с управлением окнами и панелями.

Для Linux я бы посоветовал Tilix. Я пользуюсь им три года, и могу сказать, что он просто великолепен.

Для Mac можно выбрать iTerm2, он очень популярен.

Если хотите что-то более легкое для своего терминала на Linux, BSD и Mac, можно остановиться на tmux.

Настройка Zsh

Переходим к наиболее интересной части. Давайте сделаем наш терминал звездой.

Установите плагины

Сначала давайте установим несколько дополнительных плагинов, которые не входят в Oh-My-Zsh.

zsh-autosuggestions

Добавляет автозаполнения для shell-команд.

Для установки запустите

git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom
zsh-syntax-highlighting

Подсветка синтаксиса в оболочке.

Для установки запустите

git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins
autojump

Умнее система навигации по директориям. Инструкции по установке для вашей операционной системы можно найти здесь.

Теперь давайте внесем определенные настройки в конфигурационный файл ~/.zshrc. Здесь вы найдете мой файл .zshrc. Ваш может отличаться.

Добавьте экспорты

Начнем с нескольких.

export TERM="xterm-256color" # This sets up colors properly
 
# set shell
export SHELL=/usr/bin/zsh
 
# If you come from bash you might have to change your $PATH.
export NODE_PATH=$NODE_PATH:$HOME/.npm-global/lib/node_modules
export JAVA_HOME=/usr/java/latest
export PATH=$JAVA_HOME/bin:~/.npm-global/bin:$HOME/bin:/usr/local/bin:$PATH
 
# Add exports from your profile
source ~/.profile
# Path to your oh-my-zsh installation.
export ZSH=$HOME/.oh-my-zsh

Настройка Zsh

Теперь давайте внесем некоторые настройки, специфичные для Zsh.

DISABLE_MAGIC_FUNCTIONS=true
ZSH_AUTOSUGGEST_MANUAL_REBIND=1
COMPLETION_WAITING_DOTS=true
DISABLE_UNTRACKED_FILES_DIRTY=true

Тема Zsh

Давайте выберем хорошую тему. Я пользуюсь powerlevel10k, она быстрая и хорошо выглядит. Вы можете оставить дефолтную тему или любую из списка. Если вам нравится моя тема, обратите внимание на советы Романа Перепелицы.

Для установления темы запустите

git clone https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/themes

Установите Powerline font. Я пользуюсь Adobe Source Code Pro.

Добавьте следующие конфигурации в файл ~/.zshrc

# Set name of the theme to load. Optionally, if you set this to "random"
# it'll load a random theme each time that oh-my-zsh is loaded.
# See https://github.com/robbyrussell/oh-my-zsh/wiki/Themes
ZSH_THEME="powerlevel10k/powerlevel10k"
 
############ POWERLEVEL THEME SETTINGS ##############
POWERLEVEL9K_MODE='awesome-fontconfig'
 
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir vcs nvm)
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(disk_usage time)
 
POWERLEVEL9K_PROMPT_ADD_NEWLINE=true
POWERLEVEL9K_PROMPT_ON_NEWLINE=true
POWERLEVEL9K_SHOW_RULER=true
POWERLEVEL9K_RULER_CHAR='─'
POWERLEVEL9K_RULER_BACKGROUND=none
POWERLEVEL9K_RULER_FOREGROUND=237
 
POWERLEVEL9K_LEFT_SEGMENT_END_SEPARATOR=
POWERLEVEL9K_LEFT_SEGMENT_SEPARATOR=
POWERLEVEL9K_LEFT_SUBSEGMENT_SEPARATOR=' '
POWERLEVEL9K_RIGHT_SEGMENT_END_SEPARATOR=
POWERLEVEL9K_RIGHT_SEGMENT_SEPARATOR=
POWERLEVEL9K_RIGHT_SUBSEGMENT_SEPARATOR=
POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS=
 
POWERLEVEL9K_SHORTEN_DIR_LENGTH=2
POWERLEVEL9K_SHORTEN_STRATEGY="truncate_middle"
 
POWERLEVEL9K_DIR_SHOW_WRITABLE=true
 
POWERLEVEL9K_DISK_USAGE_NORMAL_BACKGROUND=none
POWERLEVEL9K_DISK_USAGE_WARNING_BACKGROUND=magenta
POWERLEVEL9K_DISK_USAGE_CRITICAL_BACKGROUND=red
POWERLEVEL9K_TIME_BACKGROUND=none
POWERLEVEL9K_TIME_FOREGROUND=white
 
POWERLEVEL9K_DIR_HOME_BACKGROUND=none
POWERLEVEL9K_DIR_HOME_SUBFOLDER_BACKGROUND=none
POWERLEVEL9K_DIR_ETC_BACKGROUND=none
POWERLEVEL9K_DIR_DEFAULT_BACKGROUND=none
POWERLEVEL9K_DIR_NOT_WRITABLE_BACKGROUND=none
 
POWERLEVEL9K_DIR_HOME_FOREGROUND=blue
POWERLEVEL9K_DIR_HOME_SUBFOLDER_FOREGROUND=blue
POWERLEVEL9K_DIR_ETC_FOREGROUND=blue
POWERLEVEL9K_DIR_DEFAULT_FOREGROUND=blue
POWERLEVEL9K_DIR_NOT_WRITABLE_FOREGROUND=red
 
POWERLEVEL9K_OS_ICON_BACKGROUND="white"
POWERLEVEL9K_OS_ICON_FOREGROUND="blue"
 
POWERLEVEL9K_VCS_GIT_ICON='%fon %F{040}\uf1d3 '
POWERLEVEL9K_VCS_GIT_GITHUB_ICON='%fon %F{040}\uf09b '
POWERLEVEL9K_VCS_GIT_BITBUCKET_ICON='%fon %F{040}\uf171 '
POWERLEVEL9K_VCS_GIT_GIT_GITLAB_ICON='%fon %F{040}\uf296 '
 
POWERLEVEL9K_VCS_CLEAN_BACKGROUND=none
POWERLEVEL9K_VCS_UNTRACKED_BACKGROUND=none
POWERLEVEL9K_VCS_MODIFIED_BACKGROUND=none
POWERLEVEL9K_VCS_LOADING_BACKGROUND=none
POWERLEVEL9K_VCS_CLEAN_FOREGROUND="040"
POWERLEVEL9K_VCS_UNTRACKED_FOREGROUND="red"
POWERLEVEL9K_VCS_MODIFIED_FOREGROUND="yellow"
POWERLEVEL9K_VCS_LOADING_FOREGROUND="grey"
 
POWERLEVEL9K_VCS_UNTRACKED_ICON=$'%{\b?%}'
POWERLEVEL9K_VCS_UNSTAGED_ICON=$'%{\b!%}'
POWERLEVEL9K_VCS_STAGED_ICON=$'%{\b+%}'
 
POWERLEVEL9K_DIR_NOT_WRITABLE_VISUAL_IDENTIFIER_COLOR=red
POWERLEVEL9K_LOCK_ICON=$'\uf023'
 
POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX=''
local p='%F{ %(?.green.red)}${${${KEYMAP:-0}:#vicmd}:+❯}${${$((!${#${KEYMAP:-0}:#vicmd})):#0}:+❮}%f '
POWERLEVEL9K_MULTILINE_LAST_PROMPT_PREFIX="$p"
 
POWERLEVEL9K_NVM_BACKGROUND=none
POWERLEVEL9K_NVM_FOREGROUND=green
POWERLEVEL9K_NODE_ICON='%fvia %F{green}⬢'
 
############ END- POWERLEVEL THEME SETTINGS ##############

Включите плагины

Мы можем завершить настройку, включив плагины и некоторые опции.

plugins=(zsh-autosuggestions git docker docker-compose autojump zsh-syntax-highlighting dnf npm)
 
source $ZSH/oh-my-zsh.sh

Все готово. Открывайте новую сессию терминала и наслаждайтесь.

Возможные проблемы и их решение

Если вы используете эмулятор терминала Tilix, вам может понадобиться еще кое-что. Добавьте это в файл ~/.zshrc

if [[ $TILIX_ID ]]; then
        source /etc/profile.d/vte.sh
fi

Если вы получаете сообщения об ошибках от плагина zsh-completion, можно добавить вот это в начале вашего файла ~/.zshrc

# workaround as per https://superuser.com/questions/1222867/zsh-completion-functions-broken
FPATH=$HOME/.oh-my-zsh/plugins/git:$HOME/.oh-my-zsh/functions:$HOME/.oh-my-zsh/completions:/usr/share/zsh/site-functions:/usr/share/zsh/$ZSH_VERSION/functions
 
export FPATH

Если вы получите ошибку от Oh-My-Zsh, где сказано [oh-my-zsh] Insecure completion-dependent directories detected, установите ZSH_DISABLE_COMPFIX=true непосредственно перед строкой source $ZSH/oh-my-zsh.sh в вашем файле ~/.zshrc и перезагрузите сессию или запустите exec zsh.

Докеризованная игровая площадка

Если у вас установлен Docker, вы можете использовать этот сниппет, чтобы попробовать настройки в песочнице, ничего не устанавливая и не касаясь текущих настроек.

docker run -e LANG=C.UTF-8 -e LC_ALL=C.UTF-8 -e TERM=$TERM -it --rm ubuntu bash -uexc '
  apt update && apt install -y git curl zsh autojump && cd /root
  sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" --skip-chsh --unattended
  git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
  git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
  git clone https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/themes/powerlevel10k
  curl -fsSLO http://bit.ly/Spaceship10kTheme
  echo "source ~/Spaceship10kTheme" >~/.zshrc
  exec zsh'

Совет для пользователей VSCode

Если вы, как и я, пользуетесь VSCode, можно кое-что сделать, чтобы интегрированный терминал в редакторе был таким же, как в системе.

  • Загрузите и установите patched font.
  • В Linux запустите fc-cache -f -v для обновления кэша шрифтов.
  • В VSCode откройте Preferences → Settings и нажмите на иконку {}, чтобы открыть JSON. установите там следующие правила:
"terminal.integrated.shell.linux": "/usr/bin/zsh",
"terminal.integrated.fontFamily": "'SauceCodePro Nerd Font Mono','Source Code Pro'",
"terminal.integrated.rightClickCopyPaste": true,
"terminal.integrated.fontSize": 14,
"terminal.integrated.cursorStyle": "underline",
"terminal.integrated.cursorBlinking": true

Если у вас Mac, замените linux на osx.

Надеюсь, вам понравится результат.

1 КОММЕНТАРИЙ

  1. Чёт, как-то не особа получилось.

    zsh-autosuggestions не устанавливается на ubuntu 18, я так понял есть только на 19 версию и на 12, 14
    Ну и два плагина не получается поставить, говорит, что каталог plugins не пустой.

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here