UNIX (s)hell, pt5
04 Jul 2016В этой части я покажу как у меня реализован впаппер для vim, расскажу про некоторые плагины. О плагинах уже было в общем-то рассказано в первой части. Так что похоже эта часть последняя, которая говорит преимущественно о конфиге. Ещё я хочу рассказать об extended globbing. Многие знают что он есть, но не все знают насколько это может быть полезно на практике.
Vim wrapper
Все знают про vim. Также все знают, что у него есть GUI морда gvim, которая во многом неплохо работает. К сожалению нет возможности комбинирвоать gvim и tmux. Так что вместо этого я сдвинулся в сторону обычного vim. Но вот незадача: нет удобного способа отделить vim в отдельный tmux. Для этого была придумана вандервафля, который держит tmux на отдельном сокете. Также я хотел чтобы была возможность переключаться на окно из командной строки, для этого используется интеграция с notion с помощью notionflux(это его IPC через сокет). В результате моим разумом было порождено следующее чудовище:
Чрезмерное углубление в логику этого скрипта опасно для моска. Тем не менее
грех его не привести, потому что моя основная цель заховать ваш мозг
пользуюсь этим практически каждый день. Представляет собой набор эвристик,
которые просто выполняют свою работу, с корректным экранированием файлов,
поддержкой локалей, также можно выполнять diff с помощью wdiff и передавать
другие команды, не запуская новый инстанс вима. В практически всех случаях
корректно работает, корректно создает новый инстанс tmux если это нужно,
корректно выбирает искомый, если это не нужно, в общем работает хорошо.
Иногда случаются накладки, видимо это какие-то race conditions, но это
случается так редко, что я не знаю в чем дело, к тому же они не фатальные.
Создан был когда я ещё не знал про zsh-functional достаточно хорошо, так что
возможно его код может быть упрощен. Вы можете доработать его и взять себе,
если оставите ссылку на автора(я хочу чтобы все знали про моего
ребенка-гомункула). Отклик на события vim формируется с помощью “адаптивного”
таймера, что вроде тоже уже работает довольно стабильно, по крайней мере
у меня. Так же есть враппер для того чтобы использовать эту штуку в качестве
$VISUAL в mutt, yaourt, pacman и тд и тп:
К счастью его код тривиален и состоит всего из одной функции, которая есть в коде, приведенном выше. На теоретически возможные потери производительности из-за загрузки всего zshrc целиком я забил, потому что вроде и так быстро.
Vim cat
cat с подсветкой синтаксиса, выглядит вот так:
Можно найти, например, у меня: https://github.com/neg-serg/dotfiles/blob/master/bin/_v
Extended globbing
Теперь я хочу показать вам такую особенность zsh как extended globbing. Это улучшенный globbging(которые звездочка), который позволяет делать выборку по множеству разных критериев, простой рекурсивный обход и так далее.
Сразу скажу что почти все эти параметры можно комбинировать. Акцент сделан на возможностях, которые удобно применять в интерактивном режиме. Такой улучшенный globbing, равно как и обычный, может использоваться в практически всех выражениях.
Вы всегда можете сходить http://www.zzapper.co.uk/zshtips.html где примеров такого рода побольше. Собственно я просто выбрал из этого списка такие, которые кажутся мне наиболее полезными и которые сам постоянно(или часто) использую на практике.
Как вы поняли (/) задает поиск только по директориям. Равно так же работает и (.) – это поиск только по обычным файлам, (@) – только по симлинкам. Это очень удобно. Кто хочет большего может обратиться например к хэлперам из моего автокомплита, это самый простой и быстрый способ. Ну или документацию почитать.
Также для этих аргументов внутри скобок мы имеем массив, по которому можно итерироваться и делать перечисления, например:
Здесь мы редактируем самый новый файл в текущей директории. Можно использовать отрицательные индексы для создания обратного эффекта. Также Om взаимообратно om, за исключением того что точку для него писать не обязательно.
Полезным оператором также является крышечка(^), она меняет смысл выражения на противоположный, например нам нужно исключить из множества файлы на mp4, вот как это сделать:
Это примерно то же самое что и:
Крышечка также работает и внутри скобок и может находиться в любом месте. То есть можно сделать половину globbing’а нормальным, а вторую половину, которая после ^ исключающим.
Частоиспользуемой мной фичей является !$, возвращает последний аргумент предыдущей команды, удобно, например:
Отредактировать файл, который был последним аргументом у предыдущей команды. Представьте что последняя команда это mv и юзкейс станет понятен.
Также возможен рекурсивный глоббинг, например
Выведет все *.zsh файлы в текущей директории и её потомках.
Также частоиспользуемой возможностью является оператор фигурных скобок. Например представим что мы хотим создать временный файл с суффиксом .bak, вот как это сделать:
Есть возможность игнорирования регистра при globbing’е:
Ещё одной частоиспользуемой возможностью, которой, кстати, нет в списке являются знаки процента и решетки(%,#,%%,##). Вообще-то они являются частью parameter expansion, но мне как-то всё равно. Итак, если i это имя файла, то: