DotFiles/Shells/Zsh/Советы
Советы по настройке zsh
В этой заметке приводится несколько очень полезных, на мой взгляд, советов по настройке командной оболочки zsh.
Автодополнение
Это, пожалуй, самая известная и частоиспользуемая в zsh функция, выгодно отличающая его от других командных интерпретаторов. Помимо простого дополнения имен и путей к файлам zsh также способен дополнять опции к командам (попробуйте, к примеру, find . -na<Tab> -s<Tab>), названия страниц руководств (man chkc<Tab> дополнится до man chkconfig) и раскрывать сокращенные пути (к примеру, /mn/o/d/a<Tab> раскрывается до /mnt/other/distrib/alt).
Чтобы включить это продвинутое автодополнение, вам нужно добавить в конфигурационный файл zsh (~/.zshrc) следующие строки:
autoload -U compinit compinit
Замечу, что пользователям ALT Linux этого делать не потребуется, так как данная возможность включена по умолчанию (см. /etc/zshrc)
Выбор вариантов можно оформить в виде меню с подсветкой текущего варианта. Простой пример:
zmodload zsh/complist zstyle ':completion:*' menu yes select
Разноцветные пункты меню в зависимости от типа объекта. Тоже простой пример из info zsh:
zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}
По умолчанию автодополнение для kill и killall не показывает процессы без controlling tty (для всех пользователей кроме root). Устраняем этот недостаток и дополнительно добавляем "красоты":
zstyle ':completion:*:processes' command 'ps -xuf' zstyle ':completion:*:processes' sort false zstyle ':completion:*:processes-names' command 'ps xho command'
Про автодополнение для ssh/scp написано ниже.
Настройка приглашения
За внешний вид приглашения отвечает переменная PROMPT (а не PS1, как в bash!). Все возможные специальные последовательности, которые возможно использовать в приглашении, описаны в man zshmisc в главе PROMPT EXPANSION. К примеру, вы можете, для начала, установить (если оно еще не установлено) самое обычное приглашение:
PROMPT="%n@%m %~ %(!.#.$) "
Подробнее о том, что означает каждая из специальных последовательностей, вы можете узнать в странице руководства ;)
Еще одна удобная особенность: приглашение может быть выведено не только в левой части экрана, но и в правой! За это отвечает переменная RPROMPT.
RPROMPT='%T'
После этого в правой части командной строки вы будете видеть текущее время.
Темы приглашений
Если вы хотите придумать оригинальное и удобное приглашение, то сначала я рекомендую вам взглянуть на уже существующие. Вдруг там вы найдете подходящую или решите позаимствовать из понравившийся нужный элемент. Выполните следующие команды:
$ autoload promptinit $ promptinit $ prompt -l
В результате вы увидите список из 15 предустановленных тем для приглашения. Попробовать понравившуюся можно командой promptinit название_темы Команда prompt -p выдает примеры всех установленных тем строки приглашения.
Автопереход
Обычно при работе в терминале приходится довольно часто перемещаться по директориям. И каждый раз приходится вводить cd /path/to/file Но разработчики zsh подумали, что использование этой команды нужно как-то упростить и придумали autocd! Смысл прост: вместо cd /path/to/file вам нужно ввести лишь путь! Чтобы уже начать пользоваться этой удобной возможностью, добавьте еще одну строчку в ~/.zshrc:
setopt autocd
Именованные каталоги
Еще один способ, чтобы быстрее перемещаться по иерархии каталогов. Этот способ чем-то напоминает создание alias'ов (псевдонимов) для команд. Для этого вам нужно прописать в конфигурационный файл часто посещаемые вами пути к файлам и соответствующие им имена. К примеру, вот так:
hash -d dist=/mnt/other/distrib
Теперь можно будет вместо /mnt/other/distrib набрать его имя ~dist При этом здесь также действует и автодополнение имени, и к низлежайшим файлам/каталогам.
Глобальные псевдонимы
Кроме обычных псевдонимов существуют также глобальные. Их использование лучше всего рассмотреть на примере. Вот часть конфига zsh, которой определяются глобальные псевдонимы:
alias -g L='| less' alias -g G='| grep' alias -g GI='|grep -i' alias -g H='| head' alias -g T='| tail' alias -g S='| sort' alias -g SU='|sort -u' alias -g P='| patch -p1' alias -g PD='| patch -p1 --dry-run' alias -g WC='| wc -l' alias -g IK='| iconv -c -f koi8r -t cp1251' alias -g IU='| iconv -c -f utf8 -t cp1251'
Теперь для того, чтобы узнать установлен ли в вашей системе пакет example будет достаточно ввести: rpm -qa G example. Вместо 'G' zsh подставит '| grep' и таким образом вы найдете нужный пакет в списке всех установленных. Таким же образом используются и другие глобальные псевдонимы из примера:
$ apt-cache search kernel G std-up S L
Данная команда найдет все пакеты с ядром и модулями к нему для однопроцессорной машины, отсортирует список и передаст less, чтобы вам было удобнее его просмотреть.
Псевдонимы расширения
Еще один интересный вид псевдонимов - псевдонимы расширения (suffix aliases). Эти псевдонимы позволяют расширить команду вида name.ext до program name.ext. Например, если в файле конфигурации прописать:
alias -s avi=mplayer alias -s mpg=mplayer
команда movie.avi будет расширена до mplayer movie.avi
Рекурсивный глоббинг
"Zsh позволяет производить рекурсивное раскрытие имен файлов. Для этого используются формы **/ и ***/ Первая форма отличается от второй лишь тем, что не следует по символьным ссылкам. Так, например
ls **/foo
произведет поиск файлов с именем foo во всех подкаталогах.[1]
Автокоррекция команд
Иногда при вводе команд или путей мы допускаем ошибки. Причем не очень серьезные, как правило, это опечатки. В zsh есть способ, как быстро разрешать подобные ситуации -- автокоррекция команд. Включаем её:
setopt CORRECT_ALL
После этого, если вы введёте sl вместо ls и /urs вместо /usr, то zsh укажет вам, что вы ошиблись. В ваших руках также возможность настроить запрос на коррекцию, для этого достаточно присвоить нужное значение переменной SPROMPT Вот, к примеру, как это настроено у меня:
SPROMPT="Ошибка! Вы хотели ввести %r вместо %R? ([Y]es/[N]o/[E]dit/[A]bort) "
Взгляните на результат:
[slava@semushin ~]$ sl /urs Ошибка! Вы хотели ввести ls вместо sl? ([Y]es/[N]o/[E]dit/[A]bort) y Ошибка! Вы хотели ввести /usr вместо /urs? ([Y]es/[N]o/[E]dit/[A]bort) y bin etc games include lib libexec local sbin share src tmp X11R6
Взаимодействие с терминалом
Если zsh запущен в каком-либо псевдотерминале (xterm, aterm и т.д.), то возможно управлять заголовком окна. Т. е. вы можете попросить zsh выводить в него что-нибудь полезное. Вот пример (добавьте в ~/.zshrc):
case $TERM in xterm* | rxvt) precmd(){print -Pn "\e]0;%n@%m: %~\a"} ;; esac
Здесь проверяется значение переменной $TERM, и если оно равно rxvt или начинается с xterm, то выполняется действие. В частности, задается функция, которая и выводит строку, похожую на приглашение, в заголовок окна. Функция precmd() выполняется каждый раз перед выводом приглашения. Также вы можете использовать функцию preexec(), которая выполняется перед запуском любой программы, и chpwd(), которая "вызывается при изменении рабочего каталога. [...] Кроме того, может быть определена функция periodic, которая может выполнятся через каждые $PERIOD (если этот параметр определен) секунд перед выводом приглашения.<link name="ott"/>
Быть может, вам покажется удобным выводить имя запущенной программы? Тогда вместо третьей строчки напишите
preexec(){print -Pn "\e]0;$0\a"}
Клавиатурные комбинации как в Vim/Emacs
Zsh умеет частично эмулировать Vim/Emacs при редактировании командной строки. Команды bindkey -v и bindkey -e соответственно загружают необходимые раскладки клавиш.
# Перебор истории команд как в Vim (с совпадением строки левее курсора). # Любезно предоставлено Sir Raorn. bindkey "^[[A" history-beginning-search-backward bindkey -a "^[[A" history-beginning-search-backward bindkey "^[[B" history-beginning-search-forward bindkey -a "^[[B" history-beginning-search-forward
"Магический" поиск в истории команд
autoload -U predict-on zle -N predict-on zle -N predict-off bindkey "^X^Z" predict-on # C-x C-z bindkey "^Z" predict-off # C-z
Теперь, если нажать Ctr+X Ctrl+Z, при вводе команды будет автоматически производится поиск в истории по первым буквам команды. Нажатие Ctrl+Z отключит этот режим.
Мелкие фишки
В поставке zsh идет несколько интересных модулей.
Тетрис :)
autoload -U tetris zle -N tetris bindkey ^T tetris
Потом жмем Ctrl-T и играем :) Вместо ^T можно использовать любое другое сочетание клавиш. Выход - q.
Калькулятор
autoload -U zcalc zcalc
Текстовый редактор
autoload -U zed zed имя_файла
Управление - как в vim или emacs в зависимости от используемого в командной строке режима (см. выше).
Автодополнение имени хоста для SSH
Подсмотрено у virtuoso на #debian-russian:
hosts=(${${${(f)"$(<$HOME/.ssh/known_hosts)"}% %\ *}% %,*}) <---- пробелы между "% %" убрать. zstyle ':completion:*:hosts' hosts $hosts
Однако этот способ имеет несколько неисправимых преимуществ. Более "кошерный" вариант предложен в виде патча здесь. Можно настроить и локально, для "себя любимого". Для этого:
1. Создать каталог ~/.zsh/functions 2. Положить _known_hosts и пропатченый _ssh в этот каталог 3. В ~/.zshrc добавить:
fpath=(~/.zsh/functions $fpath) autoload _known_hosts _ssh
По умолчанию для ssh/scp и им подобных дополняются и хост и пользователь. Отключить отображение пользователей в списке вариантов (не отключая самой возможности дополнять их) можно так:
zstyle ':completion:*:(ssh|scp):*' tag-order '! users'
Подстановка полного пути из $PATH
Если вам требуется отредактировать какой-нибудь скрипт, который расположен в $PATH или же просто использовать полный путь к програме, то zsh способен отыскать требуемую программу и использовать полный путь к ней. К примеру, чтобы отредактировать файл script достаточно будет ввести:
vim =script
В zsh еще очень много разных удобных и полезных функций и настроек. В этой заметке я попытался рассказать о той их части, о которой мне известно и которая наиболее часто используется мной (хотя promptinit я использовал лишь раз, но мне показалось это интересным и я все-таки позволил себе упоминуть об этом здесь ;))
Полезные ссылки
На русском:
- http://linuxshop.ru/unix4all/?cid=26&id=209
- http://www.opennet.ru/base/dev/zsh_setup.txt.html
- http://xtalk.msk.su/~ott/ru/linux/zsh/Zsh-article.ru.html
- http://www.freesource.info/wiki/Altlinux/DotFiles/Shells/zsh/MenuSelection
- Добавление в приглашение кода ошибки программ и расшифровки сигнала
На английском:
- http://en.gentoo-wiki.com/wiki/Zsh
- http://www.faqs.org/faqs/unix-faq/shell/zsh/
- http://adamspiers.org/computing/zsh/
- http://www.daemonnews.org/199910/zsh.html
- http://zsh.sourceforge.net/Guide/zshguide.html
- http://www-106.ibm.com/developerworks/library/l-z.html
- http://www.acm.uiuc.edu/workshops/zsh/toc.html
Примечания
- ↑ цитата из статьи Алекса Отта