Конфигурация PS1 в zsh приводит к удалению предыдущей строки после каждой перерисовки запроса

#ubuntu-14.04 #zsh

#ubuntu-14.04 #zsh

Вопрос:

В моей .zsh конфигурации есть следующие строки:

 function zle-line-init zle-keymap-select {
    VIM_PROMPT="${${KEYMAP/vicmd/ [NORMAL]}/(main|viins)/}"
    PS1=$'e[0;36m%ne[m at e[0;33m%me[m in e[0;32m%~e[me[0;34m$(vcs_info_wrapper)e[me[1;33m$VIM_PROMPTe[mn$ '
    zle reset-prompt
}
  

Что происходит, так это то, что если окно терминала слишком узкое, каждый раз, когда перерисовывается приглашение, предыдущая строка удаляется. Например, допустим, у меня есть следующее приглашение:

 first line
some text here
another text here
sergiyb at wing in ~ [master *]
$ 
  

Затем я нажимаю Escapeи получаю

 first line
some text here
sergiyb at wing in ~ [master *] [NORMAL]
$ 
  

Теперь, если я нажмуi, я получу это

 first line
sergiyb at wing in ~ [master *]
$ 
  

Аналогично, если я ввожу команду ls , в ней отображаются все файлы, но удаляется последняя строка:

 sergiyb at wing in ~ [master *]
$ ls test_dir_with_files_1_to_10
file1   file2  file4  file6  file8
  

Однако, если окно терминала достаточно широкое, этого не происходит, например

 sergiyb at wing in ~ [master *]
$ ls test_dir_with_files_1_to_10
file1  file10  file2  file3  file4  file5  file6  file7  file8  file9
  

Также, если я попытаюсь сделать свою строку PS1 короче, например, удалив имя пользователя, это перестанет происходить, пока я не уменьшу ширину терминала еще больше.

Есть идеи, что вызывает это и / или как это можно решить?

Ответ №1:

zsh невозможно точно определить размер приглашения, поскольку он не знает, что терминал не отображает управляющие коды ANSI в виде печатаемых символов. Вместо этого используется zsh собственное форматирование.

 PS1=$'%F{cyan}%n%f at %F{yellow}%m%f in %F{green}%~%F{blue}$(vcs_info_wrapper)%B%F{yellow}$VIM_PROMPT%f%bn$ '
  

Комментарии:

1. Могу ли я получить яркий и темно-желтый с ними? В escape-кодах ANSI это будет e[0;33m и e[1;33m .

2. %B/%b Пара должна включать жирный / яркий для второго желтого слова.