it-swarm.com.ru

Проблема переноса строки в командной строке

Я сделал что-то, чтобы сломать мой 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='> '

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

localhost: ~/Библиотека/Поддержка приложений/Firefox/Профили/knpmxpup.Defau 
 lt/extensions/{1A2D0EC4-75F5-4c91-89C4-3656F6E44B68} $  expocd\{1A2D0EC4-7 
 5F5-4c91-89C4-3656F6E export PS1 = "\ [
\e [1; 32m \]\h\[\ e [0m \]: cd Library/Appl 
ication\Support /

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

37
Rob

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

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

4
TheBonsai

Я сейчас использую этот 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

47
Rob

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

20
willdye

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

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

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

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

Bash Prompt howto

1
neuro

Вот мое: это лучшее, что я нашел, но на сайте, где я изначально нашел, отсутствовал 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
rcd

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

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

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

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

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

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

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

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

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

1
Martinos

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

0
user3375990

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

0
Charlie

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

export PS1="\[\033[0;31m\][\[email protected]:\w]$\[\033[0m\] "

Это будет отображать мою подсказку оболочки как:

[[email protected]:~]$

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

0
Anil