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 digitado, o que é bom para mim, mas em alguns casos eu gostaria de alterá-lo. Eu sei o comando Ctrl - A A , mas só muda o título até o próximo comando, e eu gostaria que ele ficasse lá até eu decidir o contrário.

EDITAR: Aqui está a função preexec que encontrei no meu .zshrc

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

2 respostas

8

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

settitle() {
    printf "3k$13\"
}

Em seguida, execute:

settitle NEWTITLE .

Veja documentos de títulos de tela e Tela do GNU para mais detalhes.

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

Você deve procurar por qualquer lugar que \e ou 3 apareça com k ou \ depois, basicamente como meu settitle acima.

UPDATE

Você disse que tinha um personalizado preexec .

Por que não mudar isso:

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

Você pode definir um título personalizado executando:

TITLE="my title"

e desmarque o título executando

TITLE=

Não se esqueça de alterar precmd e $PS1 , se necessário.

ASIDE

Você pode estender isso para todos os terminais (por exemplo, xterm , gnome-terminal , etc.) por não codificar permanentemente o \ek e \e\ .

É assim que eu faço:

terminit()
{
    # determine the window title escape sequences
    case "$TERM" in
    aixterm|dtterm|putty|rxvt|xterm*)
        titlestart='3]0;'
        titlefinish='
if [[ "$TERM" == "screen" ]]; then
   local CMD=${1[(wr)^(*=*|sudo|-*)]}
   settitle "${TITLE:-$CMD}"
fi
7' ;; cygwin) titlestart='3];' titlefinish='
settitle() {
    printf "3k$13\"
}
7' ;; konsole) titlestart='3]30;' titlefinish='
if [[ "$TERM" == "screen" ]]; then
   local CMD=${1[(wr)^(*=*|sudo|-*)]}
   echo -n "\ek${TITLE:-$CMD}\e\"
fi
7' ;; screen*) # status line #titlestart='3_' #titlefinish='3\' # window title titlestart='3k' titlefinish='3\' ;; *) 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}" }

Em seguida, você pode alterar seu preexec para:

TITLE="my title"
    
por 14.02.2011 / 11:44
5

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

Se o comando aparecer como o título da janela enquanto o comando está em execução, isso é feito pela função preexec (em zsh) ou por um emulação do mesmo sob bash .

Se o título mudar quando cada comando for concluído, isso é feito pela função precmd em zsh, o parâmetro PROMPT_COMMAND no bash ou como parte do prompt ( PS1 parameter) em qualquer shell. (O comando para alterar o título é uma seqüência de escape emitida por qualquer aplicativo como parte do fluxo de saída do terminal, para que ele possa ser incorporado em um prompt).

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

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

    
por 14.02.2011 / 22:11