¿Cómo consigo que tmux abra un conjunto de paneles sin ingresarlos manualmente?

30

Por lo tanto, quiero hacer una tmuxsesión específica del proyecto que muestre ciertos comandos en ciertos paneles automáticamente. Después de un tutorial en línea y la tmuxpágina de manual, esto es lo que se me ocurre para un archivo de configuración:

new -n estruct ls
neww -n estruct2 ls
splitw -v -p 50 -t 0 ls

El resultado es ... nada. tmuxcomienza con una sola ventana y un solo panel en esa ventana sin comandos ejecutados.

¿Cómo haría para crear un archivo de configuración que realmente me permita crear un conjunto de ventanas y paneles con ciertos comandos pre-ejecutados?

SOLO MI OPINIÓN correcta
fuente

Respuestas:

36

Su archivo de configuración está funcionando, pero hay un par de complicaciones.

Comandos de corta duración

Primero, los comandos que está iniciando (instancias de ls ) terminan de ejecutarse muy rápidamente. Se crean las ventanas y los paneles para los comandos, pero desaparecen en cuanto sale cada comando.

Si su objetivo es utilizar dichos comandos de "un disparo" en su configuración final, entonces probablemente debería usar la opción de ventana remain-on-exit(y posiblemente la opción de sesión set-remain-on-exitpara proporcionar un valor predeterminado para todas las ventanas creadas en la sesión). Cuando remain-on-exitse configura para una ventana, no desaparecerá cuando salga el comando. Probablemente desee asignar el mapa respawn-windowa una tecla (nota: respawn-windowreaparecerá el comando original; respawn-panetambién está disponible en tmux 1.5 para reaparecer paneles individuales).

bind-key R respawn-window

# set global r-o-e so that initial window of initial session gets it
set -g set-remain-on-exit on

# create a session and its windows/panes
new -n estruct ls
neww -n estruct2 ls
splitw -v -p 50 -t 0 ls

# restore global r-o-e
set -g set-remain-on-exit off

# let session r-o-e inherit from global value for future windows
set -u set-remain-on-exit

O, si no le importa que su ventana inicial sea el número 1 en lugar del número 0, entonces podemos evitar cambiar el valor global:

bind-key R respawn-window

# create a session with a throw-away window
new true

# for future windows, stay open after the command exits
set set-remain-on-exit on

# create the windows we really want
neww -n estruct ls
neww -n estruct2 ls
splitw -v -p 50 -t 0 ls

# for future windows, revert r-o-e to global value
set -u set-remain-on-exit

Si solo estaba usando lsun comando de marcador de posición simplificado y realmente tiene la intención de generar algún tipo de comando interactivo en sus ventanas / paneles, entonces probablemente debería generar el comando que pretendía ejecutar eventualmente. Si el comando destinado tarda demasiado tiempo en el arranque para utilizarlo durante tmux prueba, a continuación, sustituir una concha u otro comando simple interactiva (por ejemplo top, sqlite3, etc.).

new-session Es el comando predeterminado

En segundo lugar, ejecutar tmux sin un argumento de comando (por ejemplo tmux) es equivalente a usar el new-sessioncomando ( tmuxes decir, es lo mismo que tmux new-session). Su .tmux.confcrea una sesión para sus ventanas / paneles ( newes un alias para new-session) y se está creando otra sesión para el new-sessioncomando implícito especificado al iniciar tmux sin un argumento de comando. Si está utilizando la barra de estado predeterminada, verá un [1]en el lado izquierdo de la barra de estado cuando esté en la sesión "extra" (la sesión inicial creada en el .tmux.confes el número 0).

Si desea evitar crear la sesión adicional, utilice en tmux attachlugar de simple tmux. Los comandos de su .tmux.confse ejecutarán, creando la sesión 0, y luego su cliente se conectará a esa sesión en lugar de crear una nueva.

