Como faço para o tmux abrir um conjunto de painéis sem inseri-los manualmente?


30

Então, eu quero fazer uma tmuxsessão específica do projeto que exiba certos comandos em determinados painéis automaticamente. Seguindo um tutorial on - line e a tmuxpágina de manual, é isso que eu proponho para um arquivo de configuração:

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

O resultado é ... nada. tmuxinicia com uma única janela e painel único nessa janela sem nenhum comando executado.

Como eu faria para criar um arquivo de configuração que realmente me permita criar um conjunto de janelas e painéis com determinados comandos pré-executados?

Respostas:


36

Seu arquivo de configuração está funcionando, mas há algumas complicações.

Comandos de curta duração

Primeiro, os comandos que você está iniciando (instâncias de ls ) terminam a execução muito rapidamente. As janelas e painéis dos comandos são criados, mas desaparecem assim que cada comando é encerrado.

Se seu objetivo é realmente usar esses comandos "one shot" em sua configuração eventual, provavelmente você deve usar a opção window remain-on-exit(e possivelmente a opção session set-remain-on-exitpara fornecer um padrão para todas as janelas criadas na sessão). Quando remain-on-exitestá definido para uma janela, não desaparece quando o comando é encerrado. Provavelmente, você deseja mapear a respawn-windowchave (note: respawn-windowirá reaparecer o comando original; respawn-panetambém está disponível no tmux 1.5 para reaparecer painéis individuais).

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

Ou, se você não se importa que sua janela inicial seja o número 1 em vez do número 0, podemos evitar a alteração do 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

Se você estava usando apenas lscomo um comando de espaço reservado simplificado e realmente pretende gerar algum tipo de comando interativo em suas janelas / painéis, provavelmente deve gerar o comando que pretendia executar eventualmente. Se o seu comando destina-se leva muito tempo para inicialização para usá-lo durante tmux testes, então substituir uma concha ou outro simples comando interativa (por exemplo top, sqlite3, etc.).

new-session É o comando padrão

Segundo, executar o tmux sem um argumento de comando (por exemplo tmux) é equivalente a usar o new-sessioncomando (ou seja, tmuxé o mesmo que tmux new-session). Você .tmux.confcria uma sessão para suas janelas / painéis ( newé um alias para new-session) e outra sessão está sendo criada para o new-sessioncomando implícito especificado ao iniciar o tmux sem um argumento de comando. Se você estiver usando a barra de status padrão, verá um [1]no lado esquerdo da barra de status quando estiver na sessão "extra" (a sessão inicial criada no .tmux.confnúmero 0).

Se você deseja evitar criar a sessão extra, use em tmux attachvez de simples tmux. Os comandos do seu .tmux.confserão executados, criando a sessão 0 e, em seguida, seu cliente será anexado a essa sessão em vez de criar uma nova.


2
OK, talvez eu esteja sendo tão grosso quanto um sanduíche de baleia aqui, mas agora eu tenho um arquivo de configuração que contém apenas splitw- nada mais - e ainda não estou recebendo uma tela dividida porque diz não pode estabelecer a sessão atual. Se eu adicionar newantes, recebo ... uma janela, um painel. Não consigo parecer, para a minha vida, ter dois painéis na inicialização.
APENAS MINHA OPINIÃO correta

1
Um arquivo de configuração com newe splitwfunciona para mim quando inicio o tmux via tmux attach. Uma coisa a lembrar é que o .tmux.conf(ou o arquivo especificado com a -fopção) será usado apenas se ainda não houver um servidor em execução. Verifique se um servidor está sendo executado via tmux ls. Se você deseja executar os comandos de um arquivo quando um servidor já está em execução, faça o seguinte: tmux source-file /path/to/conf-file-that-creates-a-session-and-windows \; attach(se você executar isso quando não houver servidor, seu .tmux.conf(ou o -farquivo) será executado primeiro e depois o source-filearquivo).
Chris Johnsen

