Чи можу я налаштувати 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 ) лише для візуалізації.


@dessert не потребує щедрості, дійсно. Я просто потрапив на проблему і написав питання про неї. Пізніше я знайшов достатньо близьку конфігурацію через пошук Google, щоб зрозуміти відповідь нижче. Я все ще шукаю відповідь, щоб зробити NBSP видимим замість того, щоб вимкнути символ для всіх випадків. Я думаю, я хотів би мати видимий NBSP на рівні читання, щоб весь термінальний вихід не був заплутаний, якщо я маю NBSP у рядках даних.
Мікко Ранталайнен

@MikkoRantalainen ви могли б пояснити, чого ви все ще пропускаєте? Оскільки ви знайшли спосіб відображення символів, чому цього " ":␣недостатньо? Що ще потрібно?
тердон

@dessert Я хотів би мати функцію, де я міг би записати NBSP в командному рядку і отримати, echo a␣bале отриманий рядок виводу був echo a bз реальним NBSP у висновку. Тому я думаю, що це потрібно робити на рівні читання (тобто редактор командного рядка завжди відображає видимий символ, але емулятор термінала не може знати різницю між дисплеєм редактора і відображенням виводу, тому емулятор термінала не може зробити візуальну заміну для візуалізації ).
Мікко Ранталайнен

1
Вирішити це на рівні читання - це справді приємно, але ви можете зіткнутися з тією ж проблемою під час написання сценарію оболонки у vim / emacs / тощо у термінал. Дивіться bugzilla.gnome.org/show_bug.cgi?id=788673 для робочого доказу виправлення патчу для gnome-terminal, щоб виділити відповідність рядків, включаючи, можливо, один символ 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 мс (налаштовується вище). Однак, поки не минув тайм-аут, введення символу труби самостійно нічого не виведе. І якщо ви введете послідовність занадто повільно, виправлення не застосовуватиметься. Також зауважте, що тайм-аут є глобальним, тому, якщо ви збираєтесь використовувати будь-які інші послідовності, вам доведеться встановити тайм-аут досить довгий, щоб мати можливість вводити найдовшу послідовність. (Бібліотека читання ліній недостатньо розумна, щоб дозволити вводити символи та пізніше замінити вже видимі символи після того, як послідовність символів збігається з конфігурацією.)


0

Є чудова стаття, яка займається цією проблемою:

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

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

Ідея полягає в тому, щоб ця команда була включена, ~/.bashrcщоб вона автоматично завантажувалася при gnome-terminalвідкритті. Але, як я вже сказав, це ще не працює ...


1
Це стосується лише повідомлень про помилки. Я вважаю за краще вирішити проблему під час редагування командного рядка, тому що я можу написати щось на зразок, perl -i -npe 's/MARKER/4 KB/'і я випадково просунув NBSP між 4і K. На жаль, проблема зберігається у файлі, але я не отримую помилок, і командний рядок, який я написав, виглядає ідеально.
Мікко Ранталайнен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.