[Comm] zsh и артифакт konsole

Sergey Vlasov =?iso-8859-1?q?vsu_=CE=C1_altlinux=2Eru?=
Сб Апр 12 20:23:51 MSD 2008


On Sat, Apr 12, 2008 at 07:40:05PM +0400, Grigory Fateyev wrote:
> Hello Andrey Rahmatullin!
> On Sat, 12 Apr 2008 21:11:24 +0600 you wrote:
> 
> > On Sat, Apr 12, 2008 at 07:07:57PM +0400, Grigory Fateyev wrote:
> > > Откуда может взяться странный артифак в виде подсвеченного знака
> > > процента между строками? (см. screenshot)
> > man zshoptions, PROMPT_SP, PROMPT_CR
> > 
> Спасибо за наводку, это помогло:
>  
> setopt no_prompt_sp
> 
> preexec()
> {
>     setopt prompt_sp
> }

На самом деле эта комбинация настроек решает другую проблему - убирает
мусор, появляющийся, если начать набирать первую команду после
открытия нового терминала, не дожидаясь завершения запуска zsh и
выдачи промпта.  Т.е., изначально опция prompt_sp отключается, и
набранные символы просто затираются первым промптом, а перед
выполнением первой команды опция prompt_sp включается (и далее
остаётся в таком состоянии), чтобы вывод команд, забывающих добавить
\n в конце, не пропадал.

То, что в данном случае такая настройка помогла, означает, что команда
setopt prompt_sp, добавленная в preexec(), так и не выполнилась -
очевидно, это определение было вставлено раньше уже имеющихся в .zshrc
команд:

case $TERM in
    xterm*|rxvt*|aterm*)
                        precmd () {
                            print -Pn "\e]0;TERM %n@%m: %~\t$1\a"
                        }
                        preexec () {
                            print -Pn "\e]0;TERM <%n@%m> $1\a"
                        }
                        ;;
esac

В результате новое определение preexec() перекрывает старое, и zsh
просто продолжает работать в режиме no_prompt_sp - в комбинации с
установленным по умолчанию prompt_cr это означает, что выдаваемые
запущенными командами строки, не имеющие в конце символа новой строки,
будут затираться промптом zsh.

Настоящая проблема находится в precmd() - команда print в этой функции
пытается вставить в заголовок окна терминала символ табуляции; при
использовании xterm это не вызывает проблем в самом терминале (хотя в
заголовок попадает "?"), а вот konsole, похоже, интерпретирует любые
управляющие символы в параметре "\e]0;" как признак конца строки, и
весь последующий вывод (включая сам символ табуляции) попадает в
терминал в виде обычного текста.  Нужно заменить "\t", например, на
пробел (всё равно табуляция в заголовке окна в общем случае не будет
отображаться правильно).

А setopt prompt_sp, если это необходимо, придётся добавлять во все
варианты определений preexec(), имеющиеся в .zshrc.
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип     : application/pgp-signature
Размер  : 189 байтов
Описание: Digital signature
Url     : <http://lists.altlinux.org/pipermail/community/attachments/20080412/72efdf13/attachment-0002.bin>


Подробная информация о списке рассылки community