O arquivo de configuração está sendo especificado com -f - então eu vou tmux new -f myconfig. O conteúdo desse arquivo de configuração contém apenas new seguido por splitw. Estou matando todo e qualquer processo tmux antes de tentar a linha de comando tmux -f myconfig. Eu não entendo dois painéis. Estou realmente sem saber o que fazer além deste ponto (além de desistir do tmux).
APENAS MINHA OPINIÃO correta

4
@ Apenas: Se você usa -fou não, tmuxsem um argumento de comando, é o mesmo tmux new-session(que, para novos servidores, criará uma nova sessão em cima do que o seu arquivo de configuração fizer). Sua janela pré-dividida é criada na sessão 0, mas o new-sessioncomando implícito está criando (e anexando a) uma sessão extra (sessão 1; procure [1]na linha de status). Use tmux -f myconfig attachpara evitar a criação da nova sessão que está ocultando sua janela pré-dividida.
Chris Johnsen

1
OK, acho que aprender a ler acabará sendo recompensado por mim. :) Obrigado pelo esforço e pela resposta. Tudo está funcionando bem agora. Eu gostaria que houvesse uma reputação de "jarra de gorjeta" aqui para que eu pudesse lhe dar mais do que apenas uma resposta aceita.
APENAS MINHA OPINIÃO correta

9

Não sei se entendi o que você quer dizer com "inserindo manualmente", mas é assim que faço. Eu escrevi um script de "inicialização automática" que meu gerenciador de janelas inicia. Contém:

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

onde cada arquivo .session se parece com isso:

#!/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

Espere, tem mais! Eu tenho um número crescente de arquivos .session que carrego com o konsole:

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

onde work_console.tabs se parece com isso:

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

Então eu pressiono F12 para iniciar o konsole.


O konsole parece estar quebrado, então mudei para o Terminal , que funciona bem. Tenho uma postagem mais detalhada na lista de discussão tmux-users.
John Schmitt

1
Apenas um pequeno comentário, você pode substituir '! -z 'com' -n 'em seus testes;)
lilorox 28/11

6

suponha que você queira iniciar três tarefas de monitoramento do servidor (aqui execute ping localhost), não há necessidade de mexer nos arquivos de configuração e nas sessões salvas. Tudo isso pode ser feito na linha de comando.

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

Obrigado pela simplicidade - exatamente o exemplo que eu estava procurando!
dsz 17/09/2015

5

Achei o teamocil muito útil para automatizar as janelas / sessões do tmux.

Está escrito em Ruby, então você precisa disso instalado.

Aqui está uma configuração de amostra:

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

Você pode ter um arranjo de janelas e divisões.



4

**

  • Melhor salvar sua sessão!

** Descobri que para um administrador preguiçoso como eu, prefiro salvar a sessão do tmux, em vez de passar horas tentando construí-lo perfeitamente. Estou administrando mais de 30 servidores e minhas sessões tmux são dinâmicas, com a configuração mudando o tempo todo. Foi uma dor no pescoço, até que eu descobri recentemente que o tmux-ressurrect é ótimo. De uma chance. Atualmente, os repositórios do Ubuntu têm o tmux 1.8, este plug-in precisa de 1.9, então você precisa atualizar 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

Após o qual você pode instalá-lo

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

Em seguida, instale esta linha na parte inferior de ~ / .tmux.conf (se ~ / .tmux.conf não estiver disponível, crie um arquivo vazio)

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

Também adiciono esta linha no final do ~ / .tmux.conf, para que o plug-in salve sessões para todos os programas que corro

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

Em seguida, recarregue o ambiente tmux.

tmux source-file ~/.tmux.conf

É isso aí! Você terminou. Agora, execute o tmux normalmente, redimensione seus painéis, crie novos painéis, crie novas sessões ... etc. Quando estiver satisfeito com a configuração alcançada (em várias janelas e várias sessões), basta clicar em ctrl + b e, em seguida, em ctrl + s para salvar a sessão. Para testar os resultados, basta matar todos os tmux

killall tmux

Em seguida, execute novamente o tmux

tmux

Em seguida, no tmux, clique em ctrl + b e, em seguida, ctrl + r (para restauração) Magicamente, todas as janelas, painéis e sessões são restaurados com a mesma geometria e disposição. Espero que isso ajude.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.