¿Cambiar el formato de la cadena de solicitud de terminal gnome por comando?

9

Mi terminal tiene un formato de solicitud predeterminado como este:

username @ boxname / path / to / current / directory $

El código que lo produce tiene este aspecto: (también tiene algunas definiciones de color)

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'

Si la ruta al directorio actual se alarga demasiado, resulta desagradable trabajar con el terminal porque constantemente se interrumpen las líneas. En tales casos, preferiría un formato que produzca una cadena más corta como esta:

username @ boxname current_dir_name $

El código que lo produce se vería así (de nuevo con color):

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'

¿Alguien sabe cómo podría alternar fácilmente el formato de la ventana de terminal actual de un estilo a otro simplemente escribiendo, por ejemplo prompttoggle:?

Rotareti
fuente
66
¿ Conoces el parámetro PROMPT_DIRTRIM de bash ?
steeldriver
@steeldriver no hasta ahora. Alternar entre PROMPT_DIRTRIM=0y PROMPT_DIRTRIM=1parece más simple que alternar entre diferentes valores para PS1y el resultado es casi el mismo. Gracias por la info!
Rotareti
Usar PROMPT_DIRTRIMuno también podría agregar argumentos al comando. Si pasa ningún argumento alternar entre PROMPT_DIRTRIM=0y PROMPT_DIRTRIM=1y si pasa un número como argumento se establece PROMPT_DIRTRIMa ella. promptlensería un nombre más apropiado para el comando entonces.
Rotareti

Respuestas:

10

Almacene sus PS1variables largas y cortas con un nombre diferente:

PS1short='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
PS1long='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'

Asegúrese de establecer PS1uno de ellos inicialmente:

PS1="$PS1long"

Luego puede hacer un alias como este para alternar entre los dos valores de PS1:

alias prompttoggle='if test "$PS1" = "$PS1long" ; then PS1="$PS1short" ; else PS1="$PS1long" ; fi'

Agregar las cuatro líneas a su ~/.bashrcarchivo tendrá el comando disponible en sus sesiones de Bash, aquí están nuevamente para facilitar la copia:

PS1short='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
PS1long='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'
PS1="$PS1long"
alias prompttoggle='if test "$PS1" = "$PS1long" ; then PS1="$PS1short" ; else PS1="$PS1long" ; fi'
Byte Commander
fuente
7

Puedes usar una pequeña bashfunción:

prompttoggle () { 
    if [[ $PS1 = *basename* ]]; then 
        export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
    else 
        export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'
    fi ;}

La función anterior coincide si la corriente $PS1contiene basename, en caso afirmativo, se establece el PS1sin; de basenamelo contrario, se establece el que basenametiene

Ponga la función en su ~/.bashrcpara que esté disponible en todas las sesiones interactivas.

Ejemplo:

foo@bar:~/spam/egg$ prompttoggle () { 
>     if [[ $PS1 = *basename* ]]; then 
>         export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
>     else 
>         export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'
>     fi ;}

foo@bar:~/spam/egg$ prompttoggle 

foo@bar egg $ prompttoggle

foo@bar ~/spam/egg $
heemayl
fuente
5

O ... haz dos funciones muy pequeñas y agrégalas al final de tu~/.bashrc

# short prompt
promptshort() { export PS1=$(echo "$PS1" | sed 's/\\w/\\W/g') ; }

# full length prompt
promptlong() { export PS1=$(echo "$PS1" | sed 's/\\W/\\w/g') ; }

para una solicitud abreviada, escriba promptshort, para volver a la ruta completa, escribapromptlong

\Wmuestra el directorio de trabajo actual solo así que $(basename ${PWD})es excesivo en mi humilde opinión

Podría combinarse en una función, pero "largo" y "corto" son descriptivos y ambos tienen menos pulsaciones de teclas que "alternar";)

En lugar de agregar una línea para anular PS1, prefiero ajustar el código que lo establece (por ejemplo, descomentar force_color_prompt=yesy editar la línea después [ "$color_prompt" = yes ]; then)

Zanna
fuente
3

Aquí hay una ~/.bashrcdefinición de función que yo personalmente uso para restablecer / alternar mi solicitud de solicitud regular a solo $. Adaptarlo según sea necesario para satisfacer sus necesidades.

resetps() {
    if [ "$PS1" = "$ " ] 
    then
        PS1=$OLDPS1 
    else
        OLDPS1=$PS1 
        export OLDPS1 
        PS1="$ " 
    fi 
} 
Sergiy Kolodyazhnyy
fuente
1

Esta es una respuesta a su problema (los directorios largos rompen la línea de comando) y no específicamente a su pregunta (cómo cambiar el símbolo del sistema sobre la marcha).

Resolví este problema hace años con este mensaje:

PS1='\[\e[32;1m\]$? \u@\h \[\e[35;1m\]\w\[\e[m\]\n\$ '
#    └──green───┘         └──purple──┘  └─norm─┘

Qué hace esto:

  1. muestra el valor de salida del comando anterior (esto es increíblemente útil)
  2. dar salida al usuario actual y al host en un color
  3. salida del directorio de trabajo en otro color (ajuste los colores a su gusto)
  4. generar el dólar y el espacio en una nueva línea , terminando las secuencias de color antes del salto de línea

Esto le brinda todo el espacio que necesita para su comando, no lo desplaza correctamente cuando se encuentra en una estructura de directorio profunda, no estropea la línea de mecanografía con códigos de color (evitando errores extraños que a veces suceden), mientras le da el color Indique dónde terminó la salida de un comando y comenzó el siguiente:

ingrese la descripción de la imagen aquí

Tobia
fuente