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

9

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

  

имя пользователя @ boxname / path / to / current / directory $

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

PS1='${debian_chroot:+($debian_chroot)}\[3[01;32m\]\[email protected]\h\[3[01;34m\] \w $\[3[00m\]'

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

  

имя пользователя @ boxname current_dir_name $

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

PS1='${debian_chroot:+($debian_chroot)}\[3[01;32m\]\[email protected]\h\[3[01;34m\] $(basename ${PWD}) $ \[3[00m\]'

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

    
задан Rotareti 07.09.2016 в 22:12
источник

5 ответов

10

Храните как свои длинные, так и короткие переменные PS1 под другим именем:

PS1short='${debian_chroot:+($debian_chroot)}\[3[01;32m\]\[email protected]\h\[3[01;34m\] \w $\[3[00m\]'
PS1long='${debian_chroot:+($debian_chroot)}\[3[01;32m\]\[email protected]\h\[3[01;34m\] $(basename ${PWD}) $ \[3[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)}\[3[01;32m\]\[email protected]\h\[3[01;34m\] \w $\[3[00m\]'
PS1long='${debian_chroot:+($debian_chroot)}\[3[01;32m\]\[email protected]\h\[3[01;34m\] $(basename ${PWD}) $ \[3[00m\]'
PS1="$PS1long"
alias prompttoggle='if test "$PS1" = "$PS1long" ; then PS1="$PS1short" ; else PS1="$PS1long" ; fi'
    
ответ дан Byte Commander 07.09.2016 в 22:21
7

Вы можете использовать крошечную функцию bash :

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

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

Поместите функцию в свой ~/.bashrc , чтобы получить ее во всех интерактивных сеансах.

Пример:

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

[email protected]:~/spam/egg$ prompttoggle 

[email protected] egg $ prompttoggle

[email protected] ~/spam/egg $
    
ответ дан heemayl 07.09.2016 в 22:20
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}) is overkill imho

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

Вместо добавления строки для переопределения PS1 я предпочитаю настраивать код, который ее устанавливает (например, uncomment force_color_prompt=yes и редактировать строку после [ "$color_prompt" = yes ]; then )

    
ответ дан Zanna 07.09.2016 в 22:40
3

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

resetps() {
    if [ "$PS1" = "$ " ] 
    then
        PS1=$OLDPS1 
    else
        OLDPS1=$PS1 
        export OLDPS1 
        PS1="$ " 
    fi 
} 
    
ответ дан Sergiy Kolodyazhnyy 08.09.2016 в 06:00
1

Это ответ на вашу проблему (длинные каталоги разрывают командную строку), а не конкретно на ваш вопрос (как изменить командную строку на лету.)

Я решил эту проблему несколько лет назад с этой подсказкой:

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

Что это делает:

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

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

    

ответ дан Tobia 08.09.2016 в 17:19