Czy mogę skonfigurować bash / readline, aby automatycznie konwertować NBSP na normalne miejsce?

10

Używam fińskiego układu klawiatury, który odwzorowuje AltGr+ Spacena niezniszczalną przestrzeń (NBSP, U + 00A0). Ogólnie jestem z tego zadowolony, ale okazuje się, że często przypadkowo piszę NBSP zamiast normalnej spacji po potoku „ |” (napisany za pomocą AltGr+ <z fińskim układem klawiatury) podczas korzystania z linii poleceń bash. Myślę, że jest to spowodowane faktem, że muszę przytrzymać AltGrpodczas pisania fajki i zwolnić ją przed uderzeniem w spację. A kiedy mam zły czas na wydanie, AltGrkończę z niewidoczną literówką w wierszu poleceń i komunikatami o błędach, takimi jak

 grep: command not found

który wygląda dość podobnie do

grep: command not found

co sprawia, że ​​problem ten jest nieco trudny do zauważenia za pierwszym razem.

Wiem, że mogę wyłączyć NBSP, ale wolałbym go wyłączyć (mając AltGr+, Spaceaby utworzyć zwykłe miejsce) tylko po znaku potoku, a jeśli nie jest to możliwe, zawsze w wierszu poleceń lub na readlinepoziomie bash . Czy jest jakiś prosty sposób, aby to zrobić bez modyfikowania kodu źródłowego bash readlinelub emulatora terminala ( gnome-terminal)?

Innym dobrym rozwiązaniem byłoby skonfigurowanie NBSP, aby było jakoś widoczne w wierszu poleceń, np. Zastąpione innym znakiem (powiedzmy U + 2423 ) tylko do renderowania.

Mikko Rantalainen
źródło
@ deser nie ma potrzeby bounty, naprawdę. Właśnie trafiłem w problem i napisałem o nim pytanie. Później znalazłem wystarczająco blisko konfiguracji za pomocą wyszukiwarki Google, aby znaleźć odpowiedź poniżej. Wciąż szukam odpowiedzi, aby uwidocznić NBSP zamiast wyłączać postać we wszystkich przypadkach. Myślę, że chciałbym mieć widoczne NBSP na poziomie odczytu, aby wszystkie dane wyjściowe terminala nie były pomieszane, jeśli mam NBSP w ciągach danych.
Mikko Rantalainen
@MikkoRantalainen, czy możesz wyjaśnić, czego jeszcze brakuje? Skoro znalazłeś sposób na mapowanie postaci, dlaczego nie " ":␣wystarczy? Co jeszcze potrzebujesz?
terdon
@dessert Chciałbym mieć funkcję, w której mógłbym napisać NBSP w wierszu poleceń i uzyskać, echo a␣bale wynikowa linia wyjściowa była echo a bz prawdziwym NBSP w danych wyjściowych. W związku z tym myślę, że należy to zrobić na poziomie odczytu (tzn. Edytor wiersza poleceń zawsze wyświetla widoczny znak, ale emulator terminala nie może rozpoznać różnicy między wyświetlaniem edytora a wyświetlaniem danych wyjściowych, a zatem emulator terminala nie może dokonać wizualnej zamiany renderowania ).
Mikko Rantalainen
1
Rozwiązanie go na poziomie readline jest wprawdzie przyjemne, ale możesz napotkać ten sam problem podczas pisania skryptu powłoki w vim / emacs / etc w terminalu. Zobacz bugzilla.gnome.org/show_bug.cgi?id=788673, aby zobaczyć działającą poprawkę sprawdzającą koncepcję dla gnome-terminal, aby podświetlić dopasowania łańcucha, w tym być może pojedynczy znak NBSP. (Tak, wiem, że powiedziałeś, że nie chcesz modyfikować żadnego kodu źródłowego…)
egmont
1
Innym podejściem jest rozwiązanie tego problemu na poziomie czcionki za pomocą specjalnej czcionki, w której glif NBSP nie jest pusty, wraz z pewną konfiguracją fontconfig. Działa to również w przypadku edytorów graficznych, a nie tylko terminala. Jeszcze innym podejściem jest zmodyfikowanie układu klawiatury w celu emitowania regularnego miejsca i użycie innej metody wprowadzania NBSP w rzadkich przypadkach, gdy jest to potrzebne.
egmont

Odpowiedzi:

9

Można to zrobić na readlinepoziomie na dwa różne sposoby.

Metoda 1

Wstaw .inputrc(plik konfiguracyjny dla 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)
" ":" "

Jeśli obniżenie wartości pomniejsza powyższe, musisz umieścić NBSP w cudzysłowach po lewej stronie okrężnicy, jak wyjaśniono w komentarzu. Spowoduje to zmapowanie każdego wystąpienia NBSP w strumieniu wejściowym z regularną spacją.

Metoda 2

Wprowadź następujące dane .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

Pomysł polega na zamapowaniu sekwencji klawiszy {pipe, po której następuje NBSP} na {pipe, po której następuje spacja}. Działa to, jeśli wpiszesz sekwencję w ciągu 250 ms (konfigurowalne powyżej). Jednak dopóki limit czasu nie minie, samo wpisanie symbolu potoku nie wyprowadzi niczego. A jeśli wpiszesz sekwencję zbyt wolno, poprawka nie zostanie zastosowana. Należy również pamiętać, że limit czasu jest globalny, więc jeśli zamierzasz użyć innych sekwencji, musisz ustawić limit czasu na tyle długo, aby móc wpisać najdłuższą sekwencję. (Biblioteka readline nie jest wystarczająco sprytna, aby umożliwić wpisywanie znaków, a później zastąpić już widoczne znaki po dopasowaniu sekwencji znaków do konfiguracji).

Mikko Rantalainen
źródło
0

Istnieje doskonały artykuł na ten temat:

Próbowałem rozwiązać główny problem za pomocą grepkomunikatów o błędach i zmienić NBSP na coś bardziej widocznego za pomocą execpolecenia. Jednak nie mam jeszcze poprawionej składni:

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

Chodzi o to, aby mieć to polecenie, ~/.bashrcaby automatycznie ładowało się z gnome-terminalotwieraniem. Ale jak powiedziałem, jeszcze nie działa ...

WinEunuuchs2Unix
źródło
1
To dotyczyłoby tylko komunikatów o błędach. Wolę wychwycić problem podczas edytowania wiersza polecenia, ponieważ mogę pisać coś w stylu perl -i -npe 's/MARKER/4 KB/'i przypadkowo wsuwam NBSP między 4a K. Ups, problem jest zapisywany w pliku, ale nie pojawia się żaden błąd, a napisana linia poleceń wygląda idealnie.
Mikko Rantalainen