zsh: tips & tricks

в 10:48, , рубрики: shell, zsh, Оболочки, метки: ,

zsh logoО zsh не раз писали на хабре. Однако, и как те топики, и как мои личные наблюдения, показывают, что большинство людей, знакомых с zsh, используют его как bash с продвинутым автокомплитом. Да и тот (автокомплит) используют не на полную катушку.

Я не хочу описывать как раскрасить консоль во все цвета радуги или сделать промт, показывающий всё на свете. Я хочу показать, что возможности zsh гораздо шире, и его использование в качестве основной оболочки может сделать вашу работу немного краше.

Алиасы

В zsh они бывают четрырёх видов:

  1. стандaртные (флаг -r) — ведут себя точно так же как и в bash
  2. суффиксы (флаг -s) — позволяют ассоциировать файлы по расширению с определённым приложением
  3. глобальные (флаг -g) — в отличие от стандартных поиск ведётся по всей строке, а не только там, где может быть команда
  4. хэши — этакие алиасы для директорий

Про первые два вида писали и не раз. Интереснее два последних.

Глобальные алиасы

alias -g g="| grep"
alias -g l="| less"

позволит вместо

cat where | grep what | less

делать

cat where g what l

Пример утрированный, и в реальности алиасы могут (и должны) быть сложнее. Но даже этот пример показывает профит для тех, кому приходится много грепать и работать с пайпами.

Без указания флага при создании алиаса, он ведет себя и как стандартный и как глобальный. Но я рекомендую указывать флаг для избежания неоднозначностей.

Алиасы можно временно выключать/включать при помощи

disable -a aliasname
enable -a aliasname

Также, если алиас переназначает какую-либо команду, можно достучаться и до неё

aliasname
#or
=aliasname

Хэши

hash -d apl=/private/var/log/apache2
hash -d p1=/srv/www/project1/html

Теперь для перехода в директорию, обозначенную как хэш, достаточно выполнить

cd ~hashname

или вовсе

~hashname

если вы пользуетесь опцией autocd.

Разумеется, хэши можно использовать и в любых иных операциях, связанных с файловыми путями:

cat ~hashname/file
cp ~hashname/file /path/somewhere

Автокомплит

Он в zsh поистине могуч.
Помимо того, что он умеет дополнять опции многих команд (да и свой комплит написать несложно), zsh позволяет крутить им как угодно:

zstyle ':completion:*:processes' command 'ps -ax' 
zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#)*=0=01;32'
zstyle ':completion:*:*:kill:*' menu yes select
zstyle ':completion:*:kill:*'   force-list always

zstyle ':completion:*:processes-names' command 'ps -e -o comm='
zstyle ':completion:*:*:killall:*' menu yes select
zstyle ':completion:*:killall:*'   force-list always

Данный конфиг доставит нам комплит для комманд kill и killall:

DevMan% killall F
Finder    ForkLift

DevMan% kill 502
 502 ??         2:49.10 /Applications/Safari.app/Contents/MacOS/Safari -psn_0_53261                                                  
 823 ??        14:29.44 /System/Library/StagedFrameworks/Safari/WebKit2.framework/WebProcess.app ...
1509 ??         4:28.21 /Applications/Xmarks for Safari.app/Contents/MacOS/Xmarks for Safari -psn_0_340051

Решение о том стоит ли применять регистронезависимый комплит оставляю вам. Хотя лично я от него получаю намного больше пользы, чем вреда.

Хуки

Хуки — функции, вызывающиеся при определённом событии.

Я активно использую 3 из них:

  1. chpwd – как можно догадаться из названия, вызывается при смене текущей директории.
  2. preexec – вызывается перед выполнением любой команды.
  3. precmd – вызывается перед выводом промта.

Первый использую для восстановления всех консолей в тех директориях, в которых находился до ребута/логаута.
Второй и третий хуки я использую, в частности, для уведомления о процессах, выполняющихся дольше заданного времени: запустил, например, сборку проекта и переключился на выполнение других задач, когда сборка закончится в notification center прилетит уведомление о готовности.

Напоследок немного zsh-магии

ls *(.)          # показать только файлы
ls *(.om[1])     # показать самый свежий файл
ls -l *(.m0)     # показать файлы измененные сегодня
ls **/style.css  # найти style.css по всем дискам
ls -l *(.Lk+50)  # показать все файлы более 50 Кб
ls **/*(.Lm+5)   # показать файлы более 5 Мб по всем дискам
ls *.^log        # показать все файлы, кроме .log
vi *(.om[1])     # открыть самый свежий файл

# многое из магии требует setopt EXTENDED_GLOB

Это ничтожный пример того, на что способен zsh.
Не были затронуты модули, которых достаточно.

В качестве учебного пособия, кроме родных манов и гайда, рекомендую поизучать

Если тема будет интересна, продолжим.

Приятного всем кодинга!

Автор: DevMan

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js