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

12

Estou tentando obter screen para definir meu xterm title. Eu tenho este trabalho fora de screen , mas screen mantém o título que estava em vigor quando eu comecei. Aqui está o meu .bashrc :

function bash_prompt_command() {
    # How many characters of the $PWD should be kept
    local pwdmaxlen=25
    # Indicate that there has been dir truncation
    local trunc_symbol=".."
    local dir=${PWD##*/}
    pwdmaxlen=$(( ( pwdmaxlen < ${#dir} ) ? ${#dir} : pwdmaxlen ))
    NEW_PWD=${PWD/#$HOME/\~}
    local pwdoffset=$(( ${#NEW_PWD} - pwdmaxlen ))
    if [ ${pwdoffset} -gt "0" ]
    then
        NEW_PWD=${NEW_PWD:$pwdoffset:$pwdmaxlen}
        NEW_PWD=${trunc_symbol}/${NEW_PWD#*/}
    fi

    export NEW_PWD
}

PROMPT_COMMAND=bash_prompt_command
# Color chart @ http://wiki.archlinux.org/index.php/Color_Bash_Prompt
case "${TERM}" in
    "xterm")
        TITLEBAR='\[3]0;\u@\h > ${NEW_PWD}
hardstatus alwayslastline
hardstatus string '%{= 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=
function bash_prompt_command() {
    # How many characters of the $PWD should be kept
    local pwdmaxlen=25
    # Indicate that there has been dir truncation
    local trunc_symbol=".."
    local dir=${PWD##*/}
    pwdmaxlen=$(( ( pwdmaxlen < ${#dir} ) ? ${#dir} : pwdmaxlen ))
    NEW_PWD=${PWD/#$HOME/\~}
    local pwdoffset=$(( ${#NEW_PWD} - pwdmaxlen ))
    if [ ${pwdoffset} -gt "0" ]
    then
        NEW_PWD=${NEW_PWD:$pwdoffset:$pwdmaxlen}
        NEW_PWD=${trunc_symbol}/${NEW_PWD#*/}
    fi

    export NEW_PWD
}

PROMPT_COMMAND=bash_prompt_command
# Color chart @ http://wiki.archlinux.org/index.php/Color_Bash_Prompt
case "${TERM}" in
    "xterm")
        TITLEBAR='\[3]0;\u@\h > ${NEW_PWD}
hardstatus alwayslastline
hardstatus string '%{= 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=%pre%7:ds=\E]2;screen%pre%7'

altscreen on
shelltitle '$ |bash'
7\]' 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" ;; "screen") TITLEBAR='\[3]0;\u@\h > ${NEW_PWD}%pre%7\]' 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
7:ds=\E]2;screen%pre%7' altscreen on shelltitle '$ |bash'
7\]' 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" ;; "screen") TITLEBAR='\[3]0;\u@\h > ${NEW_PWD}%pre%7\]' 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á meu .screenrc :

%pre%

O que estou fazendo de maneira incorreta?

Atualização (19 de agosto de 2010): O problema é que você não pode atualizar o título do terminal a partir da tela quando você define alwayslastline . Então, minha solução foi desistir e me contentar com um título predeterminado e útil para minhas sessões de tela. Meus .bashrc e .screenrc atualizados podem ser encontrados no link .

    
por James Sumners 02.07.2009 / 17:08

5 respostas

4

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

Isso fora da tela:

PROMPT_COMMAND='echo -ne "3]0;${USER}@${HOSTNAME}: ${PWD}
PROMPT_COMMAND='echo -ne "3_${USER}@${HOSTNAME}: ${PWD}3\"'
7"'

é equivalente a essa tela interna:

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

Alterando o seu argumento $ {TERM}="screen" titlebar para

PROMPT_COMMAND='echo -ne "3]0;${USER}@${HOSTNAME}: ${PWD}
PROMPT_COMMAND='echo -ne "3_${USER}@${HOSTNAME}: ${PWD}3\"'
7"'

resolverá seu problema.

    
por 02.07.2009 / 23:17
7

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

Na documentação da tela abaixo (no link )

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

O ANSI DCS (Device Control String) é um código de escape que é usado para enviar diretamente para um terminal (acho que esse era o propósito original de muitos anos atrás). Essa string é terminada 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 hardstatus alwayslastline.

DCS = \ 033P, ST = \ 033 \

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

NEW_TITLE="3]0;${PWD/$HOME/~}git clone git://git.savannah.gnu.org/screen.git
git difftool e6618a14^! src/ansi.c
7" echo -ne "3P${NEW_TITLE}3\"

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

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

ESC P (A) Device Control String
          Outputs a string directly to the host terminal without interpretation.
    
por 19.02.2012 / 18:19
1

o crb está certo, mas

a) o código de escape que ele usa não funciona para mim. Deve ser 3k em vez de 3_ . Veja screen (1) sob "TITLES (naming windows)" . Então deveria ser:

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

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

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

termcapinfo xterm 'hs:ts=\E]2;:fs=
XTERM_TITLE="${USER}@${HOSTNAME}: ${PWD}"
SCREEN_TITLE="${PWD}"
PROMPT_COMMAND='echo -ne "3]0;$XTERM_TITLE
PROMPT_COMMAND='echo -ne "3k${USER}@${HOSTNAME}: ${PWD}3\"'
73k$SCREEN_TITLE3\"'
7:ds=\E]2;screen
termcapinfo xterm 'hs:ts=\E]2;:fs=
XTERM_TITLE="${USER}@${HOSTNAME}: ${PWD}"
SCREEN_TITLE="${PWD}"
PROMPT_COMMAND='echo -ne "3]0;$XTERM_TITLE%pre%73k$SCREEN_TITLE3\"'
7:ds=\E]2;screen%pre%7'
7'

(isso também works on my machine para putty)

Então, para definir o título certo para a janela de tela e o título putty / xterm, eu uso algo como:

%pre%

para referência: link

    
por 21.12.2009 / 15:01
1

Eu 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 . Existe também uma ferramenta de linha de comando wmctrl que é capaz de interagir com eles. Usando esta ferramenta, pode-se facilmente alterar 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 o EWMH, mas a maioria dos sistemas Linux deve aceitá-lo.

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

    
por 04.04.2015 / 12:59
0

Nas últimas duas semanas, pesquisei em vários fóruns e não encontrei a resposta para a pergunta:

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

Precisava que outros programas soubessem quando alguns trabalhos em um servidor são feitos e se foram feitos certo ou errado. Plink stdout e stdin não estavam funcionando, eu usei muitos ajustes com atrasos de espera e alguns comandos que funcionavam para outros não. XSEL e XCLIP não puderam ser instalados nesse servidor.

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

  1. Obtenha a saída do comando em um arquivo.
  2. Echo esse arquivo para o título.

No cliente de putty e no servidor suse, é assim:

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

Espero que alguém possa usar isso. Não funcionará para todos os tipos de servidor e configurações de cliente de massa, é claro, mas a ideia deve funcionar bem.

    
por 25.06.2015 / 13:30