Как-то в нашем форуме промелькнул вопрос - а как сделать, чтобы в
командной строке zsh клавиши типа Delete, End, Home вели себя
нормально (по умолчанию они этого делать не собираются). У меня до
этого долго не доходили руки - я в этих целях привык к клавишным
комбинациям. Однако некоторое чувство дискомфорта преследовало: как же
так, какой-то bash умеет нормально обращаться с клавишами, а любимый
zsh - не умеет. А тут и случай представился: во время затеянной в
рамках мегатестирования тотальной пересборки Qt/KDE/иже_с_ними времени
образовалось - вагон и маленькая тележка. И я наконец-то разобрался с
клавишами в zsh. А заодно и с некоторыми другими опциями его
настройки, остававшимися для меня не вполне ясными.
На нормальную заметку все это явно не тянет, поэтому ниже я просто
привожу свои рабочие конфиги с комментариями того, что знаю - в
дополнение к ранее написанной [61]статье. Кое-где сохраняются
комментарии из оригинального эталонного файла zshrc.
Для начала напомню, что zsh использует следующие конфиги (для простоты
рассмотрим только те, что в домашнем каталоге): ~/.zshenv, считываемый
при каждом запуске экземпляра оболочки (интерактивном и
неинтерактивном), ~/.zshrc, считываемый при каждом интерактивном
запуске, и один из пары ~/.zlogin или ~/.zprofile - при каждом запуске
zsh в качестве пользовательской оболочки (login shell). Я использую
~/.zlogin, при котором установка переменных окружения происходит в
стиле C-Shell: сначала из ~/.zshenv, затем из ~/.zshrc и, наконец, из
~/.zlogin.
К слову - zsh можно собрать так, чтобы он брал свои переменные и
переменные окружения из какого-либо глобального конфига, например,
/etc/profile. Для этого при начальном конфигурировании исходников
следует указать
$ ./configure --enable-zprofile=/etc/profile
И ещё одно вводное замечание. Все сказанное ниже относится к последней
development-версии - 4.1.1, однако практически те же конфиги
применялись мною и ранее - начиная с версии 4.0.4. Причём все они были
собраны собственноручно. Я настоятельно не рекомендую применять
прекомпилированные версии из штатных комплектов дистрибутивов, если
точно не известно, как именно они собраны. Ибо zsh имеет великое
множество опций конфигурирования, позволяющих, в частности, изменить
порядок считывания профильных файлов - так что в данной конкретной
бинарной версии он может быть иным. И ещё - мне известны случаи, когда
прилагаемые к бинарнику конфиги из дистрибутивов не соответствовали
опциям конкретной сборки. В этих случаях zsh начинает вести себя,
мягко говоря, несколько странно...
Однако пора за дело. Первым в моей схеме идёт ~/.zshenv. Он оказывает
воздействие только при shell-скриптинге. Поэтому у меня он очень мал:
Основное внимание я уделяю файлу ~/.zshrc, так как им определяется
поведение zsh не только при авторизации в консоли, но и при запуске
терминальных окон в Иксах.
#
# My ~/.zshrc
#
# Path для поиска командой cd: то есть вместо cd $HOME/docs/editors/
# можно набирать просто cd editors
cdpath=(~/media ~/docs)
## Установка нормального поведения клавиш Delete, Home, End и т.д.:
case $TERM in
linux)
bindkey "^[[2~" yank
bindkey "^[[3~" delete-char
bindkey "^[[5~" up-line-or-history
bindkey "^[[6~" down-line-or-history
bindkey "^[[1~" beginning-of-line
bindkey "^[[4~" end-of-line
bindkey "^[e" expand-cmd-path ## C-e for expanding path of typed command
bindkey "^[[A" up-line-or-search ## up arrow for back-history-search
bindkey "^[[B" down-line-or-search ## down arrow for fwd-history-search
bindkey " " magic-space ## do history expansion on space
;;
*xterm*|rxvt|(dt|k|E)term)
bindkey "^[[2~" yank
bindkey "^[[3~" delete-char
bindkey "^[[5~" up-line-or-history
bindkey "^[[6~" down-line-or-history
bindkey "^[[7~" beginning-of-line
bindkey "^[[8~" end-of-line
bindkey "^[e" expand-cmd-path ## C-e for expanding path of typed command
bindkey "^[[A" up-line-or-search ## up arrow for back-history-search
bindkey "^[[B" down-line-or-search ## down arrow for fwd-history-search
bindkey " " magic-space ## do history expansion on space
;;
esac
# Примечание: если, скажем, в KDE для konsole
# выбрать тип Linux console, необходимости
# во второй секции нет.
# Use hard limits, except for a smaller stack and no core dumps
unlimit
limit stack 8192
limit core 0
limit -s
# Установка атрибутов доступа для вновь создаваемых файлов
umask 022
# Исправление поведения less - для ликвидации лишних Esc
# и прочего безобразия при выводе man-страниц.
# Насколько мне известно, нужно только в некоторых дистрибутивах
export LESS="-R"
# Установка alias'ов
## alias'ы для команд, не требующих коррекции, но требующих подтверждения
alias mv='nocorrect mv -i' # переименование-перемещение c пogтвepжgeнueм
alias cp='nocorrect cp -iR' # рекурсивное копирование с подтверждением
alias rm='nocorrect rm -i' # удаление с подтверждением
alias rmf='nocorrect rm -f' # принудимтельное удаление
alias rmrf='nocorrect rm -fR' # принудительное рекурсивное удаление
alias mkdir='nocorrect mkdir' # создание каталогов без коррекции
## Примечание: если не определить здесь nocorrect,
## zsh будет настойчиво предлагать подстановку существующих имен
## при создании каталого, копировании и т.д.
## Разные полезные (ИМХО) alias'ы
alias h=history
alias grep=egrep
### вывод свободного дискового пространства в мегабайтах
alias df='df -m'
### Представление вывода less в more-подобном виде
### (с именем файла и процентом вывода)
alias less='less -M'
### Русский словарь для ispell по умолчанию
alias ispell='ispell -d russian'
## aliases для команды ls
### показ классификации файлов в цвете и символически
alias ls='ls -F --color=auto'
### вывog в gлuннoм фopмaтe
alias ll='ls -l'
### вывog всех файлов, включая dot-фaйлы, kpoмe . u ..
alias la='ls -A'
### вывog вcex фaйлoв в gлuннoм фopмaтe, вkлючaя inodes
alias li='ls -ial'
### вывод только каталогов
alias lsd='ls -ld *(-/DN)'
### вывog тoльko dot-фaйлoв
alias lsa='ls -ld .*'
# Установка глобальных псевдонимов
# для командных конвейеров
alias -g M='|more'
alias -g L='|less'
alias -g H='|head'
alias -g T='|tail'
alias -g N='2>/dev/null'
# Ниже даны опции, относящиеся к функциям zsh,
# которыми собственно и определяется мощь этой оболочки
# Shell functions
setenv() { typeset -x "${1}${1:+=}${(@)argv[2,$#]}" } # csh compatibility
freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
# Where to look for autoloaded function definitions
fpath=($fpath ~/.zfunc)
# Autoload all shell functions from all directories in $fpath (following
# symlinks) that have the executable bit on (the executable bit is not
# necessary, but gives you an easy way to stop the autoloading of a
# particular shell function). $fpath should not be empty for this to work.
for func in $^fpath/*(N-.x:t); autoload $func
# automatically remove duplicates from these arrays
typeset -U path cdpath fpath manpath
# Указание путей к man-страницам.
manpath="/usr/man:/usr/share/man:/usr/local/man:/usr/X11R6/man:/opt/qt/doc"
export MANPATH
# Список хостов, к которым будет применяться автодополнение
# при наборе в командной строке
# например, как аргументов браузера или ftp-клиента (see later zstyle)
hosts=('hostname' linuxshop.ru ftp.archlinux.org)
# Установка вида приглашения
## Обычное приглащение вида ~%=>
## (каталог от домашнего - пользователь/root - стрелка)
PROMPT='%~%#=> '
## Приглашения для второй линии мноргострочных команд
## вида #_строки>
PROMPT2='%i%U> '
## Приглашение с правой стороны экрана вида
## 19:15 vc/5 (время - номер консоли)
RPROMPT=' %T %y%b'
# Всякие переменные
## файл истории команд
## если не указан, история не будет сохраняться
## при выходе из сеанса
HISTFILE=~/.zhistory
## Число команд, сохраняемых в HISTFILE
SAVEHIST=5000
## Чucлo koмaнg, coxpaняeмыx в сеансе
HISTSIZE=5000
## Примечание:
## рекомендуются равные значения для
## SAVEHIST и HISTSIZE
DIRSTACKSIZE=20
# Опции истории команд
## Дополнение файла истрии
setopt APPEND_HISTORY
## Игнopupoвaть вce пoвтopeнuя команд
setopt HIST_IGNORE_ALL_DUPS
# Autoload zsh modules when they are referenced
zmodload -a zsh/stat stat
zmodload -a zsh/zpty zpty
zmodload -a zsh/zprof zprof
zmodload -ap zsh/mapfile mapfile
# Опции общего поведения
# bindkey -v # режим навигации в стиле vi
bindkey -e # peжuм нaвuгaцuu в cтuлe emacs
bindkey ' ' magic-space # also do history expansion on space
bindkey '^I' complete-word # complete on tab, leave expansion to _expand
# Для разворота сокращенного ввода типа cd d/e в docs/editors
autoload -U compinit
compinit
# Completion Styles
# list of completers to use
zstyle ':completion:*::::' completer _expand _complete _ignored _approximate
# allow one error for every three characters typed in approximate completer
zstyle -e ':completion:*:approximate:*' max-errors
'reply=( $(( ($#PREFIX+$#SUFFIX)/3 )) numeric )'
# insert all expansions for expand completer
zstyle ':completion:*:expand:*' tag-order all-expansions
# formatting and messages
zstyle ':completion:*' verbose yes
zstyle ':completion:*:descriptions' format '%B%d%b'
zstyle ':completion:*:messages' format '%d'
zstyle ':completion:*:warnings' format 'No matches for: %d'
zstyle ':completion:*:corrections' format '%B%d (errors: %e)%b'
zstyle ':completion:*' group-name ''
# match uppercase from lowercase
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
# offer indexes before parameters in subscripts
zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters
# command for process lists, the local web server details and host completion
#zstyle ':completion:*:processes' command 'ps -o pid,s,nice,stime,args'
#zstyle ':completion:*:urls' local 'www' '/var/www/htdocs' 'public_html'
zstyle '*' hosts $hosts
# Filename suffixes to ignore during completion (except after rm command)
zstyle ':completion:*:*:(^rm):*:*files' ignored-patterns '*?.o' '*?.c~'
'*?.old' '*?.pro'
# the same for old style completion
#fignore=(.o .c~ .old .pro)
И, наконец, файл ~/.zlogin. Что осталось неохваченным в ~/.zshrc и
требуется только при авторизации в системе? Правильно, установка
locale. И потому
#
# My ~/.zlogin
#
# Установка всех локально-зависимых переменных,
# кроме LC_ALL
export LANG="ru_RU.koi8r"
# Установка десятичной точки
# вместо запятой
# (требуется для некоторых счетных программ)
export LC_NUMERIC="POSIX"
Это мои пользовательские конфиги. Почти те же самые я использую и для
root'а, с минимальными коррективами. Так, path в /root/.zshenv
значениями
/sbin:/usr/sbin:/usr/local/sbin
В /root/.zshrc cdpath имеет вид
cdpath=(~/etc ~/usr)
А в /root/.zlogin локаль установлена как
export LANG="POSIX"
так как некоторые программы упорно не желают собираться при какой-либо
иной.