Forzar el título en la pantalla de GNU

9

Por defecto, el título de una sesión de pantalla es el nombre del último comando ingresado, lo cual está bien para mí, pero en algunos casos me gustaría cambiarlo. Sé el comando Ctrl- A A, pero sólo cambia el título hasta el siguiente comando, y me gustaría que se quede allí hasta que decida lo contrario.

EDITAR: Aquí está la preexecfunción que encontré en mi.zshrc

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

Respuestas:

9

Depende de cómo estén configuradas las cosas, pero por defecto, algo como esto debería funcionar.

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

Entonces corre:

settitle NEWTITLE.

Consulte los documentos del título de la pantalla y las preguntas frecuentes de la pantalla de GNU para obtener más detalles.

Dado Ctrl+ A Asolo lo está cambiando hasta el siguiente comando, probablemente esté configurado por $PS1(todos los shells) o $PROMPT_COMMAND/ DEBUG trap(solo bash) o precmd/ preexec(solo zsh).

Debe buscar cualquier lugar que \eo \033aparece con ko \\después de ella, básicamente como mi settitleejemplo anterior.

ACTUALIZAR

Dijiste que tenías una costumbre preexec.

¿Por qué no cambiarlo a esto?

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

Luego puede establecer un título personalizado ejecutando:

TITLE="my title"

y desarmar el título ejecutando

TITLE=

No olvide cambiar precmdy $PS1también si es necesario.

APARTE

Incluso podría extender esto a todos los terminales (p xterm. Ej . gnome-terminal, Etc.) al no codificar el \eky \e\\.

Así es como lo hago:

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}"
}

Entonces puedes cambiar tu preexeca:

if [[ "$TERM" == "screen" ]]; then
   local CMD=${1[(wr)^(*=*|sudo|-*)]}
   settitle "${TITLE:-$CMD}"
fi
Mikel
fuente
El comando que das hace exactamente lo mismo que Ctrl-A A. Y sobre el mensaje, ¿quiere decir que tengo que modificar $PS1cada vez que quiero que el título no cambie?
gregseth
Me refiero a comprobar que no contiene ESC k algo ESC \. Lo mismo ocurre con PROMPT_COMMAND.
Mikel
ESC podría ser escrito \eo \033.
Mikel
Los enlaces de los documentos del título de la pantalla deben tener la información necesaria
Mikel
5

Si el título de su ventana refleja la aplicación que se está ejecutando actualmente en la ventana, es porque su shell lo está haciendo. Si está haciendo eso, es porque su distribución, su administrador del sistema o usted lo configuró.

Si el comando aparece como el título de la ventana mientras se ejecuta el comando, esto se hace mediante la preexecfunción (en zsh) o una emulación del mismo en bash .

Si el título cambia cuando se completa cada comando, esto se hace mediante la precmdfunción en zsh, el PROMPT_COMMANDparámetro en bash o como parte de la solicitud ( PS1parámetro) en cualquier shell. (El comando para cambiar el título es una secuencia de escape emitida por cualquier aplicación como parte del flujo de salida del terminal, por lo que se puede incrustar en una solicitud).

Buscar una secuencia de escape como \e]0;new title\a, \e]2;new title\ao \eknew title\e\\en el archivo de inicialización de shell ( ~/.bashrc, ~/.zshrc, ...). Si no hay nada relevante, la configuración puede estar en un archivo del sistema (por ejemplo /etc/bash.bashrc, /etc/zsh/zshrc); luego sobrescriba ese parámetro o función en su propio archivo de inicialización.

Vea la respuesta de Mikel para una configuración de título invaluable en preexec.

Gilles 'SO- deja de ser malvado'
fuente
Gracias, lo dejaste muy claro. De hecho, he encontrado una preexecfunción definida en mi .zshrc. La cuestión es que ese es el comportamiento que quiero ... la mayor parte del tiempo. Me gustaría poder desactivarlo sobre la marcha en una pantalla específica. ¿Quizás haya una variable que pueda obtener en la preexecfunción cuando configuro manualmente el título, o algo así?
Gregseth
@gregseth: es un poco difícil de explicar en general, pero si publicas tu preexecfunción, yo u otra persona probablemente podamos sugerir un cambio simple.
Gilles 'SO- deja de ser malvado'
Iba a mencionar preexec, pero Greg no dijo que estaba usando zsh. Eso me enseñará ;-)
Mikel
@Mikel: Mi explicación fue mejor que la tuya, pero tu nuevo preexecdiseño es mejor que el mío.
Gilles 'SO- deja de ser malvado'
Estoy de acuerdo. :-) Mi respuesta original fue tratar de enseñarle al OP a encontrar la respuesta por sí mismo. La suya fue más útil de inmediato. De cualquier manera, todos ganamos.
Mikel