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:
printf '\033]2;%s\033\\' 'title goes here'
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
Vá para a última linha.
enviado para o terminal interno deve ser tornado
Vá para a próxima à última linha.
quando traduzido e enviado para o terminal externo. Da mesma forma, um LF enviado para o terminal interno deve se tornar
Se o cursor estiver na penúltima linha, role esta linha e todas as linhas acima uma linha acima, para fornecer uma linha próxima à última clara (protegendo a linha de status na última linha). Caso contrário, envie um LF.
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
- seus programas ( instâncias de Node.js ) têm interações de terminal limitadas com os painéis em que estão sendo executados (ou seja, sem posicionamento do cursor), e
- você não redimensiona os painéis enquanto seus programas estão em execução.
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:
#!/bin/sh
# usage: no_scroll_line top|bottom 'non-scrolling line content' command to run with args
#
# Set up a non-scrolling line at the top (or the bottom) of the
# terminal, write the given text into it, then (in the scrolling
# region) run the given command with its arguments. When the
# command has finished, pause with a prompt and reset the
# scrolling region.
get_size() {
set -- $(stty size)
LINES=$1
COLUMNS=$2
}
set_nonscrolling_line() {
get_size
case "$1" in
t|to|top)
non_scroll_line=0
first_scrolling_line=1
scroll_region="1 $(($LINES - 1))"
;;
b|bo|bot|bott|botto|bottom)
first_scrolling_line=0
scroll_region="0 $(($LINES - 2))"
non_scroll_line="$(($LINES - 1))"
;;
*)
echo 'error: first argument must be "top" or "bottom"'
exit 1
;;
esac
clear
tput csr $scroll_region
tput cup "$non_scroll_line" 0
printf %s "$2"
tput cup "$first_scrolling_line" 0
}
reset_scrolling() {
get_size
clear
tput csr 0 $(($LINES - 1))
}
# Set up the scrolling region and write into the non-scrolling line
set_nonscrolling_line "$1" "$2"
shift 2
# Run something that writes into the scolling region
"$@"
ec=$?
# Reset the scrolling region
printf %s 'Press ENTER to reset scrolling (will clear screen)'
read a_line
reset_scrolling
exit "$ec"
Você pode usá-lo assim:
tmux split-window '/path/to/no_scroll_line bottom "Node instance foo" node foo.js'
tmux split-window '/path/to/no_scroll_line bottom "Node instance bar" node bar.js'
tmux split-window '/path/to/no_scroll_line bottom "Node instance quux" node quux.js'
O script também deve funcionar fora do tmux , desde que o terminal suporte e publique seus recursos csr
e do cup
terminfo.