Przełącz format wiersza polecenia gnome terminala poleceniem?

9

Mój terminal ma domyślny format monitu, taki jak ten:

nazwa użytkownika @ nazwa skrzynki / ścieżka / do / bieżącego / katalogu $

Kod, który go tworzy, wygląda następująco: (ma też kilka definicji kolorów)

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

Jeśli ścieżka do bieżącego katalogu staje się zbyt długa, praca z terminalem staje się nieprzyjemna, ponieważ ciągle przerywasz linie. W takich przypadkach wolałbym format, który generuje krótszy ciąg taki jak ten:

nazwa użytkownika @ nazwa skrzynki bieżąca nazwa_katalogu $

Kod, który go tworzy, wyglądałby tak (ponownie z kolorem):

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

Czy ktoś wie, jak łatwo zmienić format bieżącego okna terminala z jednego stylu na drugi, wpisując na przykład prompttoggle:?

Rotareti
źródło
6
Czy znasz parametr PROMPT_DIRTRIM basha ?
steeldriver
@steeldriver nie do tej pory. Przełączanie między PROMPT_DIRTRIM=0i PROMPT_DIRTRIM=1wydaje się prostsze niż przełączanie między różnymi wartościami, PS1a wynik jest prawie taki sam. Dzięki za informację!
Rotareti
Za pomocą PROMPT_DIRTRIMjednego można również dodać argumenty do polecenia. Jeśli nie podasz żadnego argumentu, przełączysz się między, PROMPT_DIRTRIM=0a PROMPT_DIRTRIM=1jeśli podasz liczbę jako argument, ustawisz PROMPT_DIRTRIMgo. promptlenbyłaby wówczas bardziej odpowiednia nazwa dla polecenia.
Rotareti,

Odpowiedzi:

10

Przechowuj zarówno swoje długie, jak i krótkie PS1zmienne pod inną nazwą:

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\]'

Pamiętaj, aby PS1początkowo ustawić jedną z nich:

PS1="$PS1long"

Następnie możesz utworzyć taki alias, aby przełączać się między dwiema wartościami PS1:

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

Dodanie wszystkich czterech wierszy do ~/.bashrcpliku będzie podobne do polecenia dostępnego w sesjach Bash, oto znowu dla łatwiejszego kopiowania:

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'
Bajt Dowódca
źródło
7

Możesz użyć małej bashfunkcji:

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

Powyższa funkcja jest zgodna, jeśli prąd $PS1zawiera basename, jeśli tak, wówczas ustawiane jest „ PS1bez”, w basenameprzeciwnym razie basenameustawiona jest „ z” .

Umieść tę funkcję w swojej, ~/.bashrcaby była dostępna we wszystkich interaktywnych sesjach.

Przykład:

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
źródło
5

Lub ... wykonaj dwie bardzo małe funkcje i dodaj do końca swojego~/.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') ; }

w przypadku skróconego monitu wpisz promptshort, aby wrócić do pełnej ścieżki, wpiszpromptlong

\Wpokazuje tylko bieżący katalog roboczy, więc $(basename ${PWD})jest overkill imho

Możesz połączyć w jedną funkcję, ale „długie” i „krótkie” są opisowe i oba mają mniejszą liczbę naciśnięć klawiszy niż „przełączanie”;)

Zamiast dodawać wiersz, aby zastąpić PS1, wolę ulepszyć kod, który go ustawia (na przykład, anuluj komentarz force_color_prompt=yesi edytuj wiersz po [ "$color_prompt" = yes ]; then)

Zanna
źródło
3

Oto ~/.bashrcdefinicja funkcji, której osobiście używam do resetowania / przełączania monitu z regularnego na monit $. Dostosuj go odpowiednio do swoich potrzeb.

resetps() {
    if [ "$PS1" = "$ " ] 
    then
        PS1=$OLDPS1 
    else
        OLDPS1=$PS1 
        export OLDPS1 
        PS1="$ " 
    fi 
} 
Sergiy Kolodyazhnyy
źródło
1

To jest odpowiedź na Twój problem (długie katalogi łamią linię poleceń), a nie na twoje pytanie (jak zmienić wiersz polecenia w locie).

Rozwiązałem ten problem wiele lat temu za pomocą tego monitu:

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

Co to robi:

  1. wypisuje wartość wyjściową poprzedniego polecenia (jest to niezwykle przydatne)
  2. wyprowadza bieżącego użytkownika i hosta w jednym kolorze
  3. wydrukuj katalog roboczy w innym kolorze (dostosuj kolory do swoich upodobań)
  4. wypisz dolara i spację w nowej linii , kończąc sekwencje kolorów przed przerwaniem linii

Daje to całą przestrzeń potrzebną do wykonania polecenia, nie przesuwa go we właściwy sposób, gdy znajdujesz się w głębokiej strukturze katalogów, nie zmienia linii pisania za pomocą kodów kolorów (unikając czasami dziwnych błędów), a jednocześnie daje kolorowe wskazówka, gdzie zakończyło się wyjście jednego polecenia, a następne rozpoczęło:

wprowadź opis zdjęcia tutaj

Tobia
źródło