Eu uso o tmux para desenvolvimento, tenho uma tarefa rodando em uma janela e outra sozinha. Eu defini a convenção de que o nome base do diretório do projeto é o nome da sessão 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"
Tudo parece funcionar corretamente, exceto se iniciar um projeto diferente com a mesma convenção, de alguma forma o CTRL+c na primeira sessão pensa que SESSION_NAME é a sessão mais recente gerada pelo tmux, o que não é o que eu esperava.
Responder1
No trecho que você postou, cada aparência $SESSION_NAME
é expandida pelo shell e cada uma tmux
obtém o valor expandido como um argumento de linha de comando.
(Mesmo que isso não aconteça e você queira expandir isso $SESSION_NAME
mais tarde dentro do tmux ou dentro de um shell dentro do tmux, você export SESSION_NAME="my-project-name"
pode ser inútil por causa decomo tmux
constrói o ambiente. A update-environment
opção ou new-session -e …
comando pode ser útil.)
Isso inclui $SESSION_NAME
em bind-key -n C-c kill-session -t "$SESSION_NAME"
. Suas tmux
execuções:
bind-key -n C-c kill-session -t my-project-name
Então, para um projeto diferente, o comando tmux é como:
bind-key -n C-c kill-session -t different-name
O importante é que bind-key
ele não se destina a uma única sessão. bind-key -n C-c …
altera o comportamento de Ctrl+ cpara todo o servidor tmux. No seu caso, o último bind-key
substitui a tarefa anterior e, em seguida, Ctrl+ cem qualquer sessão irá kill-session -t different-name
.
Acho que você poderia usar a key-table
opção de definir a tabela de chaves padrão para algo diferente root
, separadamente para cada sessão. Em cada nova tabela de chaves você pode definir uma ligação diferente para C-c
. Eu não testei isso, eupensarpode ser possível.
Se eu fosse você, faria uma coisa mais simples. Eu faria isso:
tmux bind-key -n C-c kill-session
kill-session
sem -t
metas oatualsessão, então essa ligação deve fazer o que você deseja my-project-name
ou different-name
qualquer outra sessão.
Francamente, "qualquer outra sessão" é demais para mim. Eu não gostaria de Ctrl+ cmatar tudo na minhapropósito geralsessão(ões). Eu resolveria isso:
deixando
C-c
sozinho e escolhendo outro pressionamento de tecla como "SIGINT global" e, em seguida, usando intencionalmente um ou outro;ou "marcando" explicitamente as sessões que devem usar Ctrl+ ccomo "SIGINT global". Pode ser algo assim:
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'
Agora, em cada sessão que possui
TMUX_GLOBAL_SIGINT
variável não vazia em seu ambiente, Ctrl+ cencerrará a sessão. Em todas as sessões ondeTMUX_GLOBAL_SIGINT
estiver vazio ou não definido Ctrl+ cfuncionará normalmente.Notas:
Para uma sessão já iniciada, você pode alterar a configuração com
tmux set-environment -u TMUX_GLOBAL_SIGINT
outmux set-environment TMUX_GLOBAL_SIGINT 1
(use-t
para direcionar uma sessão específica, não necessariamente a atual).Um shell (ou outro programa) iniciado no tmux pode herdar
TMUX_GLOBAL_SIGINT
. Se for executadotmux new-session …
(dependendo deupdate-environment
tal), a nova sessão também poderá herdar a variável, mesmo sem explícito-e 'TMUX_GLOBAL_SIGINT=1'
. Leiaman 1 tmux
e aprenda como o tmux gerencia o ambiente.