Обратное- поиск в интерфейсе командной строки: впоследствии вывод был испорчен [дубликат]

См. Мою правку ниже, это не полностью дублирует Настройка подсказки оболочки и поведение cmd

Моя функция обратного поиска в интерфейсе командной строки не работает, и я не знаю, как исправить это обратно ...

Когда я нажимаю ctrl + r и ищу команду, которую я сделал ранее, нахожу ее, а затем нажимаю клавишу со стрелкой вправо, чтобы использовать ее, вывод прерывается.Вот пример:

# I reverse-searched the word "test" then pressed right arrow
yoshiji@x1carbon:~/path/to/git/folder (master) $ch)`test': rake test
#                                              ^^^^^^^^^^ weird output
#                                                     ^ cursor right there

Он также «сдвигает» мой курсор в другую позицию. Если я нажимаю Enter, выполняется правая команда (в данном случае rake test ), поэтому это означает, что отображаемый текст не совпадает с тем, что выполняется на самом деле.

Я знаю, что это, скорее всего, связано с моим экспортом PS1 в моем ~ / .bashrc , поэтому вот последние строки этого файла:

# Git branch in prompt.
git_branch() {
  branch=$(__git_ps1 2> /dev/null)
  if [ "$branch" = " (master)" ]; then
     echo -e "\033[33m${branch}\033[00m" # yellow
  elif [ "$branch" = "" ]; then
     echo -e "\033[90m (no git)\033[00m" # red
  else
     echo -e "\033[32m${branch}\033[00m" # green
  fi
}
PS1='\u@\h:\w$(git_branch) \$ '

Это что-то Я написал для отображения ветки git оранжевым (если master ветка) или зеленым (или no git серым).

Вы, ребята, знаете, что вызывает такое странное поведение?


Изменить: Это проблема, отличная от возможного дубликата в том способе, которым я использую echo -e "некоторая строка" , чтобы вернуть строку, имеющую цвет + имя ветки git из функции git_branch () . Использование echo -e не экранирует символы \ [ и \] (попробуйте сами в своем CLI: echo -e "\ [\ 033 [33м \] тест »).

В идеале я хотел бы сохранить эти условные цвета в зависимости от наличия и имени ветки (серый, если ветки нет, оранжевый, если основной, иначе зеленый).

6
задан 11 June 2018 в 20:05

2 ответа

Перенесите цветные последовательности в Escape readline как так:

echo -e "\001\033[33m\002${branch}\001\033[00m\002" # yellow
echo -e "\001\033[90m\002 (no git)\001\033[00m\002" # red
echo -e "\001\033[32m\002${branch}\001\033[00m\002" # green

Escape readline \001 в начале непечатаемой последовательности, и \002 в конце. Они эквивалентны \[ и \], соответственно, в строке PS1.

Источник: ответ archemiro на подсказке удара и отзывающихся эхом цветах в функции - Переполнение стека


Это - мой ответ от другого вопроса с измененным кодом.

8
ответ дан 23 November 2019 в 07:27

При помещении цветовых кодов в подсказку, необходимо добавить дополнительные маркеры, чтобы позволить терминалу знать, что у Вас есть невидимые символы в подсказке

Изменение

 echo -e "\033[33m${branch}\033[00m" # yellow

кому:

 echo -e "\[\033[33m\]${branch}\[\033[00m\]" # yellow
 # .......^^........^^.........^^........^^

и так далее

Посмотрите Управление Подсказкой в руководстве удара.

3
ответ дан 23 November 2019 в 07:27

Другие вопросы по тегам:

Похожие вопросы: