удар - сложная подсказка

Мой ~/.xsession файл имеет одну строку:

gnome-session --session=cinnamon

Я выполняю xrdp на сервере Linux Mint и соединяюсь с клиентом RDC. Похоже, что я сижу в рабочем столе; даже мой носатый сценарий работает на клиенте RDC.

4
03.08.2014, 23:43
2 ответа

Необходимо вложить невидимые части текста запроса в \[ и \].
Это используется bash для вычисления длины полной подсказки, чтобы она могла определить, где будет находиться курсор после ее печати.
Например, цветовые экранирующие коды ANSI невидимы - они меняют цвет текста, который будет выводиться позже. Их нужно вложить следующим образом:

\e[1;35m становится \[\e[1;35m\]

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

Это еще один аспект первой проблемы: неправильно рассчитана длина текста подсказки.

Давайте посмотрим на исправленный текст приглашения из вашей ссылки:

# login and computer name                                                      
PS1='[\e[\[1;37m\]\]\u\e[\[m\]\]@\e[\[1;32m\]\]\h\e[\[m\]\]] '                  
# date, time                                                                    
PS1=$PS1'[\e[\[1;34m\]\]\D{%Y-%m-%d} \e[\[1;35m\]\]\t\e[\[m\]\]] '              
# working directory and result of last command                                  
PS1=$PS1'\e[\[1;33m\]\]\w\e[\[m\]\] \e[\[1;31m\]\]${?#0}\e[\[m\]\]\n '          
# command prompt                                                                
PS1=$PS1'\e[\[1;36m\]\]\$\e[\[m\]\] '

Проблема в том, что \[ и \] не вложены целые цветовые экранирующие последовательности:
. Запрос начинается с

[\e[\[1;37m\]\]... 

Последовательность цветного эвакуационного запроса в этом окне имеет вид \e[1;37m. Таким образом, экранирующий символ \e, а [ находится снаружи. По крайней мере, [ будет засчитан как видимый. Также есть два закрывающих \] - это может не вызвать проблемы, но, по крайней мере, сбивает с толку - они не могут быть вложены.
Правильный способ записи:

[\[\e[1;37m\]... 

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

3
27.01.2020, 20:54

Вы должны немного модулизировать это - это значительно упростит отслеживание:

CS='\[\033[1;3' CE='m\]'
WT=${CS}7${CE} LB=${CS}6${CE} PR=${CS}5${CE} \
DB=${CS}4${CE} YL=${CS}3${CE} GN=${CS}2${CE} RD=${CS}1${CE} 
CE='\[\033[m\]' CS=

Now you do your things:

# login and computer name                                                      
PS1="[${WT}\u${CE}@${GN}\h${CE}] "

...

And so on so on... Видите? Немного проще сказать, что происходит в этом направлении.

2
27.01.2020, 20:54

Теги

Похожие вопросы