¿Establecer el título de la ventana xterm (PuTTY) al usar la pantalla?

12

Estoy tratando screende establecer mi xtermtítulo. Tengo esto trabajando fuera de screen, pero screenmantiene cualquier título que estaba en su lugar cuando lo comencé. Aquí está mi .bashrc:

función bash_prompt_command () {
    # ¿Cuántos caracteres de $ PWD deben mantenerse?
    pwdmaxlen local = 25
    # Indica que ha habido truncamiento dir
    local trunc_symbol = ".."
    dir local = $ {PWD ## * /}
    pwdmaxlen = $ (((pwdmaxlen <$ {# dir})? $ {# dir}: pwdmaxlen))
    NEW_PWD = $ {PWD / # $ HOME / \ ~}
    pwdoffset local = $ (($ {# NEW_PWD} - pwdmaxlen))
    if [$ {pwdoffset} -gt "0"]
    luego
        NEW_PWD = $ {NEW_PWD: $ pwdoffset: $ pwdmaxlen}
        NEW_PWD = $ {trunc_symbol} / $ {NEW_PWD # * /}
    fi

    exportar NEW_PWD
}

PROMPT_COMMAND = bash_prompt_command
# Carta de colores @ http://wiki.archlinux.org/index.php/Color_Bash_Prompt
caso "$ {TERM}} en
    "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 "
        ;;
    "pantalla")
        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

Y aquí está mi .screenrc:

hardstatus alwayslastline
cadena de estado duro '% {= 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; pantalla \ 007'

altscreen en
shelltitle '$ | bash'

¿Qué estoy haciendo incorrectamente?

Actualización (19 de agosto de 2010): el problema es que no puede actualizar el título del terminal desde la pantalla cuando configura alwayslastline. Entonces, mi solución fue simplemente rendirme y conformarme con un título predeterminado y útil para mis sesiones de pantalla. Mi actualizado .bashrcy .screenrcse puede encontrar en http://bitbucket.org/jsumners/rcfiles/src .

James Sumners
fuente

Respuestas:

4

Los códigos de escape son diferentes dentro de la pantalla .

Esto fuera de la pantalla:

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

es equivalente a esta pantalla interior:

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

Cambiar su caso $ {TERM} = "pantalla" barra de título a

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

Resolverá su problema.

crb
fuente
Esto no está funcionando. No entiendo por qué.
James Sumners el
He determinado que la configuración hardstatus alwayslastlinecomo lo hago para screenimpide screenestablecer el xtermtítulo. Ahora, si puedo descubrir cómo hacer ambas cosas al mismo tiempo.
James Sumners el
¿Es porque su estado duro tiene% t (por título)?
crb
No Simplemente eliminé eso y obtuve el mismo resultado. Creo que voy a tener que establecer un alias para screenque establezca el título de la ventana y luego inicie el programa. Y luego simplemente renunciar a los títulos de terminales dinámicos mientras se usa screen. :(
James Sumners
1
bugs.launchpad.net/byobu/+bug/338722/comments/10 dice que es una limitación en la pantalla
agosto
7

En realidad, hay una manera de enviar secuencias de escape directamente al xterm, pasando por la pantalla. No fue fácil de encontrar, pero desde el código de la pantalla (src / ansi.c) creo que ha estado allí desde 2005. Lo tengo trabajando en xterm, Gnome Terminal y putty. Encontré una nota en mintty source que indica que no funciona allí simplemente porque no manejan DCS (a menos que se haya solucionado recientemente).

De la documentación para la pantalla a continuación (en 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.

El ANSI DCS (Cadena de control del dispositivo) es un código de escape que se utiliza para enviar directamente a un terminal (creo que ese era su propósito original desde hace muchos años). Dicha cadena termina con un código de escape ST (String Terminator).

Envuelva la cadena para establecer el título de la ventana del terminal dentro de un bloque DCS..ST, y pasará por la pantalla y se actualizará correctamente, incluso con hardstatus alwayslastline.

DCS = \ 033P, ST = \ 033 \

Ejemplo: para actualizar el título de la ventana con el directorio de trabajo actual, use

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

¡Mejor tarde que nunca! Espero que esto ayude a alguien.

En caso de que esté equivocado acerca de los cambios en la fuente de pantalla: estoy ejecutando lo último desde git de sesión de pantalla, que a su vez está usando casi lo último desde git de pantalla (con algunos cambios específicos de sesión de pantalla). Pero los mensajes de registro datan de la pantalla de 2005 (puede ver los cambios realizados en esa confirmación con respecto al manejo de DCS si clona el repositorio de git de pantalla y usa el comando a continuación).

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

crb es correcto, pero

a) el código de escape que usa no me funciona. Debería ser en \033klugar de \033_. Ver screen (1)debajo "TITLES (naming windows)". Entonces debería ser:

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

b) este tipo de escape solo se utiliza para configurar el título de la ventana de pantalla. Una instancia de pantalla puede tener varias ventanas, cada una de ellas tiene un nombre, eso es lo que se muestra hardstatusy captioncon la tsecuencia de escape.

c) el escape normal de bash funciona si configura el terminfo correcto para xterm en .screenrc:

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

(esto también works on my machinepara masilla)

Entonces, para establecer el título correcto tanto para la ventana de la pantalla como para el título de masilla / xterm, utilizo algo como:

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

para referencia: http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x395.html

0x89
fuente
1

No voy a responder la pregunta por completo, pero permítanme sugerir la forma de resolver el problema. Muchos gestores de ventanas admiten la especificación EWMH . También hay una herramienta de línea de comandos wmctrlque puede interactuar con ellos. Con esta herramienta, se puede cambiar fácilmente el título de la ventana activa con el siguiente comando:

  wmctrl -r :ACTIVE: -T "FooTitle"

También es posible cambiar el icono de la ventana, el diseño y otras propiedades. La herramienta probablemente no funcionará para PuTTY ya que Windows no es compatible con EWMH, pero la mayoría de los sistemas Linux deberían aceptarlo.

Con este método no importa si lo usas screeno no.

grwlf
fuente
0

Las últimas 2 semanas he buscado en muchos foros y no he encontrado la respuesta a la pregunta:

¿Cómo hacer que todos los comandos salgan al título de Putty?

Se necesita para que otros programas sepan cuándo se realizan algunos trabajos en un servidor y si se hace bien o mal. Plink stdout y stdin no funcionaban, utilicé muchos ajustes con retrasos de espera y para algunos comandos que no funcionaron para otros. XSEL y XCLIP no se pudieron instalar en ese servidor.

Entonces aquí está la solución:

  1. Obtener salida de comando en un archivo.
  2. Echo ese archivo al título.

En el cliente de masilla y el servidor suse se ve así:

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

Esperemos que alguien pueda usar esto. Por supuesto, no funcionará para todos los tipos de servidores y configuraciones de cliente de masilla, pero la idea debería funcionar bien.

Jacek Domagała
fuente