Esto es casi unrevisión de códigopregunta, pero muy *nixy y más sobre configuración que sobre código. Durante años, desde que cambié a tmux
, screen
he tenido un par de problemas persistentes que no podía hacer funcionar como quería. Desde que configuré mi shell para ejecutarlo en una sesión tmux, finalmente decidí que era hora de arreglar este.
De forma predeterminada, cuando conecta dos clientes tmux a la misma sesión, están bloqueados juntos. Cambie los paneles en uno y ambos cambien sincronizados. Esto es diferente de la pantalla donde el comportamiento predeterminado era un conjunto compartido de paneles pero el cliente en sí era independiente.
Lo que quería era una forma de desvincular dos clientes tmux conectados a la misma sesión. Esto es bastante fácil de hacer si está fuera de tmux y está lanzando un nuevo cliente. Simplemente inicie una nueva sesión con una referencia a la principal:
tmux new-session -t original_session -s new_session
Sin embargo intenta hacer estodespuésestás en un cliente y quieres desvincularlo de cualquier otro cliente que esté compartiendo esa sesión y las cosas se vuelven más complicadas. Probé docenas de formas y nunca encontré ninguna que funcionara bien. Lo más cerca que estuve fue usar bind <key> prompt-command ...
para solicitar los nombres de la sesión nueva y antigua.Por alguna razón, tmux no expande la #{session_name}
variable dentro de los argumentos de a new-session
or prompt-command
.Lo hace en los argumentos de muchos otros comandos (por ejemplo, lo uso a run
continuación), pero sin esa expansión esta tarea en particular se vuelve repentinamente complicada. Incluso al ingresar los valores manualmente, solo funcionó.
Hoy finalmente lo hice funcionar. El resultado, sin embargo, es más feo de lo que me hubiera gustado. Requiere una función de shell para hacer la mayor parte de la magia. Para contener esto solo en el archivo de configuración sin involucrar scripts externos (para la portabilidad del archivo dot), estoy usando un truco. La configuración, si recorta las dos primeras columnas, en realidad es ejecutable como un script de shell. Con todo incluido en funciones, puede llamar solo la parte del script que necesita desde cualquier combinación de teclas. Los bits del script de shell son comentarios en la configuración, mientras que en el script de shell, el bit de configuración se descarta con un aquí-doc.
La solución de hoysalió algo como esto (mi .tmux.conf
archivo completo):
# : << ENDOFCONF
# Clear the default binding
unbind C-c
# Pass the name of the current session to a function to clone it
bind C-c run "cut -c3- ~/.tmux.conf | sh -s clone #S"
# ENDOFCONF
# clone () {
# orig=${1%-*}
# copy="$orig-$(($( tmux list-sessions -F '#S' | sed -nE "/^${orig}-[0-9]+$/{s/[^0-9]//g;p}" | tail -n1 )+1))"
# TMUX= tmux new-session -d -t $orig -s $copy
# tmux switch-client -t $copy
# tmux set -q -t $copy destroy-unattached on
# }
# $@
Eso sí, esto funciona. Desde un cliente tmux en ejecución, Ctrl++ crea una nueva sesión con un número agregado al nombre B Ctrlde Cla actual, usa la actual como destino para los paneles y cambia a ella.
Estoy contento con esto excepto por la molesta idea de que acabo de hacer algo simple mucho más complejo de lo necesario. ¿Existe una forma más sencilla de lograr esto?
Respuesta1
Esto es lo que hice:
alias ta='export NEW_SESSION=\$(uuidgen) ; tmux new-session -t 0 -s \$NEW_SESSION ; tmux kill-session -t \$NEW_SESSION'
Lo que esto hace es crear una nueva sesión a partir de la sesión denominada '0' (cómo se llama la primera sesión si no lo especifica), nombrar algo exclusivamente aleatorio (usando uuidgen) y luego eliminarla cuando me separe.
Tenga en cuenta que estoy usando zsh. 'ta' es la abreviatura de 'tmux adjunto'