Bash, похоже, находится в специальном режиме

Bash, похоже, находится в специальном режиме

Система: Debian 8 с XFCE, Cli: Konsole версии 2.14.2 (терминал называется "Konsole" ->https://konsole.kde.org/)

Мой друг попросил меня помочь ему со странной проблемой.

Некоторые клавиши ведут себя странно.

Например Shift + §, отображает только текущую строку (arg: 0)(У нас швейцарская клавиатураhttps://en.wikipedia.org/wiki/QWERTZ#/media/File:KB_Swiss.svg, вы можете найти этот ключ в левом верхнем углу)

Нажатие öдает (arg: 6). И так далее...

Выйти из этого «режима» можно с помощью следующих команд:

set -o vi
set +o vi

Но я не был в режиме vi до этого. Насколько я могу судить. Но что-то, похоже, "сбрасывается". Дело в том, что я также теряю некоторые настройки, которые мне нужны, если я использую две команды выше.

РЕДАКТИРОВАТЬ:Что я забыл упомянуть; На другом эмуляторе терминала - UXTerm- поведение "нормальное". Так, как я и хочу. Но в у XTermменя такое же поведение, как в Konsole.

ПРАВКА2:Как и просили:

user@myMachine:~$ bind -p | grep arg
"\M--": digit-argument
"\M-0": digit-argument
"\M-1": digit-argument
"\M-2": digit-argument
"\M-3": digit-argument
"\M-4": digit-argument
"\M-5": digit-argument
"\M-6": digit-argument
"\M-7": digit-argument
"\M-8": digit-argument
"\M-9": digit-argument
"\M-.": insert-last-argument
"\M-_": insert-last-argument
# universal-argument (not bound)
# vi-arg-digit (not bound)
# vi-yank-arg (not bound)
"\M-.": yank-last-arg
"\M-_": yank-last-arg
"\M-\C-y": yank-nth-arg
bioinf@ags-wav-debian-MandS:~$ set +o emacs
bioinf@ags-wav-debian-MandS:~$ bind -p | grep ö
bash: bind: warning: line editing not enabled

Дополнительная информация:

user@machine:~$ locale charmap
ANSI_X3.4-1968

user@machine:~$ bind -v | grep meta
set convert-meta on
set enable-meta-key on
set input-meta on
set meta-flag on
set output-meta on

решение1

Похоже, все сводится к тому, что кодировка в вашей локали — ASCII. ASCII — американская кодировка 60-х годов, которая является общим знаменателем для большинства современных наборов символов.

Обычно это происходит, когда локали не настроены (переменные среды LANG, LC_* не заданы) или когда они установлены в положение Cили POSIX.

Этот набор символов определяет 128 символов с байтовыми значениями от 0 до 127. Все символы, составляющие язык sh и встречающиеся в большинстве имен команд, находятся в ASCII. Но § и ° — нет.

Теперь, когда эти символы есть на вашей клавиатуре, что должно произойти, когда вы наберете их в эмуляторе терминала?

Если вы запускаете свой эмулятор терминала в локали, где набор символов — ASCII, вы сообщаете своему эмулятору терминала, что при нажатии A, ( XK_aсобытие нажатия клавиши X11) ему нужно отправить кодировку символа aв кодировке ASCII, то есть 0x61. Но когда вы нажимаете Shift+§( XK_degreeсобытие нажатия клавиши X11), он должен отправить кодировку для символа °, но такого символа в ASCII нет, так что ему делать?

xtermи rxvtвыберите отправку кодировки °в наборе символов iso-8859-1. Это 8-битный набор символов большинства стран западного мира (расширяет ASCII, чтобы охватить большинство символов, используемых в таких языках, как немецкий, французский, британский английский, испанский...). До UTF-8 это был наиболее часто используемый набор символов.

Мой konsoleи отправьте для каждого символа, не входящего в набор ASCII Eterm.xfce4-terminal?

Мой gnome-terminal и terminator отправляют кодировку UTF-8 °.

Что делать, если bashполучена кодировка iso8859-1 °(0xb0), как в ?xterm

Мы указали, что кодировка — ASCII, поэтому 0xb0 не соответствует ни одному известному символу.

В старые времена в США Ctrl+Xиспользовалось для ввода символов от 0 до 31 (управляющие символы). В ASCII это отправляло нижние 5 бит соответствующего символа. Например, Abeing 0x41, abeing 0x61, Ctrl+Aотправляло 0x61 и 0x1f, то есть 0x1 ( ^Aтакже известный как символ CA). В то время как Meta+Xотправляло кодировку xс установленным 8-м битом. abeing 0x61, Meta+Aотправляло 0x61 | 0x80, то есть 0xe1. Нажатие Meta+0отправляло 0x30 | 0x80, то есть 0xb0, также известный как (не)символ M-0.

В ASCII символы 0x0 -> 0x1f использовались для управляющих символов во времена телетайпов, большинство из которых больше не используются, а символы от 0x80 до 0xff не используются, так что это был способ ввода кодов, которые можно было использовать для других целей, кроме ввода текста. Например, emacs использовал их для клавиш редактирования: символ C-Bперемещает курсор на один символ влево, M-B(не)символ перемещает курсор на одно слово влево.

В настоящее время, поскольку большинство людей используют наборы символов, расширяющие ASCII за счет использования байтовых значений от 0x80 до 0xff, их больше не принято считать метасимволами. Meta+XТеперь вместо этого обычно отправляются два символа: символы ESC и X.

Тем не менее, в локали, где байтовые значения от 0x80 до 0xff не могут быть символами, когда bash(фактически readline) считывается байтовое значение с устройства tty, например 0xb0, он понимает его как M-0 (который по умолчанию привязан к digit-argument, что объясняет ваш arg: 0).

Это convert-metaнастройка в конфигурации readline. Вы найдете в документации readline ( man 3 readline), что когда readline определяет, что набор символов 7 бит, он устанавливает его в , onчтобы преобразовать эти байты 0xb0 в ESC + 0.

Если вы отключите это с помощью:

bind 'set convert-meta = off'

(и предполагая, что input-metaи output-metaтакже являются on). Тогда вы обнаружите, что нажатие °выводит на °экран. Но это будет кодировка 0xb0 iso8859-1, с °которой приложения не будут знать, что делать.

Что вам нужно сделать, так это исправить локаль на ту, которая содержит эти °символы. В настоящее время вам следует рассматривать только UTF-8, поскольку он охватывает все символы и широко поддерживается.

Поэтому проверьте конфигурацию вашего рабочего стола на предмет настроек интернационализации и выберите что-то вроде de_CH.UTF-8/ fr_CH.UTF-8/ it_CH.UTF-8(немецко/франко/итальяноязычная версия швейцарской версии с кодировкой UTF-8), что лучше всего соответствует вашей среде.

Возможно, вам придется выйти из системы и войти снова, чтобы эти данные были полностью учтены.

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

Связанный контент