Zsh (Русский)
Zsh является мощной современной оболочкой, которая работает как в интерактивном режиме, так и в качестве интерпретатора языка сценариев. Он совместим с bash (не по умолчанию, только в режиме emulate sh
), но имеет преимущества, такие как улучшенное завершение и подстановка.
Еще больше причин, по которым стоит использовать Zsh, перечислено в Zsh FAQ EN.
Установка
Перед установкой вы можете посмотреть, какая оболочка используется в данный момент:
$ echo $SHELL
Установите пакет zsh. Чтобы значительно расширить возможности автодополнения команд, установите также пакет zsh-completions.
Первоначальная настройка
Убедитесь, что Zsh был установлен правильно, выполнив следующую команду в терминале:
$ zsh
После этого вы должны увидеть скрипт zsh-newuser-install, который проведет вас через некоторые основные настройки. Если вы хотите пропустить первичную настройку, нажмите q
. Если скрипт не запустился, вы можете вызвать его вручную:
$ autoload -Uz zsh-newuser-install $ zsh-newuser-install -f
Установка Zsh в качестве оболочки по умолчанию
Вы можете изменить оболочку по умолчанию на /usr/bin/zsh
.
Смотрите раздел Командная оболочка#Выбор оболочки по умолчанию.
~/.bashrc
в ~/.zshrc
(например, приглашение командной строки и псевдонимы), а также из ~/.bash_profile
в ~/.zprofile
(например, код, который запускает оконную систему X).Файлы запуска/завершения
- Если
$ZDOTDIR
не определена, используется$HOME
по умолчанию. - Если опция
RCS
удаляется в одном из файлов, никакие файлы конфигурации больше не будут прочитаны после этого файла. - Если опция
GLOBAL_RCS
удаляется в одном из файлов, никакие глобальные файлы конфигурации (/etc/zsh/*
) не будут прочитаны после этого файла.
При запуске Zsh по умолчанию он будет загружать следующие файлы в этом порядке:
-
/etc/zsh/zshenv
— используется для установки переменных окружения для всех пользователей; он не должен содержать команд, которые производят вывод или предполагают, что shell подключен к TTY. Если файл существует, он всегда будет прочитан, это нельзя переопределить. -
$ZDOTDIR/.zshenv
— используется для установки переменных окружения текущего пользователя; он не должен содержать команд, которые производят вывод или предполагают, что shell подключен к TTY. Если файл существует, он всегда будет прочитан. -
/etc/zsh/zprofile
— используется для выполнения команд для всех пользователей, будет прочитан при запуске оболочки входа. Обратите внимание, что в Arch Linux по умолчанию он содержит одну строку, считывающую/etc/profile
.-
/etc/profile
— этот файл должен быть прочитан всеми POSIX sh-совместимыми оболочками при входе в систему: он устанавливает$PATH
и другие переменные окружения, а также специфичные для приложения (/etc/profile.d/*.sh
) настройки при входе в систему.
-
-
$ZDOTDIR/.zprofile
— используется для выполнения команд текущего пользователя, будет прочитан при запуске оболочки входа. Обычно используется для автозапуска графического сеанса или установки переменных окружения для сеанса. -
/etc/zsh/zshrc
— используется для настройки интерактивной конфигурации оболочки и выполнения команд для всех пользователей, будет прочитан при запуске интерактивной оболочки. -
$ZDOTDIR/.zshrc
— используется для настройки интерактивной конфигурации и выполнения команд текущего пользователя, будет прочитан при запуске интерактивной оболочки. -
/etc/zsh/zlogin
— используется для выполнения команд для всех пользователей при завершении прогресса инициализации, будет прочитан при запуске оболочки входа. -
$ZDOTDIR/.zlogin
— используется для выполнения команд текущего пользователя при завершении прогресса инициализации, будет вызван при запуске оболочки входа. Не следует использовать для автозапуска графического сеанса, так как в этот момент сеанс может содержать конфигурацию, предназначенную только для интерактивной оболочки. -
$ZDOTDIR/.zlogout
— используется для выполнения команд текущего пользователя при завершении работы оболочки входа. -
/etc/zsh/zlogout
— используется для выполнения команд для всех пользователей при завершении работы оболочки входа.
Смотрите также графическое представление[устаревшая ссылка 2024-10-12 ⓘ].
$HOME/.profile
не относится к файлам запуска Zsh и не используется, если Zsh не запускается как оболочка входа sh
или ksh
. Более подробную информацию о режимах совместимости sh и ksh смотрите в zsh(1) § COMPATIBILITY./etc/zsh/zprofile
, так как это нарушит интеграцию с пакетами, которые устанавливают свои скрипты в /etc/profile.d
.Настройка Zsh
Хотя Zsh может использоваться “из коробки”, он настроен не так, как хотело бы большинство пользователей. Из-за наличия огромных возможностей настройки, доступных в Zsh, этот процесс может оказаться сложным и трудоемким. Для автоматической настройки можно использовать #Сторонние расширения.
Простой .zshrc
Ниже приведён пример файла настроек, который обеспечивает достойный набор опций по умолчанию, а также предоставляет примеры многих вариантов настройки Zsh. Для того, чтобы использовать этот пример, сохраните его в виде файла с именем .zshrc
.
source ~/.zshrc
Вот простой .zshrc
:
~/.zshrc
autoload -Uz compinit promptinit compinit promptinit # Эта настройка установит тему walters для приглашения командной строки prompt walters
Подробности о темах приглашений командной строки описаны в разделе #Темы строк приглашений.
Настройка переменной $PATH
Zsh связывает переменную PATH
с массивом path
. Это позволяет вам менять PATH
, просто изменяя массив path
. Подробности смотрите в руководстве пользователя Z-Shell.
Чтобы добавить ~/.local/bin/
в PATH
:
~/.zshenv
typeset -U path PATH path=(~/.local/bin $path) export PATH
Автозавершение команд
Возможно, наиболее убедительной стороной Zsh является его передовые возможности автозавершения. Включите автозавершение в .zshrc
. Добавив следующую строку в ваш ~/.zshrc
:
~/.zshrc
autoload -Uz compinit compinit
Настройки выше включают в себя также автодополнение хостов ssh/scp/sftp, но для того, чтобы эта функция работала, пользователи не должны включать хеширование имён SSH-хостов в ~/.ssh/known_hosts
(опция HashKnownHosts
).
Для автодополнения с помощью меню, управляемом клавишами-стрелками, добавьте следующую строку:
~/.zshrc
zstyle ':completion:*' menu select
Для активации меню нажмите Tab
дважды.
Чтобы автодополнение для привилегированных команд выполнялось в привилегированном окружении (например, если вы вводите команду через sudo, то скрипты автодополнения тоже будут запущены через sudo), добавьте:
~/.zshrc
zstyle ':completion::complete:*' gain-privileges 1
Назначение клавиш
Zsh не использует Readline, вместо этого он использует свой собственный и более мощный ZLE. Т.е. не читает /etc/inputrc
или ~/.inputrc
.
Введение в настройку ZLE: A closer look at the zsh line editor and creating custom widgets.
ZLE имеет режимы Emacs и vi. По умолчанию он проверяет переменные окружения VISUAL
и EDITOR
: если одна из них содержит vi
, то будет использоваться режим vi; в противном случае по умолчанию будет Emacs. Переключить режим можно с помощью команд bindkey -e
или bindkey -v
для режима Emacs или режима vi соответственно. Задержка при нажатии клавиши Esc в режиме vi по умолчанию составляет 0,4 с, но её можно сделать короче (0,05 с) через export KEYTIMEOUT=5
.
Сочетания клавиш назначаются путём сопоставления escape-последовательности, соответствующей нажатию клавиши, виджету ZLE. Доступные виджеты с описанием их действий и привязок по умолчанию перечислены в zshzle(1) § STANDARD WIDGETS и zshcontrib(1) § ZLE FUNCTIONS.
Смотрите также zshwiki: bindkeys.
Рекомендуемый способ установки сочетаний клавиш в Zsh — чтение поддерживаемых escape-последовательностей из terminfo(5). Например[1]:
~/.zshrc
# Создание хэш-таблицы, совместимой с zkbd. # Информацию о всех доступных клавишах можно узнать в man 5 terminfo typeset -g -A key key[Home]="${terminfo[khome]}" key[End]="${terminfo[kend]}" key[Insert]="${terminfo[kich1]}" key[Backspace]="${terminfo[kbs]}" key[Delete]="${terminfo[kdch1]}" key[Up]="${terminfo[kcuu1]}" key[Down]="${terminfo[kcud1]}" key[Left]="${terminfo[kcub1]}" key[Right]="${terminfo[kcuf1]}" key[PageUp]="${terminfo[kpp]}" key[PageDown]="${terminfo[knp]}" key[Shift-Tab]="${terminfo[kcbt]}" # Назначение действий поддерживаемым клавишам [[ -n "${key[Home]}" ]] && bindkey -- "${key[Home]}" beginning-of-line [[ -n "${key[End]}" ]] && bindkey -- "${key[End]}" end-of-line [[ -n "${key[Insert]}" ]] && bindkey -- "${key[Insert]}" overwrite-mode [[ -n "${key[Backspace]}" ]] && bindkey -- "${key[Backspace]}" backward-delete-char [[ -n "${key[Delete]}" ]] && bindkey -- "${key[Delete]}" delete-char [[ -n "${key[Up]}" ]] && bindkey -- "${key[Up]}" up-line-or-history [[ -n "${key[Down]}" ]] && bindkey -- "${key[Down]}" down-line-or-history [[ -n "${key[Left]}" ]] && bindkey -- "${key[Left]}" backward-char [[ -n "${key[Right]}" ]] && bindkey -- "${key[Right]}" forward-char [[ -n "${key[PageUp]}" ]] && bindkey -- "${key[PageUp]}" beginning-of-buffer-or-history [[ -n "${key[PageDown]}" ]] && bindkey -- "${key[PageDown]}" end-of-buffer-or-history [[ -n "${key[Shift-Tab]}" ]] && bindkey -- "${key[Shift-Tab]}" reverse-menu-complete # Наконец, нужно убедиться, что терминал находится в application mode, когда # zle активен. Только в этом случае значения из $terminfo будут действительны. if (( ${+terminfo[smkx]} && ${+terminfo[rmkx]} )); then autoload -Uz add-zle-hook-widget function zle_application_mode_start { echoti smkx } function zle_application_mode_stop { echoti rmkx } add-zle-hook-widget -Uz zle-line-init zle_application_mode_start add-zle-hook-widget -Uz zle-line-finish zle_application_mode_stop fi
Поиск по истории
Сперва создайте хэш-таблицу key
и переведите ZLE в application mode, как описано в разделе #Назначение клавиш.
Добавьте эти строки в .zshrc
~/.zshrc
autoload -Uz up-line-or-beginning-search down-line-or-beginning-search zle -N up-line-or-beginning-search zle -N down-line-or-beginning-search [[ -n "${key[Up]}" ]] && bindkey -- "${key[Up]}" up-line-or-beginning-search [[ -n "${key[Down]}" ]] && bindkey -- "${key[Down]}" down-line-or-beginning-search
После этого стрелки вверх и вниз будут выводить только те команды из истории, которые начинаются с символов, находящихся перед текущим положением курсора.
Модификаторы Shift, Alt, Ctrl и Meta
В xterm-совместимых терминалах можно использовать расширенные определения клавиш из user_caps(5). Это комбинации клавиш Shift
, Alt
, Ctrl
и Meta
вместе Up
, Down
, Left
, Right
, PageUp
, PageDown
, Home
, End
или Del
. Список рекомендуемых названий клавиш-модификаторов и комбинаций клавиш смотрите в zkbd source.
Например, чтобы Ctrl+Left
выполнял переход к началу предыдущего слова, а Ctrl+Right
— к началу следующего слова:
~/.zshrc
key[Control-Left]="${terminfo[kLFT5]}" key[Control-Right]="${terminfo[kRIT5]}" [[ -n "${key[Control-Left]}" ]] && bindkey -- "${key[Control-Left]}" backward-word [[ -n "${key[Control-Right]}" ]] && bindkey -- "${key[Control-Right]}" forward-word
Приглашения
Zsh позволяет использовать темы для строк приглашений командной строки или, если не устраивают темы (или хочется расширить их возможности), создать собственную строку приглашения.
Темы строк приглашений
Темы — это быстрый и лёгкий способ создать цветное приглашение в Zsh. Информация о темах и об их создании есть в zshcontrib(1) § PROMPT THEMES.
Для использования темы убедитесь, что prompt установлен в autoload в файле .zshrc
. Это может быть сделано путём добавления этих строк:
~/.zshrc
autoload -Uz promptinit promptinit
Посмотреть список доступных цветных тем можно с помощью команды:
$ prompt -l
Для просмотра всех доступных тем (с примерами), используйте команду:
$ prompt -p
Например, чтобы использовать цветовую схему bigfade
, введите:
$ prompt bigfade
Чтобы использовать цветовую схему с заданным цветом (если доступен в теме), введите:
$ prompt elite2 blue
Установка тем вручную
Существует возможность установки тем вручную, без использования внешних инструментов. Для локальной установки сначала создайте каталог и добавьте его в массив fpath
, например:
$ mkdir ~/.zprompts $ fpath=("$HOME/.zprompts" "$fpath[@]")
Затем в этом каталоге создайте символическую ссылку на файл темы:
$ ln -s mytheme.zsh ~/.zprompts/prompt_mytheme_setup
Или если вы хотите установить тему глобально:
# ln -s mytheme.zsh /usr/share/zsh/functions/Prompts/prompt_mytheme_setup
После этого тему можно будет активировать:
$ prompt mytheme
Если сработает, можно записать это в .zshrc
.
Добавление темы без создания отдельного файла
Помимо создания темы в отдельном файле, можно добавить тему внутри другого файла (например, в вашем .zshrc
):
~/.zshrc
# Загрузка promptinit autoload -Uz promptinit && promptinit # Создание темы prompt_mytheme_setup() { PS1="%~%# " } # Добавление темы в promptsys prompt_themes+=( mytheme ) # Загрузка темы prompt mytheme
Настройка строки приглашения
В дополнение к приглашению слева PS1
(PROMPT
, prompt
), которое используется в большинстве командных оболочек, Zsh также поддерживает приглашение справа RPS1
(RPROMPT
). Эти две переменные используются для установки произвольного приглашения командной строки.
Другие приглашения специального назначения, например PS2
(PROMPT2
), PS3
(PROMPT3
), PS4
(PROMPT4
), RPS1
(RPROMPT
), RPS2
(RPROMPT2
) и SPROMPT
, описаны в zshparam(1) § PARAMETERS USED BY THE SHELL.
Приглашения командной строки поддерживают специальные управляющие последовательности (escapes), которые описаны в zshmisc(1) § EXPANSION OF PROMPT SEQUENCES. Некоторые примеры:
%n - Имя пользователя %m - Имя компьютера (до первой точки) %M - Полное имя компьютера %~ - Путь к текущему каталогу относительно домашнего %d - Полный путь к текущей директории ($PWD) %T - Время в формате HH:MM %* - Время в формате HH:MM:SS %D - Дата в формате YY-MM-DD %B, %b - Начало и конец выделения жирным
Цвета
Zsh устанавливает цвета иначе, чем Bash; вам не нужно возиться ANSI-кодами или с terminfo(5). Zsh предоставляет удобные управляющие последовательности для установки основного и фонового цветов и других визуальных эффектов; их список и описание приведены в zshmisc(1) § Visual effects.
Цвет может быть задан десятичным целым числом, названием одного из восьми наиболее широко поддерживаемых цветов или символом #, за которым следует триплет RGB в шестнадцатеричном формате. Подробнее в описании параметра fg=colour в zshzle(1) § CHARACTER HIGHLIGHTING.
Большинство терминалов поддерживают следующие цвета по названиям:
Название | Цвет |
---|---|
black |
0
|
red |
1
|
green |
2
|
yellow |
3
|
blue |
4
|
magenta |
5
|
cyan |
6
|
white |
7
|
Для терминалов, поддерживающих 256 цветов, можно использовать номера 0–255: смотрите xterm-256color chart.
При правильно заданной переменной окружения TERM
поддерживаемое терминалом максимальное количество цветов можно узнать из базы данных terminfo(5) с помощью команды echoti colors
. Для 24-битных цветов также проверьте переменную окружения COLORTERM
командой print $COLORTERM
. Если она выведет 24bit
или truecolor
, то ваш терминал поддерживает 16777216 (224) цветов, даже если terminfo показывает меньшее число.
- Цвета 0–15 могут быть разными в зависимости от используемого эмулятора терминала и пользовательских настроек.
- Многие эмуляторы терминала отображают жирный текст более ярким цветом.
- Протестировать управляющие последовательности можно командой
print -P "строка с escape-последовательностями"
, например:$ print -P '%B%F{red}цв%F{green}ет%F{blue}а!%f%b'
- Если вы используете 24-битные цвета, может быть полезно загрузить модуль
zsh/nearcolor
для работы в терминалах, которые их не поддерживают. Например:[[ "$COLORTERM" == (24bit|truecolor) || "${terminfo[colors]}" -eq '16777216' ]] || zmodload zsh/nearcolor
Смотрите zshmodules(1) § THE ZSH/NEARCOLOR MODULE для более подробной информации об этом модуле.
Пример
Пример простого приглашения командной строки без цветов:
PROMPT='%n@%m %~ %# '
Оно будет отображаться так:
Пример использования двухстороннего приглашения с цветами:
PROMPT='%F{green}%n%f@%F{magenta}%m%f %F{blue}%B%~%b%f %# ' RPROMPT='[%F{yellow}%?%f]'
А вот как оно будет отображаться:
Для использования цветов из диапазона 16-255 и 24-битного true color можно использовать число от 0 до 255, присвоенное нужному цвету, и его шестнадцатеричный код цвета соответственно:
PROMPT='%F{2}%n%f@%F{5}%m%f %F{4}%B%~%b%f %# ' RPROMPT='[%F{3}%?%f]'
PROMPT='%F{#c0c0c0}%n%f@%F{#008000}%m%f %F{#800080}%B%~%b%f %# ' RPROMPT='[%F{#0000ff}%?%f]'
Примеры файла .zshrc
- Пакет grml-zsh-config, доступный в официальном репозитории взятый с https://grml.org/zsh содержит zshrc файл, который включает в себя множество настроек для Zshell. Эта настройка используется по умолчанию для ежемесячного ISO релиза.
- Базовая настройка с динамической строкой приглашения (Prompt) и заголовком окна / Hardinfo => https://github.com/MrElendig/dotfiles-alice/blob/master/.zshrc;
- https://github.com/slashbeast/conf-mgmt/blob/master/roles/home_files/files/DOTzshrc - zshrc с несколькими функциями, - смотрите комментарии в файле. Известные особенности: подтверждение выключения, если пользователь запустил poweroff, а также запрос подтверждения на reboot или hibernate, поддержка GIT в Prompt (сделано без vcsinfo), завершение по TAB с меню, вывод текущей выполняемой команды в заголовке окна, и многое другое.
Смотрите также dotfiles#User repositories.
Советы и рекомендации
Автозапуск X при входе в систему
Смотрите xinit (Русский)#Автозапуск X при входе в систему.
Восстановление настроек терминала после аварийного завершения программы
Некоторые программы, меняющие состояние терминала, не восстанавливают его изначальные настройки после нештатного завершения (например, при вылете или получении сигнала SIGINT).
Это обычно решается с помощью reset(1):
$ reset
В следующих подразделах описаны способы решения, не требующие ручного сброса терминала.
Команда ttyctl
С помощью команды ttyctl можно «заморозить» и «разморозить» терминал. Для заморозки интерактивной оболочки при запуске:
~/.zshrc
ttyctl -f
Сброс терминала с помощью управляющих последовательностей
Альтернативный набор символов может испортить работу терминала так, что ttyctl не сможет этого предотвратить.
Простым решением является вывод escape-последовательностей, сбрасывающих терминал, через хук precmd
, чтобы они выполнялись каждый раз перед выводом приглашения. Например, с помощью управляющей последовательности \e[0m\e(B\e)0\017\e[?5l\e7\e[0;0r\e8
:
~/.zshrc
autoload -Uz add-zsh-hook function reset_broken_terminal () { printf '%b' '\e[0m\e(B\e)0\017\e[?5l\e7\e[0;0r\e8' } add-zsh-hook -Uz precmd reset_broken_terminal
Для проверки работоспособности выполните:
$ print '\e(0\e)B'
Запоминание недавних каталогов
Dirstack
Zsh можно настроить, чтобы он помнил DIRSTACKSIZE (последние посещённые каталоги). Это пригодится для более быстрой работы с cd. Вам нужно добавить несколько строк, в файл настройки:
~/.zshrc
autoload -Uz add-zsh-hook DIRSTACKFILE="${XDG_CACHE_HOME:-$HOME/.cache}/zsh/dirs" if [[ -f "$DIRSTACKFILE" ]] && (( ${#dirstack} == 0 )); then dirstack=("${(@f)"$(< "$DIRSTACKFILE")"}") [[ -d "${dirstack[1]}" ]] && cd -- "${dirstack[1]}" fi chpwd_dirstack() { print -l -- "$PWD" "${(u)dirstack[@]}" > "$DIRSTACKFILE" } add-zsh-hook -Uz chpwd chpwd_dirstack DIRSTACKSIZE='20' setopt AUTO_PUSHD PUSHD_SILENT PUSHD_TO_HOME ## Удалить повторяющиеся записи setopt PUSHD_IGNORE_DUPS ## Это Отменяет +/- операторы. setopt PUSHD_MINUS
Теперь используйте
dirs -v
Для вывода стека директорий. Используйте cd -<NUM>
чтобы вернуться к посещённому каталогу. Используйте автозавершение (нажав TAB
) после тире.
cd
, приведёт к конфликту в обоих ссессиях пишущих в тот же файл.cdr
cdr позволяет сменить рабочий каталог на предыдущий из списка, ведущегося автоматически. Все записи хранятся в файлах, которые синхронизируются между сеансами и (по умолчанию) между эмуляторами терминалов в текущем сеансе.
Смотрите zshcontrib(1) § REMEMBERING RECENT DIRECTORIES.
zoxide
zoxide — это более интеллектуальный cd, позволяющий перемещаться в любое место всего за несколько нажатий клавиш. Программа подсчитывает часто используемые каталоги, чтобы угадать, куда вы хотите перейти.
Команда Help
В отличие от bash, в Zsh не предусмотрена встроенная команда help
, вместо неё используется run-help
. По умолчанию run-help
является псевдонимом команды man
, её можно либо выполнить вручную, добавив к команде, либо вызвать для текущей команды с помощью сочетаний клавиш Alt+h
или Esc
h
.
Поскольку по умолчанию это всего лишь псевдоним на man, она будет работать только с внешними командами. Для улучшения функциональности, чтобы она работала со встроенными командами оболочки и другими её возможностями, нужно использовать функцию run-help
. Более подробная информация о run-help
и вспомогательных функциях есть в zshcontrib(1).
Сначала загрузите функцию run-help
, а затем удалите существующий псевдоним run-help
. Для удобства можно сделать help
псевдонимом run-help
. Например, добавьте следующие строки в ваш zshrc
:
autoload -Uz run-help (( ${+aliases[run-help]} )) && unalias run-help alias help=run-help
Вспомогательные функции нужно включить отдельно:
autoload -Uz run-help-git run-help-ip run-help-openssl run-help-p4 run-help-sudo run-help-svk run-help-svn
Теперь, например, команда run-help git commit
будет открывать man-страницу git-commit(1), а не просто git(1).
Постоянный rehash
Как правило, compinit не будет автоматически находить новые исполняемые файлы в $PATH
. Например, после установки нового пакета файлы в каталоге /usr/bin/
не появятся в автодополнении сразу. Для их появления нужно выполнить команду:
$ rehash
Её можно запускать автоматически.[2] Просто добавьте в ваш zshrc
:
~/.zshrc
zstyle ':completion:*' rehash true
Выполнение rehash по необходимости
С помощью хуков можно настроить pacman на запуск rehash
после установки или удаления пакетов, что позволит избежать снижения производительности из-за постоянного запуска rehash
описанным выше способом. Создайте каталоги /etc/pacman.d/hooks
и /var/cache/zsh
, а затем создайте хук:
/etc/pacman.d/hooks/zsh.hook
[Trigger] Operation = Install Operation = Upgrade Operation = Remove Type = Path Target = usr/bin/* [Action] Depends = zsh When = PostTransaction Exec = /usr/bin/install -Dm644 /dev/null /var/cache/zsh/pacman
Он будет обновлять дату изменения файла /var/cache/zsh/pacman
каждый раз при установке, обновлении или удалении пакетов. Теперь нужно заставить Zsh обновить свой кэш команд, когда он устареет. Добавьте в ~/.zshrc
:
~/.zshrc
zshcache_time="$(date +%s%N)" autoload -Uz add-zsh-hook rehash_precmd() { if [[ -a /var/cache/zsh/pacman ]]; then local paccache_time="$(date -r /var/cache/zsh/pacman +%s%N)" if (( zshcache_time < paccache_time )); then rehash zshcache_time="$paccache_time" fi fi } add-zsh-hook -Uz precmd rehash_precmd
Если хук precmd
срабатывает до того, как дата у файла /var/cache/zsh/pacman
обновится, то автодополнение может выдавать устаревшие данные до тех пор, пока не будет запущено новое приглашение. Для этого достаточно выполнить пустую команду, например, нажать enter
.
Выполнение rehash по необходимости с помощью SIGUSR1
Аналогично описанному выше, но хук теперь такой:
/etc/pacman.d/hooks/zsh-rehash.hook
[Trigger] Operation = Install Operation = Upgrade Operation = Remove Type = Path Target = usr/bin/* [Action] Depends = zsh Depends = procps-ng When = PostTransaction Exec = /usr/bin/pkill zsh --signal=USR1
zsh
. Обратите внимание, что по умолчанию SIGUSR1 завершает процесс, поэтому при первой настройке все запущенные экземпляры zsh
у всех пользователей (в том числе оболочки входа) будут завершены, если они не применили описанную ниже настройку.~/.zshrc
TRAPUSR1() { rehash }
Вместо функции можно использовать trap 'rehash' USR1
. Об отличиях между этими двумя способами можно почитать в zshmisc(1) § Trap Functions.
Этот метод будет запускать rehash
во всех экземплярах zsh
сразу, избавляя от необходимости нажимать enter для запуска precmd
.
Назначение клавиши в ncurses
Привяжите приложение ncurses к keystoke, но оно не будет принимать взаимодействие. Используйте переменную BUFFER
, чтобы заставить его работать. Следующий пример позволяет пользователям открывать ncmpcpp, используя Alt+\
:
~/.zshrc
ncmpcppShow() { BUFFER="ncmpcpp" zle accept-line } zle -N ncmpcppShow bindkey '^[\' ncmpcppShow
Этот метод будет содержать всё, что вы ввели в строку перед вызовом приложения
~/.zshrc
ncmpcppShow() { ncmpcpp <$TTY zle redisplay } zle -N ncmpcppShow bindkey '^[\' ncmpcppShow
Горячие клавиши как в файловом менеджере
Могут пригодится настройки клавиш использующиеся в графическом файловом менеджере. Первая комбинация показывает историю каталогов (Alt + Left), вторая позволяет пользователю перейти в родительский каталог (Alt + Up). Они также отображают содержимое каталогов.
~/.zshrc
cdUndoKey() { popd zle reset-prompt print ls zle reset-prompt } cdParentKey() { pushd .. zle reset-prompt print ls zle reset-prompt } zle -N cdParentKey zle -N cdUndoKey bindkey '^[[1;3A' cdParentKey bindkey '^[[1;3D' cdUndoKey
Заголовок xterm
Если эмулятор терминала поддерживает такую возможность, то из Zsh можно задать его заголовок. Это позволяет динамически изменять заголовок для отображения нужной информации о состоянии оболочки, например, показывать имя пользователя и текущий каталог или выполняемую в данный момент команду.
Заголовок xterm задаётся с помощью escape-последовательности OSC \e]2;
\a
или \e]2;
\e\\
. Например:
$ print -n '\e]2;Заголовок моего xterm\a'
установит заголовок
Заголовок моего xterm
Простой способ сделать динамический заголовок — менять его с помощью хуков precmd
и preexec
. Информация о существующих хуках есть в zshmisc(1) § Hook Functions.
С помощью print -P
можно также использовать управляющие последовательности Zsh.
- Печать заголовка может быть разделена на несколько команд, если они идут последовательно.
-
GNU Screen посылает заголовок xterm в hardstatus (
%h
). Если вы хотите использовать string escapes из Screen (например, для цветов), то вам следует установить hardstatus с помощью управляющей последовательности\e_
\e\\
. В противном случае, если в\e]2;
\a
будут string escapes, эмулятор терминала получит искажённое название, так как не сможет интерпретировать их.
- Не используйте опцию
-P
командыprint
при печати переменных, чтобы их содержимое не обрабатывалось как управляющие последовательности. - Используйте parameter expansion flag
q
при выводе переменных, чтобы их содержимое не обрабатывалось как управляющие последовательности.
~/.zshrc
autoload -Uz add-zsh-hook function xterm_title_precmd () { print -Pn -- '\e]2;%n@%m %~\a' [[ "$TERM" == 'screen'* ]] && print -Pn -- '\e_\005{g}%n\005{-}@\005{m}%m\005{-} \005{B}%~\005{-}\e\\' } function xterm_title_preexec () { print -Pn -- '\e]2;%n@%m %~ %# ' && print -n -- "${(q)1}\a" [[ "$TERM" == 'screen'* ]] && { print -Pn -- '\e_\005{g}%n\005{-}@\005{m}%m\005{-} \005{B}%~\005{-} %# ' && print -n -- "${(q)1}\e\\"; } } if [[ "$TERM" == (Eterm*|alacritty*|aterm*|foot*|gnome*|konsole*|kterm*|putty*|rxvt*|screen*|wezterm*|tmux*|xterm*) ]]; then add-zsh-hook -Uz precmd xterm_title_precmd add-zsh-hook -Uz preexec xterm_title_preexec fi
Заголовок вкладки в эмуляторе терминала
Некоторые эмуляторы терминалов и мультиплексоры поддерживают установку заголовка вкладки. Используемые escape-последовательности зависят от терминала:
Терминал | Escape-последовательности | Описание |
---|---|---|
GNU Screen |
\ek \e\\
|
Заголовок окна Screen (%t ).
|
Konsole |
\e]30; \a
|
Заголовок вкладки Konsole. |
Определение окружения
Репозиторий с информацией о том, как определить окружение, в котором работает командная оболочка, в частности: оболочка входа, сеанс Xorg, TTY, сеанс SSH.
Эквивалент /dev/tcp: ztcp
Используйте модуль zsh/net/tcp
:
$ zmodload zsh/net/tcp
Он позволяет устанавливать TCP-соединения:
$ ztcp example.com 80
Подробнее: zshmodules(1) § THE_ZSH/NET/TCP_MODULE и zshtcpsys(1).
Сочетание клавиш для выхода из оболочки при введённой команде
По умолчанию Ctrl+d
не завершает работу оболочки, если в ней что-то введено. Можно исправить это так:
.zshrc
exit_zsh() { exit } zle -N exit_zsh bindkey '^D' exit_zsh
Обработка неизвестных команд с использованием pacman -F
pacman позволяет найти пакет по имени файла, так что можно создать обработчик неизвестных команд, который ищет пакеты, в которых присутствует введённая команда:
~/.zshrc
... function command_not_found_handler { local purple='\e[1;35m' bright='\e[0;1m' green='\e[1;32m' reset='\e[0m' printf 'zsh: command not found: %s\n' "$1" local entries=( ${(f)"$(/usr/bin/pacman -F --machinereadable -- "/usr/bin/$1")"} ) if (( ${#entries[@]} )) then printf "${bright}$1${reset} may be found in the following packages:\n" local pkg for entry in "${entries[@]}" do # (repo package version file) local fields=( ${(0)entry} ) if [[ "$pkg" != "${fields[2]}" ]] then printf "${purple}%s/${bright}%s ${green}%s${reset}\n" "${fields[1]}" "${fields[2]}" "${fields[3]}" fi printf ' /%s\n' "${fields[4]}" pkg="${fields[2]}" done fi return 127 } ...
pacman -Fy
. Смотрите pacman (Русский)#Поиск пакета по названию файла.Вариант, использующий pkgfile: #Обработка неизвестных команд с использованием pkgfile.
Очистка буфера сочетанием клавиш
По умолчанию в большинстве эмуляторов терминала сочетание клавиш, очищающее экран, не очищает backbuffer (ту часть текста, до которой нужно прокрутить вверх, чтобы увидеть её). Решить это можно так:
~/.zshrc
... function clear-screen-and-scrollback() { echoti civis >"$TTY" printf '%b' '\e[H\e[2J' >"$TTY" zle .reset-prompt zle -R printf '%b' '\e[3J' >"$TTY" echoti cnorm >"$TTY" } zle -N clear-screen-and-scrollback bindkey '^L' clear-screen-and-scrollback ...
Сторонние расширения
Фреймворки настроек
- oh-my-posh (пакет oh-my-poshAUR) - Движок приглашений для любой оболочки, позволяющий настроить строку приглашения с помощью функции или переменной.
- oh-my-zsh управляемый сообществом, популярный фреймворк для настройки вашего Zsh. Он поставляется в комплекте с тонной полезных функций, помощников, плагинов, тем.
- Prezto - мгновенно прекрасный Zsh (доступен в prezto-gitAUR) настроенный фреймворк Zsh. Он поставляется с модулями, разумно расширяющих среду интерфейса командной строки (по умолчанию), псевдонимами (алиасами), функциями, атодополнением, и темами Prompt.
- ZIM (пакет zsh-zim-gitAUR) - Фреймворк настроек с молниеносной скоростью и модульными расширениями. Zim очень легко настраивается, имеет богатый набор модулей и возможностей без ущерба для скорости и функциональности.
Менеджеры плагинов
- Antidote (пакет zsh-antidoteAUR) - Полнофункциональная Zsh-реализация старого менеджера плагинов Antibody.
- zinit (ранее «zplugin», пакет zinit-gitAUR) - Гибкий менеджер плагинов Zsh с чистым fpath, отчётами, управлением автодополнением, турбо-режимом REVIVED.
- sheldon (пакет sheldon) - Быстрый, настраиваемый менеджер плагинов оболочки, написанный на Rust.
- Antigen (дступен в antigen-gitAUR) - менеджер плагинов для zsh, вдохновлённый oh-my-zsh и vundle.
- zgen (пакет zgen-gitAUR) - Лёгкий и простой менеджер плагинов для Zsh. Заброшен.
- zplug (пакет zplugAUR) - Менеджер плагинов нового поколения для Zsh. Заброшен.
Подсветка синтаксиса как в Fish
Fish обеспечивает очень мощную подсветку синтаксиса. Для использования в zsh, вы можете установить zsh-syntax-highlighting из официального репозитория и обязательно добавьте в ваш ~/.zshrc
строку:
source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
Также можно добавить zsh-autosuggestions:
~/.zshrc
source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh
Обработка неизвестных команд с использованием pkgfile
В утилиту pkgfile входит Zsh скрипт, содержащий функцию command_not_found_handler
. При вводе неизвестной команды функция автоматически осуществляет поиск в официальных репозиториях.
Для её включения добавьте:
~/.zshrc
source /usr/share/doc/pkgfile/command-not-found.zsh
Вариант, использующий pacman: #Обработка неизвестных команд с использованием pacman -F.
Смотрите также
Рекомендуем обязательно обратится к следующим Русскоязычным статьям, для более полного и лучшего понимания.
Статьи на Английском:
- A User's Guide to ZSH
- The Z Shell Manual (different format available here)
- Zsh FAQ
- zsh-lovers(1) (this is also available as zsh-lovers in offical repository)
- Zsh Wiki
- Gentoo Wiki: Zsh/HOWTO
- Bash2Zsh Reference Card