Федорчук Алексей Викторович
Шрифт:
Однако продолжим наши «исторические» опции. Следующие строки задают условия сохранения команд в файле истории:
setopt INC_APPEND_HISTORY
setopt HIST_IGNORE_ALL_DUPS
setopt HIST_REDUCE_BLANKS
setopt HIST_IGNORE_SPACE
Они определяют, соответственно:
1. инкрементное наращивание файла истории — без указания этой опции (или одной из однотипных) его прежние команды будут заменены командами текущего сеанса;
2. удаление предыдущих полных дубликатов нововведённых командных конструкций;
3. избавление от пустых строк, возникающих после ошибочного нажатия Enter в «голом» приглашении;
4. удаление лишних пробелов из командной конструкции.
Зачем нужны пункты 2–4 — ясно без комментариев. А вот о пункте 1-м надо сказать несколько слов. Ибо он не просто обеспечивает наращивание файла истории (для этого было бы достаточно опции, APPEND_HISTORY), но делает это в ходе сеанса, не дожидаясь его завершения. В результате команда, введённая в одном терминальном окне или вкладе терминала, будет доступна в истории команд другого терминала или вкладки (хотя и с некоторой задежкой).
Далее следуют две очень важные строки, определяющие одну из полезнейших возможностей Zsh — тот самый механизм history-substring-search, о котором говорилось ранее:
bindkey "^[[A" up-line-or-search
bindkey "^[[B" down-line-or-search
Следующие две строки касаются уже простого пролистывания истории в командной строке, позволяя делать это клавишами PageUp и PageDown (а не только стрелками Up и Down, которые в этом качестве работают всегда и везде):
bindkey "^[[5~" up-line-or-history
bindkey "^[[6~" down-line-or-history
Этими строками перебрасывается логический мостик к определению кейбиндингов для клавиш, которые в Zsh по умолчанию работают «неправильно» в большинстве терминалов (если не во всех). У меня это Home, End, Delete — их поведение исправляется такими, соответственно, строками:
bindkey "^[OH" beginning-of-line
bindkey "^[OF" end-of-line
bindkey "^[[3~" delete-char
Это как раз пример тех строк, которые as is копировать не нужно. Во-первых, в общем случае, могут не работать другие клавиши (скорее, не только эти). Во-вторых же и главных, в более иных терминалах коды тех же клавиш могут быть совсем другими. Какими — легко определить, нажав Control+V, а затем «неправильную» клавишу. Именно таким образом получены коды для Home, End и Delete в системе, в которой сочиняются эти строки.
Теперь — опции, определяющие магию Zsh при навигации по файловой системе:
cdpath=(/home/current /home/current/alv.me /etc)
setopt autocd
Первая строка позволяет с помощью команды cd переходить в подкаталоги перечисленных каталогов, не набирая никаких путей, ни относительных, ни абсолютных, вторая же — обходиться без команды cd.
На грани между опциями навигации и автодополнения находятся такие строки:
setopt menucomplete
zstyle ':completion:*' menu select=1 _complete _ignored _approximate
Они в паре обеспечивают «менюобразный» вывод списка доступных дополнений по нажатию клавиши табуляции. И это как раз тот случай, когда последовательность строк имеет значение.
Аналогично и со следующими строками — теми самыми, которые обеспечивают волшебство развёртывания сокращённого ввода пути в полный:
autoload -Uz compinit
compinit
Расширенные подстановки и дополнения обеспечиваются вот этими строками:
setopt extendedglob nomatch notify
zstyle ':completion:*' completer _expand _complete _ignored _correct _approximate
Строка
zstyle ':completion:*' use-compctl false
знаменует собой отречение от старого мира — системы дополнения compctl, в пользу новой системы compsys.
Строка
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
устанавливает равноправие при дополнениях символов нижнего регистра с верхним.
А строка
zstyle :compinstall filename '/home/zsh/.zshrc'
фиксирует файл, в который compinstall (функция автоматического конфигурирования compsys) будет вносить свои изменения при грядущих её вызовах (если они, конечно, будут).
Пора переходить к псевдонимам. Сначала — серия таковых для команд манипуляции файлами, предписывающие запрос подтверждения на таковые или, напротив, форсированное исполнение, в зависимости от ситуации:
alias mv='mv -i'
alias cp='cp -iR'
alias cpr='cp -fR'
alias rm='rm -i'
alias rmf='rm -f'
alias rmrf='rm -fR'
Оказывается, что для одной-единственной команды ls можно придумать больше псевдонимов, чем для всех файломанипулирующих команд, вместе взятых: