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

10

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

 grep: command not found

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

grep: command not found

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

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

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

Микко Ранталайнен
источник
@ Пустыня не нужна, щедрость, правда. Я просто ударил проблему и написал вопрос об этом. Позже я нашел достаточно близкую конфигурацию через поиск Google, чтобы выяснить ответ ниже. Я все еще ищу ответ, чтобы сделать NBSP видимым вместо отключения символа для всех случаев. Я думаю, что я хотел бы иметь видимый NBSP на уровне readline, чтобы все выходные данные терминала не были испорчены, если у меня есть NBSP в строках данных.
Микко Ранталайнен,
@MikkoRantalainen, не могли бы вы объяснить, что вам все еще не хватает, более четко? Поскольку вы нашли способ сопоставления персонажей, почему этого " ":␣недостаточно? Что еще тебе нужно?
тердон
@dessert Я хотел бы иметь функцию, где я мог бы написать NBSP в командной строке и получить, echo a␣bно в результате выходная строка была echo a bс реальным NBSP в выводе. Таким образом, я думаю, что это должно быть сделано на уровне readline (то есть редактор командной строки всегда отображает видимый символ, но эмулятор терминала не может знать разницу между отображением редактора и отображением вывода, и поэтому эмулятор терминала не может выполнять визуальную замену для рендеринга. ).
Микко Ранталайнен
1
Решение на уровне readline действительно хорошо, но вы можете столкнуться с той же проблемой, когда пишете скрипт оболочки в vim / emacs / etc в терминале. См. Bugzilla.gnome.org/show_bug.cgi?id=788673 для работающего доказательства концептуального патча для gnome-терминала для выделения совпадений строк, включая, возможно, один символ NBSP. (Да, я знаю, что вы сказали, что не хотите изменять исходный код…)
egmont
1
Другой подход заключается в том, чтобы обратиться к нему на уровне шрифта с помощью специального шрифта, где глиф NBSP не пуст, наряду с некоторой конфигурацией fontconfig. Это также будет работать для графических редакторов, а не только для терминала. Еще один подход состоит в том, чтобы изменить раскладку клавиатуры, чтобы она выделяла обычное пространство, и использовать другой метод для входа в NBSP в том редком случае, когда это то, что вам нужно.
egmont

Ответы:

9

Это можно сделать на 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 не достаточно умна, чтобы позволить вводить символы, а затем заменять уже видимые символы после того, как последовательность символов соответствует конфигурации.)

Микко Ранталайнен
источник
0

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

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

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

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

WinEunuuchs2Unix
источник
1
Это будет иметь дело только с сообщениями об ошибках. Я бы предпочел уловить проблему, когда я редактирую командную строку, потому что я мог бы написать что-то вроде этого perl -i -npe 's/MARKER/4 KB/'и случайно вставить NBSP между 4и K. Ой, проблема сохраняется в файле, но я не получаю никакой ошибки, и написанная мной командная строка выглядит идеально.
Микко Ранталайнен