Em minha máquina local, tenho 3 instâncias de node.js em execução simultaneamente. Cada um tem seu próprio painel em uma janela do tmux chamada "servidores". O problema é que não é tão fácil descobrir qual nó está sendo executado em qual painel, porque seus logs são semelhantes.
O que preciso é de um título para cada painel. Como descobri, o tmux em si não tem esse recurso: ele só tem títulos para janelas e não para painéis. Lançar uma sessão tmux separada dentro de cada painel para cada instância do node.js parece um exagero.
Então, há algum pequeno programa que inicia um comando, envolvendo sua saída com uma barra de status especificada?
desde já, obrigado
command-line
title
tmux
pane
Andrey Lushnikov
fonte
fonte
Respostas:
O tmux oferece suporte a títulos por painel, mas não fornece uma localização por painel para exibir esses títulos.
Você pode definir o título de um painel com a sequência de escape ESC
]2;
… ESC\
(por exemplo, consulte a seção chamada Nomes e títulos na página de manual do tmux ). Você poderia fazer isso a partir do shell assim:O título de cada painel é padronizado para o nome do host do sistema. Por padrão, o título do painel ativo é exibido no lado direito da linha de status do tmux (o valor global padrão da variável de sessão
status-right
é"#22T" %H:%M %d-%b-%y
, que mostra 22 caracteres do título do painel, a hora e a data).Portanto, contanto que você esteja satisfeito em poder ver o título do painel ativo (ou seja, disposto a alternar os painéis para ver o título de um painel inativo), você pode continuar com a funcionalidade padrão. Basta enviar a sequência de escape de definição de título apropriada antes de iniciar o comando principal para cada painel.
Se você precisa absolutamente de uma linha dedicada para exibir algumas informações por painel, então as sessões aninhadas do tmux podem não ser tão (desnecessárias) “exageradas” como você pode pensar.
No caso geral, para fornecer uma linha de status inviolável em algum terminal determinado, você precisará de um (re) emulador de terminal completo que fica entre o terminal original e um novo terminal (um com menos linhas). Essa (re) emulação é necessária para traduzir as sequências de controle enviadas para o terminal interno e traduzi-las para o terminal original. Por exemplo, para manter uma linha de status na parte inferior do terminal externo, o comando
enviado para o terminal interno deve ser tornado
quando traduzido e enviado para o terminal externo. Da mesma forma, um LF enviado para o terminal interno deve se tornar
no terminal externo.
Programas como tmux e screen são apenas esses reemuladores de terminal. Claro, há muitas outras funcionalidades envolvidas no emulador de terminal, mas você precisaria de um grande pedaço de código de emulação de terminal apenas para fornecer uma linha de status confiável .
Existe, no entanto, uma solução leve, desde que
Como muitos emuladores de terminal, o tmux suporta um comando de controle de terminal “set scrolling region” em seus painéis. Você pode usar este comando para limitar a região de rolagem às N-1 linhas superiores (ou inferiores) do terminal e escrever algum tipo de texto de identificação de instância na linha não rolante.
As restrições (nenhum comando de movimento do cursor permitido, nenhum redimensionamento) são necessárias porque o programa que está gerando a saída (por exemplo, uma instância do Node.js ) não tem ideia de que a rolagem foi limitada a uma região específica. Se o programa de geração de saída mover o cursor para fora da região de rolagem, a saída pode ficar distorcida. Da mesma forma, o emulador de terminal provavelmente redefine automaticamente a região de rolagem quando o terminal é redimensionado (então a “linha não rolante” provavelmente acabará rolando para longe).
Eu escrevi um script que usa
tput
para gerar as sequências de controle apropriadas, escrever na linha não rolante e executar um programa depois de mover o cursor para a região de rolagem:Você pode usá-lo assim:
O script também deve funcionar fora do tmux , desde que o terminal suporte e publique seus recursos
csr
e docup
terminfo.fonte
tput
para incluir as sequências de controle apropriadas no argumento “conteúdo da linha”. Com a maioria dos terminais, você pode fazer com que a linha seja “ciano (6) e verde (3) em magenta (5)” comno_scroll_line top "$(tput setaf 6; tput setab 5)Node: $(tput setaf 3)foo$(tput op)" node foo.js
.setaf
define o primeiro plano,setab
define o plano de fundo,op
restaura as cores padrão dos terminais. Os recursos de cores variam de 0–7, 0–15, 0–87 ou 0–255, dependendo da emulação do terminal.Esta funcionalidade foi adicionada ao tmux neste commit . Não está na versão 2.2, mas parece que estará na 2.3.
Para habilitá-lo:
ou se preferir:
Para definir um texto personalizado como a linha de status da borda do painel, você pode fazer uso
pane-border-format
, por exemplo:fonte
tmux
você precisa de algum comando externotmux
para alterá-lo. Direito? Ou existe alguma sequência interna que pode atualizá-lo?pane-border-format
para definir uma string de formato personalizado para o painel exibir (o#{...}
formato normal ). Eu editei sua resposta para incluir isso.Já que
tmux 2.6
você pode fazer:Você pode ver o título por painel em uma barra de status com:
Desative a barra de status com:
fonte
cd $HOME
, o título é alterado para o valor de$HOME
. (Estou vendo isso no tmux 2.8.)set-window-option automatic-rename off
.set-option -g allow-rename off
em meu.tmux.conf
arquivo.pane-border-format
uma variável fornecida pelo usuário (não tenho certeza se existe um nome oficial para esse recurso) para controlar o que é exibido. Aqui está um exemplo.Estou trabalhando na barra de status do painel para tmux - ticket. Meu branch de desenvolvimento pode ser encontrado aqui no github: https://github.com/jonathanslenders/tmux
No momento, isso já adiciona um comando "título" de painel de renomeação funcional . Ainda existem alguns bugs e a API irá melhorar. A ideia é criar uma barra de status por painel, que pode ter alguma formatação, como a barra de status da sessão. Como o resto do tmux, tudo deve se tornar programável e personalizável. Quando finalizado e estável, provavelmente será incluído no tmux oficial.
fonte
Estou usando o tmux versão 2.3, acho que o estilo de borda não é suportado nas versões anteriores. Isto é o que funcionou para mim:
Para cada painel, defina o título:
Então:
fonte
select-pane -T "my title"
faça isso. Você pode até configurar uma vinculação de chave, portanto, basta fornecer o título:bind-key T command-prompt -p "New title:" 'select-pane -T "%%"'
pane-border-status
opção for definida como algo (top
oubottom
).Um gif vale mais que mil palavras. ( fonte )
tmux-xpanes é um divisor de terminal baseado em tmux, que suporta a exibição de títulos para cada painel por meio da
-t
opção recém-adicionada .fonte
Sim, existe tal comando a:
tmux
. Dê um nome à sua sessão e ele será exibido em uma barra de status interna:fonte
Isso não é útil em curto prazo, mas há uma solicitação de recurso para títulos por painel no tmux: http://sourceforge.net/tracker/?func=detail&aid=3495916&group_id=200378&atid=973265#
Nesse ínterim, como outros mencionaram, aninhando tmux funciona decentemente.
fonte
TL; DR
Anexe as seguintes configurações ao seu arquivo de configuração tmux (no meu caso é
~/.tmux.conf.local
)então corra:
Aproveite
Graças a https://stackoverflow.com/a/37602055/5121972
fonte