DotFiles/Shells/Zsh/Советы: различия между версиями

Материал из ALT Linux Wiki
< DotFiles‎ | Shells‎ | Zsh
Нет описания правки
 
Строка 239: Строка 239:


<references/>
<references/>
[[Категория:DotFiles]]
{{Category navigation|title=DotFiles|category=DotFiles|sortkey={{SUBPAGENAME}}}}

Текущая версия от 15:46, 30 июня 2015

Freesource-logo.png Blue Glass Arrow.svg MediaWiki logo.png
Эта страница была перемещена с freesource.info.
Эта страница наверняка требует чистки и улучшения — смело правьте разметку и ссылки.
Просьба по окончанию убрать этот шаблон со страницы.


Советы по настройке 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 я использовал лишь раз, но мне показалось это интересным и я все-таки позволил себе упоминуть об этом здесь ;))

Полезные ссылки

На русском:

На английском:

Примечания