Chris Johnsen
fuente
2
OK, tal vez estoy siendo tan grueso como un sándwich de ballena, pero en este momento tengo un archivo de configuración que solo contiene splitw, nada más, y todavía no obtengo una pantalla dividida porque lo dice No se puede establecer la sesión actual. Si agrego newantes, obtengo ... una ventana, un panel. No puedo parecer, por mi vida, obtener dos paneles al inicio.
SOLO MI OPINIÓN correcta
1
Un archivo de configuración con new, luego splitwfunciona para mí cuando inicio tmux vía tmux attach. Una cosa para recordar es que .tmux.conf(o el archivo especificado con la -fopción) solo se usa si no hay un servidor que ya se esté ejecutando. Compruebe si un servidor se está ejecutando a través de tmux ls. Si desea ejecutar los comandos desde un archivo cuando un servidor ya se está ejecutando, hágalo así: tmux source-file /path/to/conf-file-that-creates-a-session-and-windows \; attach(si ejecuta esto cuando no hay servidor, su .tmux.conf(o el -farchivo) se ejecutará primero y luego su source-filearchivo).
Chris Johnsen
El archivo de configuración se especifica con -f, así que voy tmux new -f myconfig. El contenido de ese archivo de configuración contiene solo new seguido de splitw. Estoy matando todos y cada uno de los procesos tmux antes de probar la línea de comando tmux -f myconfig. No consigo dos paneles. Estoy realmente perdido aquí con qué hacer más allá de este punto (aparte de renunciar a tmux).
SOLO MI OPINIÓN correcta
44
@Just: ya sea que lo use -fo no, tmuxsin un argumento de comando es lo mismo que tmux new-session(para los nuevos servidores, creará una nueva sesión además de lo que haga su archivo de configuración). Su ventana pre-dividida se crea en la sesión 0, pero el new-sessioncomando implícito está creando (y adjuntando) una sesión adicional (sesión 1; busque [1]en su línea de estado). Use tmux -f myconfig attachpara evitar crear la nueva sesión que oculta su ventana pre-dividida.
Chris Johnsen
1
OK, supongo que aprender a leer eventualmente me valdrá la pena. :) Gracias por el esfuerzo y la respuesta. Todo está funcionando bien ahora. Desearía que hubiera una reputación "tipping jar" aquí para poder darte más que una respuesta aceptada.
SOLO MI OPINIÓN correcta
9

No estoy seguro de entender lo que quieres decir con "ingresar manualmente", pero así es como lo hago. Escribí un script de "inicio automático" que inicia mi administrador de ventanas. Contiene:

