Definir o título da janela xterm (PuTTY) ao usar a tela?

12

Estou tentando screendefinir meu xtermtítulo. Eu tenho esse trabalho fora screen, mas screenmantém o título em vigor quando o iniciei. Aqui está o meu .bashrc:

função bash_prompt_command () {
    # Quantos caracteres do $ PWD devem ser mantidos
    local pwdmaxlen = 25
    # Indique que houve truncamento de diretório
    local trunc_symbol = ".."
    dir local = $ {PWD ## * /}
    pwdmaxlen = $ (((pwdmaxlen <$ {# dir})? $ {# dir}: pwdmaxlen))
    NEW_PWD = $ {PWD / # $ HOME / \ ~}
    local pwdoffset = $ (($ {# NEW_PWD} - pwdmaxlen))
    se [$ {pwdoffset} -gt "0"]
    então
        NEW_PWD = $ {NEW_PWD: $ pwdoffset: $ pwdmaxlen}
        NEW_PWD = $ {trunc_symbol} / $ {NEW_PWD # * /}
    fi

    exportar NEW_PWD
}

PROMPT_COMMAND = bash_prompt_command
# Cartela de cores @ http://wiki.archlinux.org/index.php/Color_Bash_Prompt
caso "$ {TERM}" em
    "xterm")
        TITLEBAR = '\ [\ 033] 0; \ u @ \ h> $ {NEW_PWD} \ 007 \]'
        PS1 = "$ {TITLEBAR} \ [\ e [1; 32m \] [\ e [0; 36m \] \ u \ e [1; 32m \] @ \ e [1; 33m \] \ h \ e [ 1; 32m \]] \ e [0; 37m \] \ $ {NEW_PWD} / \ e [1; 32m \] \ $ \ [\ e [0m "
        ;;
    "tela")
        TITLEBAR = '\ [\ 033] 0; \ u @ \ h> $ {NEW_PWD} \ 007 \]'
        ESC = '\ [\ ek \ e \\\]'
        PS1 = "$ {TITLEBAR} \ [\ e [1; 32m \] [\ e [0; 36m \] \ u \ e [1; 32m \]] \ e [0; 37m \] \ $ {NEW_PWD} / \ e [1; 32m \] \ $ $ {ESC} \ [\ e [0m "
        ;;
    *)
        PS1 = "\ [\ e [1; 32m \] [\ e [0; 36m \] \ u \ e [1; 32m \] @ \ e [1; 33m \] \ h \ e [1; 32m \ ]] \ e [0; 37m \] \ $ {NEW_PWD} / \ e [1; 32m \] \ $ \ [\ e [0m "
    ;;
esac

E aqui está o meu .screenrc:

hardstatus alwayslastline
string do status fixo '% {= kg} [% {Y}% H% {g}] [% =% {= kw}%?% - Lw%?% {= b kR} (% {W}% n-% t%? (% u)%?% {= b kR})% {= kw}%?% + Lw%?%?% =% {g}] [% {Y}% l% {g}]% {g} [% {B}% m.% d.% Y% {G}% c% {g}] '

termcapinfo xterm | xterms | xs | rxvt ti @: te @
termcapinfo xterm 'hs: ts = \ E] 2;: fs = \ 007: ds = \ E] 2; tela \ 007'

tela ativa
shelltitle '$ | bash'

O que estou fazendo incorretamente?

Atualização (19 de agosto de 2010): O problema é que você não pode atualizar o título do terminal na tela ao definir alwayslastline. Então, minha solução foi desistir e me contentar com um título predeterminado e útil para minhas sessões de tela. Meu atualizado .bashrce .screenrcpode ser encontrado em http://bitbucket.org/jsumners/rcfiles/src .

James Sumners
fonte

Respostas:

4

Os códigos de escape são diferentes na tela .

Isso fora da tela:

PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'

é equivalente a esta tela interna:

PROMPT_COMMAND='echo -ne "\033_${USER}@${HOSTNAME}: ${PWD}\033\\"'

Alterando seu caso $ {TERM} = "screen" titlebar para

TITLEBAR='\[\033_\u@\h > ${NEW_PWD}\033\\\]'

vai resolver o seu problema.

crb
fonte
Isto não está a funcionar. Eu não entendo o porquê.
2111 James Sumners
Eu determinei que a configuração, hardstatus alwayslastlinecomo faço para, screenimpede a screendefinição do xtermtítulo. Agora, se eu puder descobrir como fazer as duas coisas ao mesmo tempo.
2113 James Sumners
É porque o seu estado físico possui% t (por título)?
crb
Não. Apenas removi isso e obtive o mesmo resultado. Acredito que vou ter que definir um alias para screenque defina o título da janela e, em seguida, inicie o programa. E então, desista dos títulos dinâmicos dos terminais enquanto estiver usando screen. :(
James Sumners
1
bugs.launchpad.net/byobu/+bug/338722/comments/10 diz que é uma limitação na tela
agnul
7

Na verdade, existe uma maneira de enviar seqüências de escape diretamente para o xterm, passando pela tela. Não foi fácil encontrá-lo, mas pelo código da tela (src / ansi.c) acho que existe desde 2005. Tenho ele trabalhando no xterm, no Gnome Terminal e na massa. Encontrei uma nota na fonte mintty indicando que não funciona lá simplesmente porque eles não lidam com o DCS (a menos que tenha sido corrigido recentemente).

Na documentação da tela abaixo (em http://www.gnu.org/software/screen/manual/html_node/Control-Sequences.html )

ESC P (A) Device Control String
          Outputs a string directly to the host terminal without interpretation.

O ANSI DCS (String de controle de dispositivo) é um código de escape usado para enviar diretamente para um terminal (acho que esse era seu objetivo original de muitos anos atrás). Essa string é finalizada com um código de escape ST (String Terminator).

Enrole a string para definir o título da janela do terminal dentro de um bloco DCS..ST, e ele passa pela tela e é atualizado corretamente, mesmo com o status rígido sempre na última linha.

DCS = \ 033P, ST = \ 033 \

Exemplo - para atualizar o título da janela com o diretório de trabalho atual, use

NEW_TITLE="\033]0;${PWD/$HOME/~}\007"
echo -ne "\033P${NEW_TITLE}\033\\"

Antes tarde do que nunca! Espero que isso ajude alguém.

Apenas no caso de eu estar errado sobre as alterações na fonte da tela: estou executando o mais recente do git de sessão de tela, que por sua vez está usando quase o mais recente do git de tela (com algumas alterações específicas para a sessão de tela). Mas as mensagens de log são datadas da tela de 2005 (você pode ver as alterações feitas nessa confirmação com relação ao manuseio do DCS se você clonar o repositório git de tela e usar o comando abaixo).

git clone git://git.savannah.gnu.org/screen.git
git difftool e6618a14^! src/ansi.c
bwillan
fonte
1

crb é meio certo, mas

a) o código de escape que ele usa não funciona para mim. Deve ser em \033kvez de \033_. Veja screen (1)abaixo "TITLES (naming windows)". Então deve ser:

PROMPT_COMMAND='echo -ne "\033k${USER}@${HOSTNAME}: ${PWD}\033\\"'

b) esse tipo de escape é usado apenas para definir o título da janela da tela. Uma instância da tela pode ter várias janelas, cada uma delas com um nome, que é o que é exibido na hardstatuse captioncom a tsequência de escape.

c) o escape normal do bash funciona se você definir o terminfo correto para o xterm em .screenrc:

termcapinfo xterm 'hs:ts=\E]2;:fs=\007:ds=\E]2;screen\007'

(isso também works on my machinepara massa)

Portanto, para definir o título certo para a janela da tela e o título putty / xterm, uso algo como:

XTERM_TITLE="${USER}@${HOSTNAME}: ${PWD}"
SCREEN_TITLE="${PWD}"
PROMPT_COMMAND='echo -ne "\033]0;$XTERM_TITLE\007\033k$SCREEN_TITLE\033\\"'

para referência: http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x395.html

0x89
fonte
1

Não vou responder a pergunta completamente, mas deixe-me sugerir a maneira de resolver o problema. Muitos gerenciadores de janelas suportam a especificação EWMH . Há também uma ferramenta de linha de comando wmctrlcapaz de interagir com eles. Usando esta ferramenta, é possível alterar facilmente o título da janela ativa com o seguinte comando:

  wmctrl -r :ACTIVE: -T "FooTitle"

Também é possível alterar o ícone da janela, o layout e outras propriedades. A ferramenta provavelmente não funcionará para o PuTTY, pois o Windows não suporta EWMH, mas a maioria dos sistemas Linux deve aceitá-lo.

Com esse método, não importa se você usa screenou não.

grwlf
fonte
0

Nas últimas 2 semanas, procurei em muitos fóruns e não encontrei a resposta para a pergunta:

Como obter toda a saída do comando para o título Putty?

É necessário que outros programas saibam quando alguns trabalhos em um servidor estão concluídos e se estão certos ou errados. O plink stdout e stdin não estavam funcionando, usei muitos ajustes com atrasos de espera e para alguns comandos que funcionaram para outros não. Não foi possível instalar o XSEL e o XCLIP nesse servidor.

Então, aqui está a solução:

  1. Obter saída do comando em um arquivo.
  2. Faça o eco desse arquivo no título.

No cliente de massa e no servidor suse, fica assim:

ls /home | grep domagaja > logutoit.txt 
echo -e "\033]0\\;$(cat logutoit.txt)\\007\\c"

Espero que alguém seja capaz de usar isso. Obviamente, não funcionará para todos os tipos de servidor e configurações de massa de vidraceiro, mas a ideia deve funcionar bem.

Jacek Domagała
fonte