Перевод статьи «Configure a beautiful terminal on Unix with Zsh», автор – Deepu K Sasidharan. Перевод опубликован на сайте hexx.in.ua.
На протяжении довольного долгого времени я был пользователем 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}/plugins/zsh-autosuggestions
zsh-syntax-highlighting
Подсветка синтаксиса в оболочке.
Для установки запустите
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
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
.
Надеюсь, вам понравится результат.
[customscript]techrocks_custom_after_post_html[/customscript]
[customscript]techrocks_custom_script[/customscript]
Чёт, как-то не особа получилось.
zsh-autosuggestions не устанавливается на ubuntu 18, я так понял есть только на 19 версию и на 12, 14
Ну и два плагина не получается поставить, говорит, что каталог plugins не пустой.
>>>>> zsh-autosuggestions не устанавливается на ubuntu 18<<<<<
В статье ошибка(опечатка) не правильно скопировано, пробуй так:
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
Подробно: https://github.com/zsh-users/zsh-syntax-highlighting
p.s. Оформите правильно заголовки с названиями что бы было видно что они ведут в репозитории Git
Статья скопирована команды не полные, например вместо:
«git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins»
должно быть:
«git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting»
А так будете получать ошибку что есть такая директория.
В строке:
«plugins=(zsh-autosuggestions git docker docker-compose autojump zsh-syntax-highlighting dnf npm)»
должно быть:
«plugins=(git zsh-autosuggestions autojump zsh-syntax-highlighting)
Если у Вас нету Docker , DNF и пакетного менеджера npm.