1

У меня проблема с zsh/oh-my-zsh с моим настраиваемым приглашением PS1 (которое я перенес из bash).

Когда я использую встроенную подсказку zsh/oh-my-zsh и вкладку для автозаполнения, это работает как ожидалось.

Когда я использую собственное приглашение PS1, вся область ввода перемещается примерно на 8 пробелов и остается там до тех пор, пока я не отправлю разрыв / новую строку.

Примеры:

Я набрал в VIM и вкладке

Встроенная тема, robbyrussell с приглашением по умолчанию:

Встроенная тема * robbyrussell * с приглашением по умолчанию:

Та же тема, пользовательская подсказка PS1:

Та же тема, пользовательская подсказка PS1:

Определения строк и переменных PS1 в .zshrc:

# Monokai colours
D=$'\e[37;40m'
PINK=$'\e[35;40m'
GREEN=$'\e[32;40m'
ORANGE=$'\e[33;40m'    

export PS1='${PINK}andrew${D}@${ORANGE}macbook${D}:%~$ '

В качестве теста я пробовал подсказку без переменных цвета, и она работает

2 ответа2

2

Кажется, что коды ANSI мешают вашему терминалу, возможно, из-за некоторых взаимодействий с другим содержимым PS1 или из-за того, что вы не сбрасываете настройки по умолчанию.

К счастью, в zsh нет необходимости использовать управляющие коды ANSI. Вы можете использовать %F{color} и %K{color} для установки цветов переднего плана и фона соответственно и %f и %k для сброса значений по умолчанию (см. Руководство по Zsh для получения дополнительной информации)

Любой из них должен сделать трюк:

PS1='%5Fandrew%f@%3Fmacbook%f:%~$ '
PS1='%F{5}andrew%f@%F{3}macbook%f:%~$ '
PS1='%F{magenta}andrew%f@%F{yellow}macbook%f:%~$ '

Я использовал %f вместо %7F или %F{white} , предполагая, что вы действительно хотите просто отключить раскраску в этом месте (отсюда и название переменной D вместо WHITE). Если вы хотите использовать %F{white} вместо этого, вы должны поместить %f в конце PS1 .

Если вы используете 88-цветной или 256-цветной терминал, вы можете даже использовать эти индексы этих цветов. Например, %F{221} даст вам темно-желтый.


Также обратите внимание, что обычно нет необходимости export PS1 в zsh или bash .

1

Чистое решение было дано ответом @ Adaephon, который я определенно рекомендую. Тем не менее, я хочу сообщить вам причину ваших неприятностей:

Проблемы возникают из-за того, что zsh считает escape-коды по длине приглашения. Это неправильно, потому что эти коды обрабатываются эмулятором терминала и не отображаются, что приводит к смещению, когда приглашение частично перерисовывается.

Но для этого случая в строках подсказки можно использовать специальный синтаксис. Цитируется из man zshmisc:

%{...%} Включить строку как буквенную escape-последовательность. Строка в фигурных скобках не должна менять позицию курсора. Брекеты пары могут гнездиться.

Итак, в вашем примере вы бы в конечном итоге

PS1='%{${PINK}%}andrew%{${D}%}@%{${ORANGE}%}macbook%{${D}%}:%~$ '

который выглядит некрасиво и трудно читать, но работает, как ожидалось.

И наконец, еще одно замечание: если вы используете PS1='...' (одинарные кавычки), вам нужно активировать опцию PROMPTSUBST , чтобы ваши коды выхода цвета заменялись при каждом отображении подсказки. Если вы используете PS1="..." (двойные кавычки), escape-коды заменяются один раз при определении PS1 . Последнее не динамично, но достаточно в вашем конкретном случае.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .