Inicie la sesión tmux y asegúrese de que todos los niños terminen

Inicie la sesión tmux y asegúrese de que todos los niños terminen

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_NAMEel shell expande cada aparición de y cada una tmuxobtiene el valor expandido como argumento de la línea de comando.

(Incluso si no fuera así y quisiera expandir esto $SESSION_NAMEmá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 tmuxse construye el medio ambiente. La update-environmentopción o new-session -e …comando puede resultar útil).

Esto incluye $SESSION_NAMEen bind-key -n C-c kill-session -t "$SESSION_NAME". Tus tmuxejecuciones:

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-keyen 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-keysobrescribe la tarea anterior y luego Ctrl+ cen cualquier sesión kill-session -t different-name.

Supongo que podrías usar la key-tableopció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-sessionsin -tobjetivos elactualsesión, por lo que este enlace debe hacer lo que desee para my-project-nameo different-namecualquier 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-csolo 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_SIGINTuna variable no vacía en su entorno Ctrl+ cfinalizará la sesión. En cada sesión donde TMUX_GLOBAL_SIGINTesté 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_SIGINTo tmux set-environment TMUX_GLOBAL_SIGINT 1(úselo -tpara 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 de update-environmentello) la nueva sesión también puede heredar la variable, incluso sin explícito -e 'TMUX_GLOBAL_SIGINT=1'. Lea man 1 tmuxy aprenda cómo tmux gestiona el medio ambiente.

información relacionada