Переключить формат строки приглашения терминала gnome командой?

9

Мой терминал имеет формат приглашения по умолчанию, такой как этот:

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

Код, который производит это, выглядит так: (он также имеет некоторые определения цвета)

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

Если путь к текущему каталогу становится слишком длинным, работать с терминалом становится неприятно, потому что вы постоянно ломаете строки. В таких случаях я бы предпочел формат, который производит более короткую строку, такую ​​как эта:

username @ boxname current_dir_name $

Код, который его производит, будет выглядеть так (опять же с цветом):

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

Кто - нибудь знает , как я мог бы легко переключить формат текущего окна терминала от одного стиля к другому, просто набрав, например: prompttoggle?

Rotareti
источник
6
Вам известно о параметре bash PROMPT_DIRTRIM ?
стальная отвертка
@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'
Byte Commander
источник
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 $
heemayl
источник
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})что overkill imho

Вы можете объединить в одну функцию, но «long» и «short» являются описательными, и оба имеют меньше нажатий клавиш, чем «toggle»;)

Вместо добавления строки для переопределения 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. выведите доллар и пробел в новой строке , заканчивая последовательность цветов до разрыва строки

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

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

Тобия
источник