Подтвердить что ты не робот

OS X Терминальный текстовый стек поверх себя

В приложении терминала в Mac OS X Lion встречается странная проблема. Когда я вхожу в длинную строку текста, которая должна быть перенесена на следующую строку, когда она достигает края окна терминала, она продолжает печатать поверх текста над строкой над ней.

Вот несколько скриншотов, которые помогут проиллюстрировать проблему:

До того, как мой текст достигнет края окна:

before

После того, как текст достигнет края окна:

after

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

Настройки текста:

text

Настройки окна:

window

Заранее благодарим за любую помощь. У меня была эта проблема на некоторое время, и я просто никогда не обходился. Теперь я действительно становлюсь болью в заднице, когда я попадаю в вещи, которые требуют больших команд grep и длинного имени пути.

4b9b3361

Ответ 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)\$ "

Надеюсь, это поможет!