Я использую tmux для разработки, у меня одна задача запущена в окне, а другая — в своем собственном. Я установил соглашение, что базовое имя каталога проекта — это имя сеанса tmux.
export SESSION_NAME="my-project-name"
tmux kill-session -t "$SESSION_NAME"
tmux new-session -s "$SESSION_NAME" \
"api.start --monitored" \; \
split-window "ui.start --monitored" \; \
select-layout tiled \; \
set-option -w remain-on-exit on \; \
set-option -w mouse on \; \
set-option -g mouse on \; \
bind-key -n C-c kill-session -t "$SESSION_NAME"
Кажется, все работает правильно, за исключением того, что при запуске другого проекта с тем же соглашением сочетание клавиш CTRL+c в первом сеансе каким-то образом считает, что SESSION_NAME — это один из последних сеансов, созданных tmux, а это не то, на что я надеялся.
решение1
В опубликованном вами фрагменте каждое появление $SESSION_NAME
раскрывается оболочкой, и каждое tmux
развернутое значение получает в качестве аргумента командной строки.
(Даже если это не так и вы хотите расширить это $SESSION_NAME
позже внутри tmux или внутри оболочки внутри tmux, ваши усилия export SESSION_NAME="my-project-name"
могут оказаться бесполезными из-закак tmux
строится окружающая среда. update-environment
Опция или new-session -e …
команда могут быть полезны.)
Это включает $SESSION_NAME
в себя bind-key -n C-c kill-session -t "$SESSION_NAME"
. Ваши tmux
выполнения:
bind-key -n C-c kill-session -t my-project-name
Тогда для другого проекта команда tmux будет выглядеть так:
bind-key -n C-c kill-session -t different-name
Важно то, что bind-key
само по себе не нацелено на один сеанс. bind-key -n C-c …
изменяет поведение Ctrl+ cдля всего сервера tmux. В вашем случае последнее bind-key
перезаписывает предыдущее назначение, а затем Ctrl+ cв любом сеансе будет kill-session -t different-name
.
Я думаю, вы могли бы использовать key-table
опцию, чтобы задать таблицу ключей по умолчанию на что-то другое, чем root
, отдельно для каждого сеанса. В каждой новой таблице ключей вы могли бы задать другую привязку для C-c
. Я не проверял это, ядуматьэто может быть возможно.
Если бы я был вами, я бы сделал проще. Я бы сделал так:
tmux bind-key -n C-c kill-session
kill-session
без -t
целейтекущийсеанс, поэтому эта привязка должна делать то, что вам нужно для my-project-name
или different-name
любого другого сеанса.
Честно говоря, "любая другая сессия" для меня слишком. Я бы не хотел Ctrl+ cубивать все в своемобщее назначениесеанс(ы). Я бы решил это:
либо оставить
C-c
все как есть и выбрать другое нажатие клавиши в качестве «глобального SIGINT», а затем преднамеренно использовать одно или другое;или явно "отмечая" сеансы, которые должны использовать Ctrl+ cкак "глобальный SIGINT". Это может быть что-то вроде этого:
tmux new-session -e 'TMUX_GLOBAL_SIGINT=1' \; \ bind-key -n C-c if-shell '[ -n "$TMUX_GLOBAL_SIGINT" ]' kill-session 'send-keys C-c'
Теперь в каждой сессии,
TMUX_GLOBAL_SIGINT
в окружении которой есть непустая переменная Ctrl+ cубьет сессию. В каждой сессии, гдеTMUX_GLOBAL_SIGINT
пусто или не установлено Ctrl+ cбудет работать как обычно.Примечания:
Для уже начатого сеанса вы можете изменить настройки с помощью
tmux set-environment -u TMUX_GLOBAL_SIGINT
илиtmux set-environment TMUX_GLOBAL_SIGINT 1
(используйте-t
для выбора конкретного сеанса, не обязательно текущего).Оболочка (или другая программа), запущенная в tmux, может наследовать
TMUX_GLOBAL_SIGINT
. Если она запускаетсяtmux new-session …
, то (в зависимости отupdate-environment
и т. п.) новый сеанс также может наследовать переменную, даже без явного-e 'TMUX_GLOBAL_SIGINT=1'
. Прочитайтеman 1 tmux
и узнайте, как tmux управляет средой.