Bash Ctrl-A возвращается к началу строки, но не отображается должным образом

Когда я подключаюсь по ssh к серверу Linux из терминала bash, я могу использовать CTRL+ A, чтобы правильно вернуться к началу строки, и CTRL+ , Eчтобы перейти к концу строки, и все работает нормально.

Когда я использую bash локально на своем Mac, когда я использую CTRL+ A, он логически возвращается к началу строки, но не отображает курсор в правильном месте. Он отображает курсор на 7 или около того символов и не обновляет текст строки правильно.

Пример

find . -name "hello.cpp"

CTRL+ A!

find . -name "hello.cpp"
       ^~~ cursor shows here ????

Вставьте «это тест» (просто чтобы показать)

Дисплеи:

find . this is a test -name "hello.cpp"
                      ^~~ cursor is still here ???
       ^~~~~~~~~~~~~^ text inserted here ???
^~~~~~^ unchanged for some reason

Команда выполнена

this is a test find . -name "hello.cpp"

я использую то же самое

PS1=\n \e[1;95m \u@\h \e[0;32m\w \e[1;30m $(__git_ps1 " (%s)" ) \n \e[1;95m \@ \n $ \e[0;30m

как я делаю в линуксе.

Информация о версии

  • Баш версия: 3.2.57(1)
  • терминальная версия: 2.6.1 (361.1)
  • OS X Эль-Капитан, 10.11.5
На самом деле причина кажется противоположной: вам нужно [ ] заключить коды смены цвета в соответствии с цитируемой там статьей ibm.com/developerworks/linux/library/l-tip-prompt.
Добавление \[и \]вокруг цветов решило проблему. На самом деле это обратная другая проблема, для которой я бы рекомендовал изменить строку темы, поскольку это более общая проблема, чем просто «стиль emacs». Вы хотите, чтобы я пометил как дубликат, даже если они перевернуты? Я думаю, что эта тема облегчит поиск.
В настоящее время это не дубликат, но я подозреваю, что вопрос может быть написан с использованием другого ответа для создания общего вопроса.
@Mark Я преобразовал ваш комментарий в ответ. Вопросы должны иметь ответы. Если вы создадите свой собственный ответ (вы можете скопировать тот, который я добавил, если хотите), я удалю свой.

Ответы (1)

Добавьте \[и \]вокруг цветовых кодов, чтобы bash правильно рассчитывал длину строки. Что-то вроде этого:

PS1=\n \[\e[1;95m\] \u@\h \[\e[0;32m\]\w \[\e[1;30m\] $(__git_ps1 " (%s)" ) \n \[\e[1;95m\] \@ \n $ \[\e[0;30m\]

(Этот ответ взят из комментария @Mark к вопросу.)