Alternar formato da linha de prompt do terminal gnome por comando?

9

Meu terminal tem um formato de prompt padrão como este:

nome de usuário @ nome da caixa / caminho / para / diretório atual / $

O código que o produz se parece com o seguinte: (ele também possui algumas definições de cores)

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

Se o caminho para o diretório atual ficar muito longo, será desagradável trabalhar com o terminal, porque você interrompe constantemente as linhas. Nesses casos, eu preferiria um formato que produza uma string mais curta como esta:

username @ boxname current_dir_name $

O código que o produz ficaria assim (novamente com cores):

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

Alguém sabe como eu poderia alternar facilmente o formato da janela do terminal atual de um estilo para outro, apenas digitando, por exemplo prompttoggle:?

Rotareti
fonte
6
Você conhece o parâmetro PROMPT_DIRTRIM do bash ?
steeldriver
@steeldriver não até agora. Alternar entre PROMPT_DIRTRIM=0e PROMPT_DIRTRIM=1parece mais simples do que alternar entre valores diferentes para PS1e o resultado é quase o mesmo. Obrigado pela informação!
Rotareti 7/09/16
Usar PROMPT_DIRTRIMum também pode adicionar argumentos ao comando. Se você não passar nenhum argumento que você alternar entre PROMPT_DIRTRIM=0e PROMPT_DIRTRIM=1e se você passar um número como um argumento de definir PROMPT_DIRTRIMa ele. promptlenseria um nome mais apropriado para o comando então.
Rotareti

Respostas:

10

Armazene suas PS1variáveis longas e curtas com um nome 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\]'

Certifique-se de definir PS1um deles inicialmente:

PS1="$PS1long"

Em seguida, você pode criar um alias como este para alternar entre os dois valores do PS1:

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

A adição de todas as quatro linhas ao seu ~/.bashrcarquivo executará o comando disponível nas sessões do Bash. Aqui estão elas novamente para facilitar a cópia:

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
fonte
7

Você pode usar uma pequena bashfunção:

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

A função acima corresponde se a corrente $PS1contém basename, se sim, então o PS1sem basenameé definido, caso contrário, aquele com basenameestá definido.

Coloque a função no seu ~/.bashrcpara disponibilizá-lo em todas as sessões interativas.

Exemplo:

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 $
heemail
fonte
5

Ou ... faça duas funções muito pequenas e adicione ao final do seu~/.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 um prompt reduzido, digite promptshort, para retornar ao caminho completo, digitepromptlong

\Wmostra o diretório de trabalho atual apenas, portanto, $(basename ${PWD})é um exagero

Você pode combinar em uma função, mas "longo" e "curto" são descritivos e ambos têm menos pressionamentos de tecla do que "alternar";)

Em vez de adicionar uma linha para substituir o PS1, prefiro ajustar o código que o define (por exemplo, remova o comentário force_color_prompt=yese edite a linha depois [ "$color_prompt" = yes ]; then)

Zanna
fonte
3

Aqui está uma ~/.bashrcdefinição de função que eu pessoalmente uso para redefinir / alternar meu prompt do prompt regular para apenas $. Adapte-o conforme necessário para atender às suas necessidades.

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

Esta é uma resposta para o seu problema (diretórios longos quebram a linha de comando) e não especificamente para sua pergunta (como alterar o prompt de comando rapidamente).

Eu resolvi esse problema anos atrás com este prompt:

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

O que isso faz:

  1. gera o valor de saída do comando anterior (isso é incrivelmente útil)
  2. gera o usuário e host atuais em uma cor
  3. produz o diretório de trabalho em outra cor (ajuste as cores ao seu gosto)
  4. produz o dólar e o espaço em uma nova linha , finalizando as seqüências de cores antes da quebra de linha

Isso fornece a você todo o espaço necessário para o seu comando, não o altera corretamente quando você está em uma estrutura de diretórios profunda, não altera a linha de digitação com códigos de cores (evitando erros estranhos que acontecem às vezes), enquanto ainda fornece as cores dica sobre onde a saída de um comando terminou e o seguinte começou:

insira a descrição da imagem aqui

Tobia
fonte