Utilizo tmux para desarrollo, tengo una tarea ejecutándose en una ventana y otra propia. Establecí la convención de que el nombre base del directorio del proyecto es el nombre de la sesión 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"
Todo parece funcionar correctamente, excepto si se inicia un proyecto diferente con la misma convención, de alguna manera CTRL+c en la primera sesión piensa que SESSION_NAME es la de la sesión generada por tmux más reciente, lo cual no es lo que esperaba.
Respuesta1
En el fragmento que publicó, $SESSION_NAME
el shell expande cada aparición de y cada una tmux
obtiene el valor expandido como argumento de la línea de comando.
(Incluso si no fuera así y quisiera expandir esto $SESSION_NAME
más adelante dentro de tmux o dentro de un shell dentro de tmux, puede export SESSION_NAME="my-project-name"
ser inútil debido acómo tmux
se construye el medio ambiente. La update-environment
opción o new-session -e …
comando puede resultar útil).
Esto incluye $SESSION_NAME
en bind-key -n C-c kill-session -t "$SESSION_NAME"
. Tus tmux
ejecuciones:
bind-key -n C-c kill-session -t my-project-name
Luego, para un proyecto diferente, el comando tmux es como:
bind-key -n C-c kill-session -t different-name
Lo importante es que bind-key
en sí mismo no se dirija a una única sesión. bind-key -n C-c …
cambia el comportamiento de Ctrl+ cpara todo el servidor tmux. En su caso, el último bind-key
sobrescribe la tarea anterior y luego Ctrl+ cen cualquier sesión kill-session -t different-name
.
Supongo que podrías usar la key-table
opción para configurar la tabla de claves predeterminada en algo distinto root
, por separado para cada sesión. En cada nueva tabla de claves, puede establecer un enlace diferente para C-c
. No he probado esto, yopensarPuede ser posible.
Si yo fuera tú, haría algo más sencillo. Yo haría esto:
tmux bind-key -n C-c kill-session
kill-session
sin -t
objetivos elactualsesión, por lo que este enlace debe hacer lo que desee para my-project-name
o different-name
cualquier otra sesión.
Francamente "cualquier otra sesión" es demasiado para mí. No quisiera Ctrl+ cmatar todo en mipropósito generalsesión(es). Yo resolvería esto:
ya sea dejándolo
C-c
solo y seleccionando otra pulsación de tecla como "SIGINT global", y luego, sin darse cuenta, usando uno u otro;o "marcando" explícitamente sesiones que deberían usar Ctrl+ ccomo "SIGINT global". Puede ser algo como esto:
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'
Ahora, en cada sesión que tenga
TMUX_GLOBAL_SIGINT
una variable no vacía en su entorno Ctrl+ cfinalizará la sesión. En cada sesión dondeTMUX_GLOBAL_SIGINT
esté vacío o no configurado, Ctrl+ cfuncionará como de costumbre.Notas:
Para una sesión ya iniciada, puede cambiar la configuración con
tmux set-environment -u TMUX_GLOBAL_SIGINT
otmux set-environment TMUX_GLOBAL_SIGINT 1
(úselo-t
para apuntar a una sesión específica, no necesariamente a la actual).Un shell (u otro programa) iniciado en tmux puede heredar
TMUX_GLOBAL_SIGINT
. Si se ejecuta,tmux new-session …
entonces (dependiendo deupdate-environment
ello) la nueva sesión también puede heredar la variable, incluso sin explícito-e 'TMUX_GLOBAL_SIGINT=1'
. Leaman 1 tmux
y aprenda cómo tmux gestiona el medio ambiente.