OS X Терминальный текстовый стек поверх себя
В приложении терминала в Mac OS X Lion встречается странная проблема. Когда я вхожу в длинную строку текста, которая должна быть перенесена на следующую строку, когда она достигает края окна терминала, она продолжает печатать поверх текста над строкой над ней.
Вот несколько скриншотов, которые помогут проиллюстрировать проблему:
До того, как мой текст достигнет края окна:
![before]()
После того, как текст достигнет края окна:
![after]()
Я также предоставил скриншоты моих настроек текста и окна в случае, если они могут быть полезны.
Настройки текста:
![text]()
Настройки окна:
![window]()
Заранее благодарим за любую помощь. У меня была эта проблема на некоторое время, и я просто никогда не обходился. Теперь я действительно становлюсь болью в заднице, когда я попадаю в вещи, которые требуют больших команд grep и длинного имени пути.
Ответы
Ответ 1
PS1
переменная среды определяет, как будет выглядеть оболочка. man bash
дает полную документацию по нему. (На самом деле их несколько, для разных режимов).
Существует несколько файлов, которые могут быть установлены, как правило, из ~/.profile
, ~/.bashrc
, /etc/profile
или /etc/bashrc
.
Если вы собираетесь иметь цветовые коды или другие управляющие последовательности внутри него, вы должны соответствующим образом обернуть их \[
и \]
(и НЕ обернуть обычный текст), в противном случае редактирование строк может испортиться, как в вашем дело. Я предлагаю сбросить значение PS1
до значения по умолчанию, а затем аккуратно добавить элемент окраски по элементам.
Например:
PS1='\[\033[1m\033[32m\]\[email protected]\h \w\[\033[0m\]\$ '
^^^^^^^^^^^^^^^ ^^^^^^^
Команды окраски подчеркнуты. Обратите внимание, как они окружены \[ \]
.
Ответ 2
У меня такая же проблема, я нашел, если вы изменили
Дополнительно > Эмуляция > Объявить терминал как: ANSI.
Это разрешает проблему цветного PS1. С Mac Terminal
НО создает странное поведение:
Я нашел решение своей проблемы с ответом @koiyu.
https://apple.stackexchange.com/questions/37001/strange-behavior-in-terminal-with-custom-bash-profile/37036#37036
Ответ 3
У меня была такая же проблема из-за неправильного использования цветовых кодов. Вот мой PS1, который решил проблему. Также, если вы используете GIT, это также поможет показать ветку git, над которой вы работаете, и если ваше рабочее дерево загрязнено или нет. Поместите это в ваш .profile или .bash_profile
# Git branch in prompt.
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
parse_git_dirty() {
st=$(git status 2>/dev/null | tail -n 1)
if [[ $st == "" ]]; then
echo ''
elif [[ $st == "nothing to commit (working directory clean)" ]]; then
echo ''
elif [[ $st == 'nothing added to commit but untracked files present (use "git add" to track)' ]]; then
echo '?'
else
echo '*'
fi
}
# coloring the terminal comman line
SB_GREEN="\[\033[1;32m\]"
SB_BLUE="\[\033[1;34m\]"
SB_RED="\[\033[1;31m\]"
SB_NOCOLOR="\[\033[0m\]"
export PS1="$SB_GREEN\[email protected]\h$SB_NOCOLOR: $SB_BLUE\w$SB_GREEN\$(parse_git_branch)$SB_RED\$(parse_git_dirty)$SB_NOCOLOR $ "
Надеюсь, что это поможет.
Ответ 4
С руководством hamstergene мне удалось выяснить, как заставить его играть хорошо. Используя это руководство Geek Stuff и this It Me Tommy tutorial, Я смог определить, как я хочу, чтобы мой текст PS1 отображался. Изменение этого на нечто гораздо более упрощенное устранило странную проблему перекрытия текста, с которой я столкнулся.
До:
![before]()
После того, как:
![after]()
Я просто редактировал мой .bash_profile
и добавил следующую строку:
export PS1="[\[email protected]\h] > ";
Затем я пошел и изменил цвета окна для хорошей меры, потому что могу.
Ответ 5
Первоначальная проблема заключалась в том, что в PS1 появилась новая строка (FYI для любого, кто работает с этим)
Обычно это неправильно экранированные цветовые коды, но если это не так, что у вас есть новая строка в вашем ps1
Ответ 6
Как уже говорили другие, вы должны правильно обернуть свои цветовые команды в экранированные квадратные скобки. Однако, для меня это делает строку действительно, очень запутанной, чтобы смотреть на нее!
Таким образом, вот трюк, который я использую, чтобы всегда понимать это правильно, а также сделать его намного более читабельным.
Сначала я создаю функцию оболочки под названием setColor
примерно так...
setColor(){
echo "\[\033[${1}m\]"
}
Тогда я использую это так...
PS1="$(setColor 92)\u$(setColor 37):$(setColor 96)\w $(setColor)\$ "
Это так же, как писать это...
\[\033[92m\]\u\[\033[37m\]:\[\033[96m\]\w \[\033[m\]$
... но, как вы можете видеть, первое намного понятнее и гарантирует, что все правильно избежало.
Обратите внимание, что вы также можете указать несколько цветов, используя символ ;
. Единственное, что вы должны явно избежать, так что 92;41
становится 92\;41
, вот так...
PS1="$(setColor 92\;41)\u$(setColor 37):$(setColor 96)\w $(setColor)\$ "
Опять же, читать легче, чем этот...
\[\033[92;41m\]\u\[\033[37m\]:\[\033[96m\]\w \[\033[m\]$
Вы можете сделать этот шаг дальше, определив константы для цветов или даже функции "обертки" с названиями цветов, которые вы используете чаще всего, так что вы можете написать это...
PS1="$(setRed)\u$(setBlue):$(setGreen)\w $(resetColor)\$ "
Надеюсь, это поможет!