Домашня клавіша дивно діє в bash (tty та X) на довгих рядках введення


11

Коли я натискаю, Homeякщо мій поточний ввід досить короткий (скажімо, <36 символів), він працює добре. Однак, коли я набрав більш довгу команду, а потім хочу повернутися до початку, здається, що вона робить свою роботу, але команда більше не відображається . Схоже, я не на початку, але приблизно з 10 символів. Хоча якщо я набираю "наосліп", це працює добре, але це виглядає як тотальний безлад, ніби весь вхід зміщено вправо, але не перемальовано. Тому я набираю його, але "насправді" ні, тому що місце, яке я "стираю", - це "насправді" 10 символів праворуч. Відповідно, якщо я спробую стерти команду, перші 10 символів все одно відображаються, але якщо я натиснув Enterїї, відображається ще одна підказка, як ніби попередній вхід був порожнім.

Я знаю, що це не найкраще пояснення коли-небудь, але справа в тому, що баш визнає це і намагається зробити правильно, але часто не вдається.

Я відтворюю це як в tty, так і в терміналі в X сесії. Коли я натискаю Ctrl+, Vа потім Homeбачу різні послідовності ( ^[OHв X, ^[[1~в tty), але обидва, здається, є в моїх /etc/inputrc:

# do not bell on tab-completion
#set bell-style none

set meta-flag on
set input-meta on
set convert-meta off
set output-meta on

$if mode=emacs

# for linux console and RH/Debian xterm
"\e[1~": beginning-of-line
"\e[4~": end-of-line
"\e[5~": beginning-of-history
"\e[6~": end-of-history
"\e[7~": beginning-of-line
"\e[3~": delete-char
"\e[2~": quoted-insert
"\e[5C": forward-word
"\e[5D": backward-word
"\e\e[C": forward-word
"\e\e[D": backward-word
"\e[1;5C": forward-word
"\e[1;5D": backward-word

# for rxvt
"\e[8~": end-of-line

# for non RH/Debian xterm, can't hurt for RH/DEbian xterm
"\eOH": beginning-of-line
"\eOF": end-of-line

# for freebsd console
"\e[H": beginning-of-line
"\e[F": end-of-line
$endif

echo $TERMпоказує linuxв tty та xtermX сесії.

Його

GNU bash, версія 4.2.24 (2) -випуск (i686-pc-linux-gnu)

У когось є підказки про це?


1
Як довго ваш підказ? Чи набирає командний рядок довжиною близько 36 символів, заповнює один рядок вашого терміналу, і, таким чином, викликає прокручування сторони? Чи все-таки це трапляється, якщо ви користуєтесь цим підказкою? PS1='$ '
Мікель

@Mikel Я не знаю, що ви маєте на увазі, але ви, швидше за все, поруч із правильним слідом. Здається, це не відбувається, коли я використовую мінімалістичний підказку. Один я був трохи змінений у порівнянні з встановленим за замовчуванням: PS1="\e[0;36m[\u@\h \W]\$ \e[m". Чи щось із цим не так? Введення 36 символів не заповнює один рядок (на сьогоднішній день). Також у мене немає бічної прокрутки в tty :)
Лев Левицький

@Mikel Я дотримувався поради jw013 і коригував підказку, що, здається, вирішує це. Можливо, ви могли б розібратися в тому, в чому проблема, щоб я міг нагородити вас якоюсь репутацією, як першою, щоб це з'ясувати :)
Лев Левицький

Відповіді:


13

Вам потрібно оточити недрукувальні частини вашого підказки (включаючи, але не обмежуючись ними, для виведення послідовностей для зміни кольорів) за допомогою \[та \].

Ваша оригінальна підказка: \e[0;36m[\u@\h \W]\$ \e[m
Виправлена ​​підказка:\[\e[0;36m\][\u@\h \W]\$ \[\e[m\]

\[І \]сказати , bashщо все між ними на самому ділі не друкувати на екрані, тобто має нульову довжину. Розрахункова довжина підказки потрібна, щоб знати, куди слід лунати з введеними символами. Виведення з \[ \]причини викликає bashнеправильну довжину підказки, що часто призводить до дивної поведінки залежної від геометрії терміналу через bashуявлення про те, де курсор не співпадає з реальністю.


Дякую, це вирішує проблему. Однак я вдячний би деяким поясненням: що було причиною такої поведінки, чим займаються квадратні дужки тощо. Було б непогано мати все це на одній сторінці і могло б допомогти комусь іншому в майбутньому.
Лев Левицький

@LevLevitsky Я додав коротке пояснення до відповіді.
jw013

Щиро дякую! Це має для мене більше сенсу зараз.
Лев Левицький
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.