Воззрения кота Manual’а. CLI и Zsh. Часть 3. Авторский ~/.zshrc

Алексей Федорчук

manul-logo-100

На этой странице кот Мануал велел мне поделиться нашим с ним главным 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 и нажатия клавиши табуляции выглядит таким образом:

zsh-config_001

Автодополнение псевдонимов:

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'

Что «в натуре» выглядит так:

zsh-config_002

Закачка файла по 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

Приглашение функции с параметрами из примера выглядит так:

zsh-config_003

Разные опции

Отключение выхода по 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

[Общее содержание]

1 комментарий к “Воззрения кота Manual’а. CLI и Zsh. Часть 3. Авторский ~/.zshrc

  1. В данном случае вопрос коту. Именно с его точки зрения. Раздел «Удаление дубликатов команд».
    Опыт использования Fedora мне в данном случае подсказывает, что есть определенные ситуации, когда история команд важна не только сутью, но и последовательностью. Удаление дубликатов нарушает последовательность, затрудняя воспроизводимость действия.
    Возможно, имеет смысл (если данное предположение реализуемо) не удалять дубликаты, а «архивировать». Т.е.: строка 6 makepkg -sri, следующая итерация этой команды в списке будет не «null» или «», а «6», как ярлык, не содержащий всю команду, а отсылающий нас к строке 6 в текущем сохраненном массиве комманд (2000 и 10000 в соответствии с настройками автора).

Оставить комментарий

Перейти к верхней панели