tmux start-server                                                                                                                                                                                                                                                                                                                                                            
for i in ~/sessions_tmux/*.session; do "$i"; done

donde cada archivo .session se ve así:

#!/bin/bash

SESSION_NAME="flaskr_tutorial"
if [[ ! -z "$TMUX" ]] || [[ ! -z "$TMUX_PANE" ]]; then
    echo "Already inside a tmux session, do not know what to do"
    exit 1
fi
tmux -q has-session -t "$SESSION_NAME"
if [ $? ]; then
    exit 0
fi
NEWCWD=~/projects/flaskr/
( cd "${NEWCWD}"; tmux new-session -d -s "$SESSION_NAME" )
tmux send-keys -t "$SESSION_NAME" 'vim flaskr.py' Enter
( cd "${NEWCWD}"; tmux split -h -t "$SESSION_NAME" )
tmux send-keys -t "$SESSION_NAME" 'sudo tail -F -n 100 /var/log/messages | ccze' Enter

¡Espera, hay más! Tengo un número cada vez mayor de archivos .session que cargo con konsole:

konsole --background-mode --profile Shell --tabs-from-file ~/sessions_tmux/work_console.tabs

donde work_console.tabs se parece a esto:

.
.
.
title: projectx;;    command: tmux attach -t projectx
title: flaskr;;      command: tmux attach -t flaskr_tutorial
.
.
.

Luego presiono F12 para iniciar konsole.

John Schmitt
fuente
konsole parece estar roto, así que me cambié a Terminal , que funciona bien. Tengo una publicación más detallada en la lista de correo tmux-users.
John Schmitt
1
Solo un pequeño comentario, puede reemplazar '! -z 'con' -n 'en tus pruebas;)
lilorox
6

supongamos que desea iniciar 3 tareas de supervisión del servidor (aquí ping localhost) no hay necesidad de meterse con archivos de configuración y sesiones guardadas. Todo se puede hacer desde la línea de comandos.

tmux new-session 'ping  127.0.0.1' \; \
    split-window 'ping  127.0.0.1' \; \
    split-window 'ping  127.0.0.1' \; \
    select-layout even-vertical
Jasen
fuente
Gracias por la simplicidad, ¡exactamente el ejemplo que estaba buscando!
dsz
5

Encontré que teamocil era muy útil para automatizar las ventanas / sesiones de tmux.

Está escrito en Ruby, así que necesitas instalarlo.

Aquí hay una configuración de muestra:

session:
  name: 'my project'
  windows:
    -name: vim
     root: '~/code/my_project'
     splits:
       - cmd: vim
       - cmd: guard

Puede tener una disposición de ventanas y divisiones.

Kris
fuente
4

Otra alternativa similar a teamcoil es tmuxinator , está en desarrollo activo y funciona bastante bien. También se recomienda (y se revisa) en el increíble tmux: Desarrollo productivo sin mouse de The Pragmatic Bookshelf .

Pablo Olmos de Aguilera C.
fuente
Lo encontré un poco más limpio que teamocil (pero muy similar) y lo estoy usando en este momento. ¡Estoy muy contento con cómo funciona!
Aktau
4

** **

  • ¡Mejor guarde su sesión!

** Descubrí que para un administrador perezoso como yo, preferiría guardar la sesión de tmux, en lugar de pasar horas tratando de construirlo perfectamente. Estoy administrando más de 30 servidores, y mis sesiones tmux son dinámicas, y la configuración cambia todo el tiempo. Fue un dolor en el cuello, hasta que recientemente descubrí tmux-resurrect este complemento es simplemente genial. Darle una oportunidad. Actualmente, los repositorios de Ubuntu tienen tmux 1.8, este complemento necesita 1.9, por lo que necesitaría actualizarlo manualmente

sudo apt-get install python-software-properties software-properties-common
sudo add-apt-repository ppa:pi-rho/dev
sudo apt-get update
sudo apt-get install  tmux=2.0-1~ppa1~t

Después de lo cual puedes instalarlo

git clone https://github.com/tmux-plugins/tmux-resurrect ~/clone/path

Luego, coloque esta línea en la parte inferior de ~ / .tmux.conf (si ~ / .tmux.conf no está disponible, cree un archivo vacío)

run-shell ~/clone/path/resurrect.tmux

También agrego esta línea al final de ~ / .tmux.conf para que el complemento guarde sesiones para todos los programas que ejecuto

set -g @resurrect-processes ':all:'

Luego vuelva a cargar el entorno tmux.

tmux source-file ~/.tmux.conf

¡Eso es! Estás listo. Ahora, ejecute tmux como de costumbre, cambie el tamaño de sus paneles, cree nuevos paneles, cree nuevas sesiones ... etc. Cuando esté satisfecho con la configuración que alcanzó (en varias ventanas y varias sesiones), simplemente haga clic en ctrl + b y luego ctrl + s para guardar la sesión. Para probar los resultados, simplemente mate todos los tmux

killall tmux

Luego, ejecuta nuevamente tmux

tmux

Luego, desde tmux, haga clic en Ctrl + B y luego Ctrl + R (para restaurar) Mágicamente, todas sus ventanas, paneles y sesiones se restauran con la misma geometría y disposición. Espero que esto ayude.

usuario1757247
fuente