Змінити формат рядка підказок терміналу gnome командою?


9

Мій термінал має формат підказок за замовчуванням, як цей:

ім'я користувача @ boxname / шлях / до / поточного / каталогу $

Код, який його створює, виглядає приблизно так: (він також має деякі кольорові визначення)

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

Якщо шлях до поточного каталогу надто довгий, працювати з терміналом стає неприємно, оскільки ви постійно перериваєте рядки. У таких випадках я вважаю за краще формат, який створює коротший рядок, як цей:

ім'я користувача @ boxname current_dir_name $

Код, який створює, виглядатиме так (знову ж із кольором):

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

Хтось знає, як я міг легко перемикати формат поточного вікна терміналу з одного стилю в інший, просто набравши наприклад prompttoggle:?


6
Вам відомий параметр PROMPT_DIRTRIM bash ?
steeldriver

@steeldriver поки що. Перемикання між PROMPT_DIRTRIM=0і PROMPT_DIRTRIM=1здається простішим, ніж перемикання між різними значеннями для PS1та результат майже однаковий. Дякую за інформацію!
Ротарети

Використовуючи PROMPT_DIRTRIMодин, можна також додати аргументи до команди. Якщо ви не передаєте жодних аргументів, ви перемикаєтесь між ними PROMPT_DIRTRIM=0і PROMPT_DIRTRIM=1якщо ви передаєте число як аргумент, ви його встановлюєте PROMPT_DIRTRIM. promptlenтоді було б більш відповідною назвою для команди.
Ротарети

Відповіді:


10

Зберігайте свої довгі та короткі PS1змінні під іншим іменем:

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один із них:

PS1="$PS1long"

Тоді ви можете зробити такий псевдонім, щоб перемикатися між двома значеннями PS1:

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

Якщо додати всі чотири рядки у ~/.bashrcфайл, ви отримаєте команду, доступну у ваших сесіях Bash, ось вони знову для легшого копіювання:

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'

7

Ви можете використовувати крихітну bashфункцію:

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

Функція, що знаходиться вище, відповідає, якщо поточний $PS1містить basename, якщо так, то PS1без параметра basenameвстановлено інакше встановлено значення з basename.

Поставте цю функцію, ~/.bashrcщоб вона була доступною у всіх інтерактивних сесіях.

Приклад:

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 $

5

Або ... зробіть дві дуже крихітні функції та додайте до кінця свою~/.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') ; }

для скороченого запиту введіть promptshort, щоб повернутися до повного шляху, введітьpromptlong

\Wпоказує лише поточний робочий каталог, так що $(basename ${PWD})це imho overkill imho

Ви можете поєднати одну функцію, але "довгий" і "короткий" є описовими, і обидва мають менше натискань клавіш, ніж "тумблер";)

Замість того, щоб додавати рядок, щоб замінити PS1, я вважаю за краще налаштувати код, який його встановлює (наприклад, відменюйте force_color_prompt=yesта відредагуйте рядок після [ "$color_prompt" = yes ]; then)


3

Ось ~/.bashrcвизначення функції, яке я особисто використовую для скидання / перемикання мого підказки з регулярного запиту на просто $. Адаптуйте його так, як потрібно, відповідно до ваших потреб.

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

1

Це відповідь на вашу проблему (довгі каталоги порушують командний рядок), а не конкретно на ваше запитання (як змінити командний рядок на льоту).

Я вирішив цю проблему років тому за допомогою цього підказки:

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

Що це робить:

  1. вивести значення виходу попередньої команди (це неймовірно корисно)
  2. вивести поточного користувача та хоста в одному кольорі
  3. виведіть робочий каталог іншим кольором (відрегулюйте кольори за своїм смаком)
  4. вивести долар та пробіл на новій лінії , закінчуючи кольорові послідовності перед розривом рядка

Це дає вам весь простір, необхідний для вашої команди, не зміщує його правильно, коли ви знаходитесь у глибокій структурі каталогів, не маніпулює рядком набору тексту кольорами (уникаючи дивних помилок, які трапляються іноді), при цьому все ж надаючи кольорові підкажіть, де закінчився вихід однієї команди, а наступний розпочався:

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.