Cómo configurar correctamente la pantalla GNU para mostrar el programa actualmente en ejecución en estado duro

3

En bash, para mostrar el nombre del programa actual en la línea de estado duro de la pantalla GNU solo se necesitan dos líneas de configuración. Primero, diga a la pantalla cómo se ve normalmente el final de su mensaje y proporcione un título predeterminado para una ventana cuando esté sentado en el shell:

shelltitle "$ | bash"

A continuación, coloque esta secuencia de escape en la variable PS1, antes de los caracteres que normalmente terminan la solicitud '$ 'en este caso:\033k\033\\

Esta técnica funciona, hasta cierto punto. El título de la ventana hardstatus se actualiza al nombre del programa que se está ejecutando actualmente, y luego vuelve al título predeterminado poco después de que finaliza la ejecución. Sin embargo, un problema importante es que esta cadena de escape no se escapa por sí misma, lo que causa problemas de ajuste de línea con comandos más largos que la línea inicial.

Esto era molesto, así que me puse a buscar una solución. Resulta que simplemente escapar de la secuencia de escape anterior corrige el ajuste de línea:\[\033k\]\[\033\\\]

¡Excelente! El título de mi ventana hardstatus todavía se actualiza al nombre del programa que se está ejecutando actualmente, y ahora mis comandos más largos se ajustan correctamente a la segunda línea. Sin embargo, con esta nueva secuencia de escape en mi PS1, la pantalla actualiza el título de la ventana al comando real que estoy escribiendo, no simplemente el nombre del programa actual una vez que se ejecuta.

Me pregunto, ¿alguien ha conseguido que esto funcione correctamente, es decir, ajuste de línea y actualización adecuada del título de la ventana de estado duro?

Johnny B Goode
fuente
No estoy seguro de entender lo que quiere decir con "la pantalla actualiza el título de la ventana al comando real que estoy escribiendo, no simplemente el nombre del programa actual una vez que se ejecuta". Si lo hace, por ejemplo, echo test; less somefilese echomostrará como el título de la ventana en lugar de hacerlo less. ¿Es lo que quieres que se lessmuestre en su lugar?
Dennis Williamson el
Traté de arreglar el formato de las secuencias con barra invertida, por favor asegúrese de tenerlo bien. Tenga en cuenta que la vista previa es un poco defectuosa en este caso; las comillas traseras funcionan mejor que <pre>. Al igual que Dennis, no entiendo lo que estás tratando de lograr exactamente, ¿podrías darnos un ejemplo?
Gilles
@Gilles: Tienes las barras invertidas correctas.
Dennis Williamson el
por ejemplo: si escribo ejecutar 'less somefile', el título de la ventana de la pantalla gnu en el estado duro leerá 'less'. esto es correcto. Sin embargo, si estoy escribiendo un comando largo, es decir, 'cat path / to / some / file >> / path / to / some / new_file && chmod 755 / path / to / some / new_file', mientras estoy escribiendo el comando El título de la ventana de estado duro de la pantalla gnu contendrá la línea de comando while, no simplemente 'cat' o 'chmod'. Esto no sucedió usando la secuencia sin escape, y aunque no es un problema importante, espero una forma de remediarlo por el bien de la integridad.
johnny_bgoode

Respuestas:

4

No creo que la pantalla sea el lugar adecuado para actualizar esa copia. Es realmente fácil hacerlo desde las configuraciones de su shell. Puede definir una preexec()función en su archivo shellrc que envíe detalles de lo que está a punto de ejecutar antes de que lo haga. Puede imprimir desde allí para indicarle a la pantalla que cambie el título de la ventana actual. Estoy usando zsh, no bash, por lo que su kilometraje variará, pero sé que las mismas cosas también son posibles allí. Como referencia en mi archivo zshrc, tengo algo como esto:

# If running in screen, set the window title to the command about to be executed
preexec() {
    [ -n "$WINDOW" ] && print -Pn "^[k$2^[\\"
}

# If in screen, blank the window title when displaying the prompt
premd() {
    [ -n "$WINDOW" ] && print -Pn "^[k ^[\\"
}

En realidad, hago una limpieza del comando antes de mostrarlo como el título. Por ejemplo, puede usar print -Pn "^[k`echo $2|perl -pne 's!\s.*/! !g'|cut -c1-16`^[\\"el preexec () anterior para mostrar información mucho más limpia sobre lo que está a punto de ejecutarse. Esto quita los caminos al último componente y hace algunos trucos ninja.

Caleb
fuente
1

Las instrucciones de trabajo para Bash están a continuación. Supongo que trabaja con un usuario root , por lo tanto, # se usa en shelltitle. Para usuarios normales use $

.screenrc

hardstatus alwayslastline
hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %m-%d %{W}%c %{g}]'
shelltitle '# |bash'

.bashrc

PS1='\u@\h [\w] \$ '

if echo $TERM | grep ^screen -q
then
    PS1='\[\033k\033\\\]'$PS1
fi
Pavel Piatruk
fuente