Невозможно изменить команду в Zsh - PullRequest
0 голосов
/ 20 марта 2020

У меня есть пользовательское приглашение в Zsh. В конце я закрашиваю последний символ красным или зеленым в зависимости от того, была ли последняя команда успешной или неудачной. Однако, когда я делаю это, я не могу go вернуть назад и отредактировать предыдущие команды.

Это код подсказки:

%{%F%(?.$fg[green].$fg[red])>%f%}

Пример рабочего процесса :

  1. Я ввожу команду, которая переносится на новую строку:

> printf "%s\n" "This is a very long printf. How long is it? It's so very very long that it wraps onto the next line."

После этого я нажимаю стрелку вверх и изменяю команду, удаляя и вводя заново «is it». Теперь командная строка показывает:

> printf "%s\n" "This is a very long printf. How long is it It's so very very long that it wraps onto the next line."

Это распечатывает:

This is a very long printf. How long iis it It's so very very long that it wraps onto the next line.

Я предполагаю, что я не завершаю цветовые коды каким-либо образом, так что приглашение перетекает в фактические команды I ' Я пытаюсь войти. Он ведет себя плохо только тогда, когда приглашение переходит на новую строку. Может кто-нибудь увидеть, что не так с моей подсказкой?

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

1 Ответ

1 голос
/ 20 марта 2020

zsh не понимает, какова длина запроса. Оболочка уже знает, что ее собственный %F escape не влияет на длину приглашения на экране; вам не нужно заключать его в %{...%}, как если бы это было так же, как в bash.

PS1="%F%(?.$fg[green].$fg[red])>%f"

Если fg содержит фактические определяемые терминалом c escape-последовательности, то вам потребуется %{...%}, но вы бы вообще не использовали %F, так как вы его не используете. Таким образом, вам может понадобиться что-то вроде

PS1="%(?.%{$fg[green]%}.%{$fg[red]}%})>%f"

Но вам не нужен отдельный массив цветов; zsh имеет встроенные также.

PS1='%(?.%F{green}.%F{red})>%f '
...