Błąd monitu Bash po naciśnięciu strzałki w górę

2

Napisałem ten ładny i kolorowy monit dla mojego terminala 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\]"

I source ~/.bash_profileto i działa dobrze. z wyjątkiem sytuacji, gdy używam strzałki w górę do poruszania się po historii, dzieje się coś dziwnego.

w zasadzie początek source ~/.bash_profilepolecenia w historii staje się częścią pytania. kiedy ja ctrl+club enterono wraca do normy, ale gdy tylko zobaczę historię sourcepolecenia, monit ponownie się zmienia.

Oto przykład, w którym widziałem historię, a następnie ctrl+unapisałem ls:

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

Wszelkie wskazówki na ten temat?

Don Giulio
źródło

Odpowiedzi:

5

Całkowicie zbanowałeś pomysł bash na temat tego, co zostało wydrukowane i co musi skasować / przepisać, ponieważ wyświetla historię poleceń i pozwala edytować wiersz poleceń. Jest tak, ponieważ wykonałeś prawdziwy skrót tego monitu.

  • Użyj jednej \elub \033konsekwentnie, dla własnego zdrowia psychicznego.
  • Dokonaj \[and \]ściśle pasujące non-par lęgowych.
  • Upewnij się, że wszystkie niedrukowalne sekwencje są wewnątrz \[i \](i odwrotnie, że wszystkie sekwencje drukujące nie są).

(Właśnie dlatego osobiście wolę Z Shell i jej alternatywny mechanizm rozszerzania podpowiedzi, gdy chcę mieć dziwaczne kolorowe podpowiedzi. Wie, że takie rzeczy %F{green}nie są drukowaniem sekwencji, bez konieczności powiadamiania; a także opracowuje prawidłowe sekwencje specjalne z terminfo, bez konieczności podłączania ich na stałe).

JdeBP
źródło
dzięki, dobry pomysł, zwróciłem się do korzystania z zsh, którego wcześniej nie znałem i wygląda naprawdę fajnie.
Don Giulio