Установите PS1 с подкомандой, которая печатает цвета - PullRequest
0 голосов
/ 14 сентября 2018

При вводе цветовых кодов ANSI в PS1 они должны быть заключены в \[\], иначе приглашение может запутаться в том, где начинается редактируемая часть строки.Однако, когда подкоманда ($()) печатает цвета, экранированные символы \[\] всегда записываются буквально в приглашение ... и с достаточно длинными командами в моей истории приглашение становится запутанным.

Вотпример:

ps1test() {
    ps1sub() {
        printf '\[\033[32m\]Hello!\[\033[0m\]'
    }
    PS1='$(ps1sub) \$ '
}

Ожидаемый:

$ ps1test
Hello! $

Факт (bash установлен Git для Windows):

$ ps1test
\[\]Hello!\[\] $

Как мне получить мою оболочкуинтерпретировать экранирование \[\] из подкоманды?

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

Если вы пытаетесь создать динамическое приглашение, вам, скорее всего, будет проще установить значение PS1 с помощью функции, вызываемой как PROMPT_COMMAND, например ::

ps1test() {
  ps1sub() {
        printf '\[\033[32m\]Hello!\[\033[0m\]'
    }
    PS1="$(ps1sub)"' \$ ' # notice the double-quote
}
PROMPT_COMMAND=ps1test

Для меня это правильно отображается как Hello! $.

Я использую prompt.gem для рендеринга моего приглашения, вы можете взглянуть на то, как оно настраивает PROMPT_COMMAND для вдохновения.

0 голосов
/ 14 сентября 2018

Это именно тот случай использования eval:

ps1test() {  
    ps1sub() {  
        printf '\[\033[31m\]Hello!\[\033[0m\]';     
    };  
    eval PS1="'$(ps1sub) \$ '"; 
}
0 голосов
/ 14 сентября 2018

Только \[ s в буквальной строке интерпретируются. \[ s в результате встроенных расширений не являются.

Самый простой способ обойти это - PROMPT_COMMAND каждый раз устанавливать PS1 в новое буквальное значение:

updateps1() {
    ps1sub() {
        printf '\[\033[32m\]Hello $RANDOM!\[\033[0m\]'
    }
    PS1="$(ps1sub) \\\$ "
}

PROMPT_COMMAND='updateps1'
...