Тег «tips»

Совет: пишите свои скрипты для гита

Одна неочевидная фича гита заключается в том, что если у вас где-то в PATH лежит команда с названием git-whatever, то её можно будет вызвать как git whatever, и таким образом «расширить» гит нужной вам функциональностью.

Я в какой-то момент устал делать git push -u origin MY_NEW_BRANCH_NAME и написал кратенький скрипт, который пушит текущий бранч (push current branch):

#!/bin/sh

git rev-parse --abbrev-ref HEAD | xargs git push -u origin

Положил его в ~ (у меня он добавлен в PATH) как git-pcb, и с тех пор писать имя бранча без автодополнения приходится только при создании бранча (чего, к сожалению, избежать будет сильно дороже). То есть флоу становится такой:

$ git checkout -b MY_NEW_BRANCH
$ # do work
$ git commit
$ git pcb

При написании своих скриптов для гита часто приходится обращаться к мануалу, страницы которого доступны по тому же принципу (только в обратную сторону): если команда называется git rev-parse, то информацию про неё надо искать в man git-rev-parse.

Совет: запускайте tmux скриптом

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

Начал читать по этому поводу книгу tmux 2: productive mouse-free environment и в целом думать об этом, и решил заодно публиковать советы, как же лучше использовать инструменты, в том числе и tmux, под соответствующими тегами.


Сегодняшний совет: запускайте tmux скриптом, а не просто командой tmux.

Я как-то заметил, что время от времени делаю, по сути, одно и то же: запускаю tmux, после чего настраиваю окошки определенным образом: в одном окне открываю консоль, в других — разные логфайлы. Это можно описать в виде несложного скрипта, я назвал его start-tmux:

#!/bin/sh

tmux kill-session -t remote

tmux new -s remote -n shell -d
tmux new-window -t remote -n logs

tmux send-keys -t remote:0.0 "cd projects/super-secret-project" C-m
tmux send-keys -t remote:1.0 "tail -n 30 -f /var/log/super-secret-project/error.log" C-m

tmux select-window -t remote:0.0
tmux attach -t remote

В результате получается сессия с названием remote1 с двумя окнами: в одном уже открыта папка с проектом, в другом уже открыт tail -f нужного логфайла; фокус на окне с башем; можно сразу приступить к работе.

Команда send-keys отправляет в указанную панель нажатия кнопок, как если бы вы их сами нажимали, поэтому для команд, которые должен исполнить шелл, надо указать в конце C-m (это способ указать ^M, а это, в свою очередь, способ описать, что был нажат Enter. Я всё ещё пишу пост про историю консоли, да).

-t обозначает окно или панель, формат простой: sessionName:windowIndex.paneIndex. Поэтому скрипт может работать сразу с несколькими сессиями (или принимать имя сессии как параметр, например). Можно сделать разные скрипты для разных проектов, или один большой скрипт, который сразу открывает всё необходимое для нескольких проектов.

Ещё две детали про этот скрипт: в самом начале я прибиваю предыдущую сессию на всякий случай, и в конце делаю attach — первое скорее всего необязательно в большинстве случаев, а если не делать attach, то можно делать скрипты, которые меняют текущую сессию tmux — например, условный debug-mode, который создаёт новое окно, запускает в нём дебаггер и открывает рядом логи — но я пока этого не делал.

В итоге я подключаюсь по ssh и выполняю ~/start-tmux, чтобы получить готовое окружение.

1

Такое название помогает мне отделить локальный tmux от tmux на удаленной машине (и поэтому сессия на удаленной машине называется remote). Tmux в tmux работает неплохо, если забиндить C-a C-a на send-prefix; но доходить до tmux в tmux в tmux мне приходилось только несколько раз, не рекомендую.