Могу ли я настроить bash/readline для автоматического преобразования NBSP в обычное пространство?

Я использую финскую раскладку клавиатуры, которая отображает AltGr+Space на неразрывный пробел (NBSP, U+00A0). Я в целом доволен этим, но обнаружил, что часто случайно пишу NBSP вместо обычного пробела после трубы "|"Символ (написанный с помощью AltGr+< с финской раскладкой клавиатуры) при использовании командной строки bash. Я думаю, это связано с тем, что мне нужно удерживать AltGr при наборе канала и освобождать его, прежде чем вводить пробел. И когда у меня плохое время для выпуска AltGr я получаю невидимую опечатку в командной строке и сообщения об ошибках, такие как

 grep: command not found

который выглядит очень похоже на

grep: command not found

что делает эту проблему немного трудно заметить в первый раз.

Я знаю, что могу отключить NBSP, но я бы предпочел отключить его (имея AltGr+Space для получения обычного пробела) только после символа канала или, если это невозможно, всегда в командной строке bash или readline уровень. Есть ли простой способ сделать это без изменения исходного кода Bash, readline или мой эмулятор терминала (gnome-terminal)?

Другим хорошим решением было бы настроить NBSP так, чтобы он был каким-то образом виден в командной строке, например, заменен другим символом (скажем, U + 2423). ) только для рендеринга.

1 ответ

Это можно сделать на readline уровень два разных способа.

Способ 1

Поместите следующее в .inputrc (файл конфигурации для readline):

# include default system config because ~/.inputrc overrides system config
$include /etc/inputrc
# map NBSP to regular space (left part has NBSP in quotes, right part has space)
" ":" "

Если уценка испортила вышесказанное, вы должны поместить NBSP в кавычки слева от двоеточия, как объяснено в комментарии. Это отобразит любое возникновение NBSP во входном потоке с обычным пробелом.

Способ 2

Поместите следующее в .inputrc:

# include default system config because ~/.inputrc overrides system config
$include /etc/inputrc
# map "pipe + NBSP" to "pipe + regular space" (left part has NBSP in quotes)
"| ":"| "
set keyseq-timeout 250

Идея состоит в том, чтобы отобразить последовательность ключей {pipe, за которой следует NBSP}, в {pipe, за которым следует пробел}. Это работает, если вы набираете последовательность в течение 250 мс (настраивается выше). Тем не менее, пока не истечет тайм-аут, один только ввод символа канала ничего не выведет. И если вы введете последовательность слишком медленно, исправление не будет применено. Также обратите внимание, что время ожидания является глобальным, поэтому, если вы намереваетесь использовать любые другие последовательности, вы должны установить время ожидания достаточно длительное, чтобы можно было набрать самую длинную последовательность. (Библиотека readline не достаточно умна, чтобы позволить вводить символы, а затем заменять уже видимые символы после того, как последовательность символов соответствует конфигурации.)

Есть отличная статья, посвященная этой проблеме:

Я пытался решить основную проблему с grep сообщения об ошибках и изменение NBSP на что-то более заметное, используя exec команда. Я еще не получил синтаксис:

exec 2> >(tr $'\xa0' $'\x43' >&2) 

Идея состоит в том, чтобы иметь эту команду в ~/.bashrc поэтому он автоматически загружается с gnome-terminal открытие. Но, как я уже сказал, это еще не работает...

Другие вопросы по тегам