Mac Terminal.app раздражающая ошибка - как это исправить? - PullRequest
9 голосов
/ 03 октября 2009

Видео, показывающее проблему: http://www.mentaframework.org/download/TerminalBug.mov

Когда я печатаю в Terminal.app и достигаю конца строки, следующая строка начинается сверху первой строки, перезаписывая все. Тогда, если я использую клавишу удаления, все портится и исчезает.

Я сделал ssh в том же терминале на другом хосте, и он работал нормально, так что это может быть проблемой с моей конфигурацией оболочки?

Посмотрите фильм, чтобы увидеть, что происходит:

Спасибо

-Sergio

Ответы [ 2 ]

18 голосов
/ 03 октября 2009

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

Вот ссылка на объяснение и некоторые примеры:

http://www.artemfrolov.com/articles/coloured-bash-prompt

Быстрый совет:

\[     begins a sequence of non-printing characters
\]     ends a sequence of non-printing characters
1 голос
/ 24 сентября 2011

http://www.artemfrolov.com/articles/coloured-bash-prompt в настоящее время пусто (как, посетите Chrome / Firefox / Opera и посмотрите только пробел, без содержимого). Итак, после изучения примера здесь я обнаружил, что преобразование:

export PS1='\e[0;32m\u@\h\e[m \D{%b %d} \t $ '

который ломается, до

export PS1='\[\e[0;32m\]\u@\h\[\e[m\] \D{%b %d} \t $ '

, кажется, работает для меня (как дополнительный, конкретный пример).

Отдельно и немного не по теме, но полезно (по крайней мере, для моей справки): обновить вышеперечисленное с помощью полезного «сжатого пути» и жирного зеленого user @ host в приглашении:

export MYPS='$(echo -n "${PWD/#$HOME/~}" | awk -F "/" '"'"'{if (length($0) > 14) { if (NF>4) print $1 "/" $2 "/.../" $(NF-1) "/" $NF; else if (NF>3) print $1 "/" $2 "/.../" $NF; else print $1 "/.../" $NF; } else print $0;}'"'"')'
export PS1='\[\e[1;32m\]\u@\h\[\e[m\] \D{%b %d} \t $(eval "echo ${MYPS}")$ '

** Редактировать **: это назначение PS1 (2-я строка), imo, намного легче читать:

export MYPS='$(echo -n "${PWD/#$HOME/~}" | awk -F "/" '"'"'{if (length($0) > 14) { if (NF>4) print $1 "/" $2 "/.../" $(NF-1) "/" $NF; else if (NF>3) print $1 "/" $2 "/.../" $NF; else print $1 "/.../" $NF; } else print $0;}'"'"')'
export PS1='$USER@\[$(tput bold)\]$(hostname -s)\[$(tput sgr0)\] \D{%b %d} \t $(eval "echo ${MYPS}")$ '
...