Kann ich bash / readline so konfigurieren, dass NBSP automatisch in normalen Speicherplatz konvertiert wird?

10

Ich verwende ein finnisches Tastaturlayout, das AltGr+ Spaceeinem nicht unterbrechenden Bereich (NBSP, U + 00A0) zuordnet. Ich bin im Allgemeinen damit zufrieden, aber ich stelle fest, dass ich häufig versehentlich NBSP anstelle des normalen Leerzeichens nach dem Pipe- |Symbol (geschrieben mit AltGr+ <mit finnischem Tastaturlayout) schreibe, während ich die Bash-Befehlszeile verwende. Ich denke, dies wird durch die Tatsache verursacht, dass ich AltGrbeim Tippen des Rohrs halten und loslassen muss, bevor ich auf die Leertaste treffe. Und wenn ich ein schlechtes Timing für die Veröffentlichung von AltGrhabe, bekomme ich unsichtbaren Tippfehler in der Kommandozeile und Fehlermeldungen wie

 grep: command not found

das sieht ziemlich ähnlich aus

grep: command not found

Das macht dieses Problem beim ersten Mal etwas schwer zu bemerken.

Ich weiß, dass ich NBSP deaktivieren kann , aber ich würde es vorziehen, es zu deaktivieren (mit AltGr+ Space, um regulären Speicherplatz zu erzeugen), nur nach dem Pipe-Zeichen oder, wenn dies nicht möglich ist, immer in der Bash-Befehlszeile oder readline-Ebene. Gibt es eine einfache Möglichkeit, dies zu tun, ohne den Quellcode von bash readlineoder meinen Terminalemulator ( gnome-terminal) zu ändern ?

Eine andere gute Lösung wäre, NBSP so zu konfigurieren, dass es in der Befehlszeile irgendwie sichtbar ist, z. B. durch ein anderes Zeichen (z. B. U + 2423 ) ersetzt, das nur zum Rendern dient.

Mikko Rantalainen
quelle
@ Dessert keine Notwendigkeit für ein Kopfgeld, wirklich. Ich habe gerade das Problem getroffen und eine Frage dazu geschrieben. Später fand ich über die Google-Suche genügend Konfiguration, um die Antwort unten herauszufinden. Ich suche immer noch nach einer Antwort, um NBSP sichtbar zu machen, anstatt den Charakter für alle Fälle zu deaktivieren. Ich denke, ich möchte sichtbares NBSP auf Readline-Ebene haben, damit die gesamte Terminalausgabe nicht durcheinander gebracht wird, wenn ich NBSP in Datenzeichenfolgen habe.
Mikko Rantalainen
@MikkoRantalainen Könntest du klarer erklären, was dir noch fehlt? Warum reicht es nicht " ":␣aus, Charaktere gefunden zu haben? Was brauchst du noch?
Terdon
@dessert Ich hätte gerne eine Funktion, mit der ich NBSP in die Befehlszeile schreiben und abrufen könnte, echo a␣baber die resultierende Ausgabezeile enthielt echo a bechtes NBSP in der Ausgabe. Als solche, ich denke , es auf der Readline- Ebene getan werden muss (das heißt, Kommandozeilen - Editor zeigt immer sichtbar Charakter , aber Terminal - Emulator nicht den Unterschied zwischen Editoranzeige und Ausgabeanzeige wissen kann und daher der Terminal - Emulator nicht den visuellen Ersatz für das Rendering tun ).
Mikko Rantalainen
1
Das Lösen auf Readline-Ebene ist in der Tat nett, aber Sie könnten das gleiche Problem haben, wenn Sie ein Shell-Skript in vim / emacs / etc im Terminal schreiben. Unter bugzilla.gnome.org/show_bug.cgi?id=788673 finden Sie einen funktionierenden Proof-of-Concept-Patch für das Gnome-Terminal, um Zeichenfolgenübereinstimmungen hervorzuheben, einschließlich möglicherweise des einzelnen NBSP-Zeichens. (Ja, ich weiß, dass Sie gesagt haben, Sie wollten keinen Quellcode ändern ...)
egmont
1
Ein anderer Ansatz besteht darin, es auf Schriftartenebene über eine spezielle Schriftart zu adressieren, bei der die Glyphe von NBSP nicht leer ist, zusammen mit einer Konfiguration von fontconfig. Dies würde auch für grafische Editoren funktionieren, nicht nur für das Terminal. Ein weiterer Ansatz besteht darin, das Tastaturlayout so zu ändern, dass regulärer Speicherplatz ausgegeben wird, und in seltenen Fällen eine andere Methode zur Eingabe von NBSP zu verwenden, wenn Sie dies benötigen.
Egmont

Antworten:

9

Dies kann auf der readlineEbene auf zwei verschiedene Arten erfolgen.

Methode 1

Geben Sie Folgendes ein .inputrc(die Konfigurationsdatei für 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)
" ":" "

Wenn Markdown das oben genannte durcheinander bringt, müssen Sie NBSP in Anführungszeichen auf der linken Seite des Doppelpunkts setzen, wie im Kommentar erläutert. Dadurch wird jedes Auftreten von NBSP im Eingabestream mit einem regulären Leerzeichen zugeordnet.

Methode 2

Geben Sie Folgendes ein .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

Die Idee ist, die Schlüsselsequenz {Pipe gefolgt von NBSP} {Pipe gefolgt von Leerzeichen} zuzuordnen. Dies funktioniert, wenn Sie die Sequenz innerhalb von 250 ms eingeben (oben konfigurierbar). Bis das Zeitlimit abgelaufen ist, gibt die Eingabe des Pipe-Symbols allein nichts aus. Und wenn Sie die Sequenz zu langsam eingeben, wird der Fix nicht angewendet. Beachten Sie auch, dass das Zeitlimit global ist. Wenn Sie also andere Sequenzen verwenden möchten, müssen Sie das Zeitlimit lange genug einstellen, um die längste Sequenz eingeben zu können. (Die Readline-Bibliothek ist nicht clever genug, um die Zeichen einzugeben und später bereits sichtbare Zeichen zu ersetzen, nachdem die Zeichenfolge mit der Konfiguration übereinstimmt.)

Mikko Rantalainen
quelle
0

Es gibt einen ausgezeichneten Artikel, der sich mit diesem Problem befasst:

Ich habe versucht, das Hauptproblem mit grepFehlermeldungen zu lösen und NBSP mithilfe des execBefehls in etwas zu ändern, das sichtbarer ist . Ich habe die Syntax noch nicht festgelegt:

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

Die Idee ist, diesen Befehl ~/.bashrcso zu haben, dass er beim gnome-terminalÖffnen automatisch geladen wird . Aber wie gesagt es funktioniert noch nicht ...

WinEunuuchs2Unix
quelle
1
Das würde nur die Fehlermeldungen behandeln. Ich würde es vorziehen, das Problem zu erfassen, während ich die Befehlszeile bearbeite, da ich möglicherweise so etwas schreibe perl -i -npe 's/MARKER/4 KB/'und versehentlich einen NBSP zwischen 4und schiebe K. Hoppla, das Problem wird in einer Datei gespeichert, aber ich erhalte keine Fehlermeldung und die von mir geschriebene Befehlszeile sieht perfekt aus.
Mikko Rantalainen