2

Я написал эту красивую и красочную подсказку для моего терминала OS X:

parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ [\1]/'
}

export PS1="\e]2;\w\a\e[1;30;1m\][\u@\[\033[0;36m\]\h\e[1;30;1m\]:\[\033[0;35m\]\w\e[1;30;1m\]] \[\033[0;31m\](\t) \[\033[0;33m\]\$(parse_git_branch)\n\[\033[0m\]\e[1;30;1m\]\$\[\e[0m\]"

Я использую source ~/.bash_profile и он работает нормально. кроме случаев, когда я использую стрелку вверх для навигации по истории, я получаю странные вещи.

в основном начало команды source ~/.bash_profile в истории становится частью приглашения. когда я ctrl+c или enter он возвращается к нормальному состоянию, но как только я вижу историю source команды, приглашение снова меняется.

Вот пример, где я видел историю, а затем ctrl+u и набрал ls:

[user@host:~/Documents] (14:01:40)  [branch]
$source ~/.ls

Есть какие-нибудь подсказки по этому поводу?

1 ответ1

5

У вас полностью отсутствует представление о том, что было напечатано, и что нужно стирать / переписывать, поскольку оно отображает историю команд и позволяет вам редактировать командную строку. Это потому, что вы сделали настоящий хеш этого приглашения.

  • Используйте либо \e либо \033 последовательно, для собственного здравомыслия.
  • Сделайте ваши \[ и \] строго совпадающими не вложенными парами.
  • Убедитесь, что все непечатаемые последовательности находятся в пределах \[ и \] (и, наоборот, что все последовательности печати не находятся).

(Именно поэтому я лично предпочитаю Z Shell и его альтернативный механизм расширения подсказок для случаев, когда мне нужны причудливые цветные подсказки. Он знает , что такие вещи, как %F{green} , не являются последовательностями печати, без необходимости говорить; и он также вырабатывает правильные escape-последовательности из terminfo , без их аппаратного подключения.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .