Алексей Федорчук
На этой странице кот Мануал велел мне поделиться нашим с ним главным dot-файлом для Zsh — ~/.zshrc
, определяющего поведение этого шелла, запущенного в интерактивном режиме — как было сказано в предыдущей части, в большинстве случаев для настройки его достаточно.
Вступление
Представляемый ~/.zshrc
существует с 2001 года, кочуя с машина на машину, из системы в систему, постоянно модернизируюсь в соответствие с изменениями как возможностей Zsh, так и наших в них потребностей. В текущем своём состоянии он обеспечивает все необходимые для нас функции CLI. Хотя, разумеется, не охватывает всех возможностей Zsh.
Данный конфиг может быть использован полностью или фрагментарно всеми заинтересованными лицами. Далее в тексте страницы блоки, заключённые в теги <pre></pre> (то есть выводимые моноширинным шрифтом), пригодны для прямого копирования. А связующие блоки, визуально воспроизводимые шрифтом пропорциональным, могут рассматриваться как комментарии.
Весь конфиг разделён нами на несколько секций, объединяющих группы взаимосвязанных опций. Сделано это исключительно для структурирования материала, и ни в коем случае не обязательно. Как, в общем-то, и порядок строк в конфиге.
Мы с котом отнюдь не призываем к механическому «копипасту» данного конфига, напротив: настоятельно рекомендуем, используя его и аналоги, которые можно найти в Сети, по мере сил и возможности создавать конфиг собственный. Ибо хороший (для конкретного применителя) ~/.zshrc
— это не результат, а процесс, и причём процесс преувлекательный.
Вводная секция
Вводная секция ~/.zshrc
— несколько строк комментариев, сообщающих, что этот конфиг используется только в интерактивных экземплярах Zsh. Он содержит команды для определения псевдонимов, функций, опций и кейбиндингов. А заодно напоминает последовательность считывания конфигов при запуске оболочки:
# zshenv, zprofile, zshrc, zlogin
Здесь же сообщается, что версии этого конфига созданы котом Manual’ом (при участии вашего покорного слуги) для использования, во-первых, в Cintu и наших сборках Neon’а, а во-вторых — в дистрибутиве Antergos. По идее, первый вариант должен работать во всех deb-based системах, второй — в Arch’е и его клонах, а также в произвольных дистрибутивах Linux’а.
Опции истории команда
Определение имени файла истории (по умолчанию ~/.histfile
):
HISTFILE=~/.zhistfile
числа команд, сохраняемых в буфере сеанса, и числа команд сохраняемых в файле истории:
HISTSIZE=2000 SAVEHIST=10000
Опции, определяющие условия сохранения команд в файле истории.
Инкрементное наращивание файла истории:
setopt INC_APPEND_HISTORY
Удаление дубликатов команд:
setopt HIST_IGNORE_ALL_DUPS
Удаление из файла истории пустых строк:
setopt HIST_REDUCE_BLANKS
Удаление строк, начинающихся с пробела:
setopt HIST_IGNORE_SPACE
Определение горячих клавиш (key bindings) доступа к истории команд.
Включение history-substring-search
— поиска в истории по начальной последовательности символов:
bindkey "^[[A" up-line-or-search bindkey "^[[B" down-line-or-search
Примечание: в Ubutnu’идах (и, насколько я знаю, во всех deb-based системах вообще) субстринговый поиск по умолчанию не работает. Проблема решается несколькими способами. В Cintu — путём автоматического создания файла ~/.zshenv
, о содержании которого будет сказано в конце страницы. В Antergos’е (и других дистрибутивах) необходимости в нём нет.
Пролистывание истории клавишами PageUp и PageDown:
bindkey "^[[5~" up-line-or-history bindkey "^[[6~" down-line-or-history
Исправление работы клавиш Home, End, Delete (заменить кодами клавиш своего терминала или текстовой консоли):
bindkey "^[OH" beginning-of-line bindkey "^[OF" end-of-line bindkey "^[[3~" delete-char
Примечание: определение кода клавиши в терминале (консоли) выполняется с помощью комбинации клавиш Control+V [клавиша] или командой
$ cat [Enter] [клавиша]
Переход на «большое» слово вперёд и назад по Control+Right/Left:
bindkey "^[[1;5C" forward-word bindkey "^[[1;5D" backward-word
Удаление от позиции курсора до конца «большого» слова:
bindkey "^[[3;5~" delete-word
Навигация и автодополнение
Отключение поддержки старой системы настройки compctl
:
zstyle ':completion:*' use-compctl false
Включение перехода в каталог без использования команды cd
:
setopt autocd
Включение перехода в указанные подкаталоги без введения полного пути
cdpath=(/home/data/alv.me/ /home/data/media/)
Менюобразный вывод вариантов по клавише Tab:
setopt menucomplete zstyle ':completion:*' menu select=1 _complete _ignored _approximate
Результат после набора, например, символа g
и нажатия клавиши табуляции выглядит таким образом:
Автодополнение псевдонимов:
setopt completealiases
Развёртывание сокращённого пути (типа /h/p/m
) до полного (/home/proj/manuals
):
autoload -Uz compinit compinit
Расширенные подстановки и дополнения:
setopt extendedglob nomatch notify zstyle ':completion:*' completer _expand _complete _ignored _correct _approximate
Отключение чувствительности к регистру:
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
Кеширование команд для автодополнения:
zstyle ':completion:*' use-cache on zstyle ':completion:*' cache-path ~/.zsh/cache
Автоматическое выполнение команды rehash
после установки нового пакета::
zstyle ':completion:*' rehash true
Определение путей к библиотекам функций:
fpath=($fpath ~/.zsh/func)
Включение кеширования для автодополнения аргументов команд управления файлами:
zstyle ':completion::complete:*' use-cache 1
Работает для apt
(deb-based системы) и pacman
(Arch и клоны), для других не проверял.
Определение обычных псевдонимов
Псевдонимы для команд перемещения, копирования и удаления файлов.
Запрос подтверждения на перезапись одноимённых файлов при переименовании или перемещении:
alias mv='mv -i'
Рекурсивное копирование с запросом на перезапись одноимённых файлов при переименовании или перемещении:
alias cp='cp -iR'
Принудительное рекурсивное копирование:
alias cpr='cp -fR'
Удаление файлов в текущем каталоге с подтверждением:
alias rm='rm -i'
И без оного:
alias rmf='rm -f'
Рекурсивное удаление с подтверждением:
alias rmr='rm -R'
Принудительное рекурсивное удаление:
alias rmrf='rm -Rf'
Псевдонимы для опций команды ls
. Выводить каталоги перед файлами:
alias ls='ls -F --group-directories-first'
Вывод в «длинном» формате с «человечьим» размером файлов:
alias ll='ls -lh'
Вывод всех файлов, включая скрытые, текущий и родительский каталоги:
alias la='ls -A'
Вывод всех файлов в «длинном» формате с указанием inode
:
alias li=’ls -ial’
Псевдонимы для опций некоторых часто используемых команд, например, history
:
alias h=history
Вывод команд df
и du
в «человечьем» формате:
alias df='df -h' alias du='du -h'
Так называемый more
-подобный вывод команды less, с указанием полного пути и имени файла:
alias less='less -M'
Что «в натуре» выглядит так:
Закачка файла по ftp с продолжением:
alias wget='wget -c'
Запуск редактора nano
в режиме «мягкого» переноса слов (softwrap
):
alias nano='nano -$'
Вывод числа символов в текстовом файле:
alias wcm='wc -m'
«Суффиксные» псевдонимы
Определяют команды и их опции, которые должны открывать файлы с указанными опциями, например, текстовых файлов — для редактирования в nano
:
alias -s txt='nano'
Просмотр содержимого deb-пакетов (для Cintu и других deb based систем):
alias -s deb='dpkg -c'
Просмотр содержимого пакетов в формате Arch’а:
alias -s pkg='pacman -Qpl'
Просмотр содержимого tar-архивов, сжатых утилитами gzip
и xz
, соответственно:
alias -s gz='tar xzvf' alias -s xz='tar xJvf'
Глобальные псевдонимы
alias -g N='2>/dev/null' alias -g L='|less' alias -g G='|grep' alias -g W='|wc' alias -g H='|head' alias -g T='|tail'
Интеграция с APT
Глобальные псевдонимы для субкоманд утилиты apt
(для Cintu и других deb based систем).
Информация о пакетах (достаточно прав пользователя):
alias -g se='search' alias -g sw='show' alias -g liin='list --installed' alias -g liup='list --upgradeable' alias -g pol='policy'
Операции с пакетами (требуют прав root’а):
alias -g in='install' alias -g up='update' alias -g ug='upgrade' alias -g pur='purge'
Приглашения командной строки
Простое приглашение. Первичное приглашение:
PROMPT='%B[%n]%b=$ '
Правостороннее приглашение:
PROMPT2='%i%U> '
Вторичное приглашение:
RPROMPT='[%2~]'
Альтернатива: «функциональное» приглашение.
Активизация promptinit
:
autoload -Uz promptinit promptinit
Загрузка функции из каталога /usr/share/zsh/functions/Prompts/
:
prompt adam2 green blue white
Приглашение функции с параметрами из примера выглядит так:
Разные опции
Отключение выхода по Control+D:
setopt IGNORE_EOF
Отключение звукового сигнала:
setopt NO_BEEP
Поведение клавиш в стиле Emacs:
bindkey -e
Пейджер по умолчанию:
export PAGER="less"
Редактор по умолчанию:
export EDITOR="nano"
Конфигурирование Tilix’а
Необходимо для корректного запуска терминала Tilix:
if [ $TILIX_ID ] || [ $VTE_VERSION ]; then source /etc/profile.d/vte.sh fi
При использовании более иных терминалов не требуется.
Содержимое файла ~/.zshenv
Файл необходим для поддержки опции history-substring-search
в Cintu и других deb-based системах. Должен содержать такую строку:
DEBIAN_PREVENT_KEYBOARD_CHANGES=yes
В данном случае вопрос коту. Именно с его точки зрения. Раздел «Удаление дубликатов команд».
Опыт использования Fedora мне в данном случае подсказывает, что есть определенные ситуации, когда история команд важна не только сутью, но и последовательностью. Удаление дубликатов нарушает последовательность, затрудняя воспроизводимость действия.
Возможно, имеет смысл (если данное предположение реализуемо) не удалять дубликаты, а «архивировать». Т.е.: строка 6 makepkg -sri, следующая итерация этой команды в списке будет не «null» или «», а «6», как ярлык, не содержащий всю команду, а отсылающий нас к строке 6 в текущем сохраненном массиве комманд (2000 и 10000 в соответствии с настройками автора).
Добрый день, где скачать Ваш конфиг ?
Например, здесь: https://yadi.sk/d/woQgM_Mw3ZcLDw
Спасибо, буду настраивать свой. В статье ссылка просто битая.