Forçar título na tela GNU

9

Por padrão, o título de uma sessão de tela é o nome do último comando inserido, o que é bom para mim, mas em alguns casos eu gostaria de alterá-lo. Eu conheço o comando Ctrl- A A, mas ele só altera o título até o próximo comando e eu gostaria que ele permanecesse lá até que eu decidisse o contrário.

EDIT: Aqui está a preexecfunção que encontrei no meu.zshrc

if [[ "$TERM" == "screen" ]]; then
   local CMD=${1[(wr)^(*=*|sudo|-*)]}
   echo -n "\ek$CMD\e\\"
fi
Gregseth
fonte

Respostas:

9

Depende de como as coisas são configuradas, mas, por padrão, algo assim deve funcionar.

settitle() {
    printf "\033k$1\033\\"
}

Então corra:

settitle NEWTITLE.

Consulte a documentação do título da tela e o FAQ da tela do GNU para obter mais detalhes.

Dado que o Ctrl+ A Aestá apenas alterando-o até o próximo comando, provavelmente está sendo definido por $PS1(todos os shells), ou $PROMPT_COMMAND/ DEBUG trap(somente bash) ou precmd/ / preexec(apenas zsh).

Você deve olhar para qualquer lugar que \eou \033aparece com kou \\depois dela, basicamente, como o meu settitleexemplo acima.

ATUALIZAR

Você disse que tinha um costume preexec.

Por que não mudar para isso:

if [[ "$TERM" == "screen" ]]; then
   local CMD=${1[(wr)^(*=*|sudo|-*)]}
   echo -n "\ek${TITLE:-$CMD}\e\\"
fi

Em seguida, você pode definir um título personalizado executando:

TITLE="my title"

e desmarque o título executando

TITLE=

Não se esqueça de mudar precmde $PS1também se necessário.

A PARTE, DE LADO

Você pode até mesmo estender isso para todos os terminais (por exemplo xterm, gnome-terminal, etc.) por não codificação duro a \eke \e\\.

É assim que eu faço:

terminit()
{
    # determine the window title escape sequences
    case "$TERM" in
    aixterm|dtterm|putty|rxvt|xterm*)
        titlestart='\033]0;'
        titlefinish='\007'
        ;;
    cygwin)
        titlestart='\033];'
        titlefinish='\007'
        ;;
    konsole)
        titlestart='\033]30;'
        titlefinish='\007'
        ;;
    screen*)
        # status line
        #titlestart='\033_'
        #titlefinish='\033\'
        # window title
        titlestart='\033k'
        titlefinish='\033\'
        ;;
    *)
        if type tput >/dev/null 2>&1
        then
            if tput longname >/dev/null 2>&1
            then
                titlestart="$(tput tsl)"
                titlefinish="$(tput fsl)"
            fi
        else
            titlestart=''
            titlefinish=''
        fi
        ;;
    esac
}


# or put it inside a case $- in *i* guard
if test -t 0; then
    terminit
fi

# set the xterm/screen/etc. title
settitle()
{
    test -z "${titlestart}" && return 0

    printf "${titlestart}$*${titlefinish}"
}

Então você pode mudar preexecpara:

if [[ "$TERM" == "screen" ]]; then
   local CMD=${1[(wr)^(*=*|sudo|-*)]}
   settitle "${TITLE:-$CMD}"
fi
Mikel
fonte
O comando que você dá faz exatamente a mesma coisa que Ctrl-A A. E sobre o prompt, você quer dizer que eu tenho que modificar $PS1sempre que quiser que o título não mude?
gregseth
Quero dizer, verifique se ele não contém ESC k algo ESC \. O mesmo vale para PROMPT_COMMAND.
Mikel
ESC pode ser escrito \eou \033.
Mikel
Os links docs título tela deve ter as informações necessárias
Mikel
5

Se o título da janela reflete o aplicativo atualmente em execução na janela, é porque seu shell está fazendo isso. Se estiver fazendo isso, é porque sua distribuição, seu administrador de sistema ou você o configurou.

Se o comando aparecer como o título da janela enquanto o comando estiver em execução, isso será feito pela preexecfunção (no zsh) ou por uma emulação do mesmo no bash .

Se o título for alterado quando cada comando for concluído, isso será feito pela precmdfunção zsh, pelo PROMPT_COMMANDparâmetro bash ou como parte do prompt ( PS1parâmetro) em qualquer shell. (O comando para alterar o título é uma sequência de escape emitida por qualquer aplicativo como parte do fluxo de saída do terminal, para que possa ser incorporada em um prompt.)

Procure uma sequência de escape como \e]0;new title\a, \e]2;new title\aou \eknew title\e\\em seu arquivo de inicialização shell ( ~/.bashrc, ~/.zshrc...). Se não houver nada relevante, a configuração pode estar em um arquivo do sistema (por exemplo /etc/bash.bashrc, /etc/zsh/zshrc); substitua esse parâmetro ou função em seu próprio arquivo de inicialização.

Consulte a resposta de Mikel para obter uma configuração de título substituível em preexec.

Gilles 'SO- parar de ser mau'
fonte
Obrigado, você deixou bem claro. Eu realmente encontrei uma preexecfunção definida no meu .zshrc. O problema é que esse é o comportamento que eu quero ... na maioria das vezes. Eu gostaria de poder desativá-lo rapidamente em uma tela específica. Talvez haja uma variável que eu possa obter na preexecfunção quando defino manualmente o título, ou algo assim?
gregseth
@gregseth: É um pouco difícil de explicar em geral, mas se você postar sua preexecfunção, eu ou alguém provavelmente poderá sugerir uma mudança simples.
Gilles 'SO- stop be evil'
Eu ia mencionar preexec, mas Greg não disse que estava usando zsh. Isso vai me ensinar. ;-)
Mikel
@ Mikel: Minha explicação foi melhor que a sua, mas seu novo preexecdesign é melhor que o meu.
Gilles 'SO- stop be evil'
Concordo. :-) Minha resposta original foi tentar ensinar o OP a encontrar a resposta por si mesmo. O seu foi mais útil imediatamente. De qualquer maneira, todos nós vencemos.
Mikel