Como configurar corretamente o GNU Screen para exibir o programa atualmente em execução no hardstatus

3

No bash, para exibir o nome do programa atual na linha de hardstatus do GNU Screen, são necessárias apenas duas linhas de configuração. Primeiro, diga à tela como normalmente é o final do seu prompt e forneça um título padrão para uma janela quando você estiver no shell:

shelltitle "$ |bash"

Em seguida, coloque esta seqüência de escape na variável PS1, antes dos caracteres que normalmente terminam o prompt '$ ' neste caso: 3k3\

Esta técnica funciona, até certo ponto. O título da janela hardstatus é atualizado para o nome do programa em execução no momento e, em seguida, retorna para o título padrão logo após a conclusão da execução. Um grande problema, no entanto, é que essa string de escape não é escapada por si só, causando problemas de quebra de linha com comandos maiores que a linha inicial.

Isso foi chato, então comecei a procurar uma solução. Acontece que, simplesmente escapando da sequência de escape anterior corrige quebra de linha: \[3k\]\[3\\]

Ótimo! Meu título da janela do hardstatus ainda é atualizado para o nome do programa em execução no momento, e agora meus comandos mais longos são agrupados na segunda linha corretamente. No entanto, com essa nova seqüência de escape no meu PS1, a tela atualiza o título da janela para o comando real que estou digitando, não apenas o nome do programa atual, uma vez executado.

Eu estou querendo saber se alguém já fez isso funcionar corretamente - por exemplo, quebra automática de linha e atualização adequada do título da janela hardstatus?

    
por johnny_bgoode 15.11.2010 / 16:21

1 resposta

4

Eu não acho que a tela seja o lugar certo para atualizar essa cópia. É muito fácil de fazer a partir das configurações da sua shell. Você pode definir uma função preexec() em seu arquivo shellrc que envia detalhes sobre o que está prestes a executar antes de executá-lo. Você pode imprimir a partir daí para dizer à tela para alterar o título da janela atual. Eu estou usando zsh, não bash, então sua milhagem irá variar, mas eu sei que as mesmas coisas são possíveis lá também. Para referência no meu arquivo zshrc eu tenho algo assim:

# If running in screen, set the window title to the command about to be executed
preexec() {
    [ -n "$WINDOW" ] && print -Pn "^[k$2^[\"
}

# If in screen, blank the window title when displaying the prompt
premd() {
    [ -n "$WINDOW" ] && print -Pn "^[k ^[\"
}

Na realidade, faço uma limpeza do comando antes de exibi-lo como título. Por exemplo, você poderia usar print -Pn "^[k'echo $2|perl -pne 's!\s.*/! !g'|cut -c1-16'^[\" no preexec () acima para mostrar informações muito mais limpas sobre o que está prestes a ser executado. Isso elimina os caminhos para apenas o último componente e faz alguns truques ninja.

    
por 19.02.2011 / 14:44