Проблема переноса строки в командной строке - PullRequest
37 голосов
/ 15 июля 2009

Я сделал что-то, чтобы сломать мой Bash Shell Prompt в OS X (10.5.7) Terminal.

Это PS1, который я настроил:

PS1='\[\e[1;32m\]\h\[\e[0m\]:\[\e[1;34m\]\w\[\e[0m\]\$ '

Насколько я могу судить, у меня правильно отображаются цветовые команды. Однако, когда я прокручиваю вверх и вниз в моей истории команд, у меня часто возникают проблемы с переносом строк, если исторические команды переносятся на несколько строк.

Я упростил свои подсказки до следующего:

PS1='\[\e[1m\]\h:\w\$ \[\e[0m\]'
PS2='> '

И я все еще вижу что-то вроде:

<b>localhost:~/Library/Application Support/Firefox/Profiles/knpmxpup.Defau
lt/extensions/{1A2D0EC4-75F5-4c91-89C4-3656F6E44B68}$</b> expocd \{1A2D0EC4-7
5F5-4c91-89C4-3656F6E                                           export PS1="\[
\e[1;32m\]\h\[\e[0m\]:                                          cd Library/Appl
ication\ Support/

Я также пробовал \033 вместо \e. Я просто включил PS2 там для информации, я не изменил это от установки по умолчанию. Если я полностью удаляю цветовые коды, тогда все отлично работает, есть идеи?

Ответы [ 9 ]

49 голосов
/ 05 мая 2010

Я сейчас использую этот PS1 с хорошим эффектом:

green=$(tput setaf 2)
blue=$(tput setaf 4)
bold=$(tput bold)
reset=$(tput sgr0)
PS1="\[$green$bold\]\h\[$reset\]:\[$blue$bold\]\w\[$reset\]\$ "

Похоже, что прокрутка истории команд теперь справляется с переносом строк. Однако в то же время, так как этот вопрос был задан, я также обновил свою OS X до 10.6.3

20 голосов
/ 29 апреля 2010

Этот поток переполнения стека представляется актуальным. Как кто-то заметил в этой теме, Bash FAQ на mywiki.wooledge.org обсуждает, как правильно указывать коды цветов в приглашениях Bash ( FAQ 53 ), и как правильно вызывать цвета терминала ( FAQ 37 ).

4 голосов
/ 16 июля 2009

Проблемы с переносом строк в Bash не новы. Обратитесь к списку рассылки, возможно, есть еще одна ошибка, связанная с этим.

Вы не можете сделать больше, чем пометить непечатные символы, остальное должно сделать код подсказки.

1 голос
/ 26 января 2016

Я заметил, что есть некоторые проблемы с позиционированием курсора, даже если в переменной окружения PS1 или PROMPT нет специальных символов.

Если мы выводим файл, в конце которого нет символа конца строки. Это запутает подсказку.

Вы можете воспроизвести это, выполнив:

curl https://gist.githubusercontent.com/martinos/d4aa0a7d4d752b0d0d9f/raw/3198c39f84a080c44227a084a19fb3a0bb661ee5/wrapping_issue.txt

и несколько раз нажмите клавишу вверх, и вы увидите, что подсказка запуталась.

Вы можете увидеть пример этого в действии:

https://asciinema.org/a/9mtjhi9dib6md4ocsbw210cca

Когда это произойдет, просто нажмите <CTRL-C>, и приглашение вернется в нормальное состояние.

Обратите внимание, что в ZShell такой проблемы нет.

1 голос
/ 21 января 2013

Вот мое: это лучшее, что я нашел, но на сайте, где я изначально нашел, отсутствовал escape-символ, что привело к проблеме переноса строк. Я возился с этим и, наконец, получил его работать. Он показывает информацию о вашем пользователе, пути и ветке с хорошим контрастом и цветом.

export PS1='\[\e[1;37m\]\[\e[1;32m\]\u\[\e[0;39m\]:\[\e[1;33m\]\w\[\e[0;39m\]\[\e[1;35m\]$(__git_ps1 " (%s)")\[\e[0;39m\] \[\e[1;37m\]|\[\e[0;39m\]\$'

Также добавьте

GIT_PS1_SHOWDIRTYSTATE=true

Чтобы показать маркер, когда ветвь "грязная" (изменения, которые должны быть зафиксированы, существуют)

export HISTCONTROL=ignoredups

Также полезно игнорировать дубликаты при прокрутке истории bash.

bind "set completion-ignore-case on" 

Помогает тоже.

Наконец,

shopt -s checkwinsize

Может быть полезно на OSX, если проблемы сохраняются.

1 голос
/ 16 июля 2009

Кажется, что вы правильно экранировали и вложили последовательности.

Обходной путь, который я в любом случае использую, чтобы добавить '\ n' в конце. Я нахожу это более ясным и уменьшаю любую проблему с проблемами упаковки. Точный конец моего PS1:

'\n\[\033[0;30m\]$\[\033[0m\]

Отличное руководство, которое вы, вероятно, знаете:

Подскажите подсказку Bash

0 голосов
/ 12 ноября 2015

Если вы используете трюк в строке заголовка "\e]2;titlebar\a", убедитесь, что вы также избежали этого: "\[\e]2;titlebar\a\]"

0 голосов
/ 03 марта 2014

'shopt -s checkwinsize' также работает для проблем переноса Cygwin

0 голосов
/ 04 декабря 2012

Для дальнейшего использования вот что я использую:

export PS1="\[\033[0;31m\][\u@Project:\w]$\[\033[0m\] "

Это будет отображать мою командную строку как:

[ec2-user@Project:~]$

Помогает мне отличить живые сайты от сайтов разработчиков.

...