Posso configurare bash / readline per convertire automaticamente NBSP nello spazio normale?


10

Sto usando il layout di tastiera finlandese che mappa AltGr+ Spaceallo spazio non-break (NBSP, U + 00A0). Sono contento di questo in generale, ma trovo che spesso scrivo accidentalmente NBSP invece del normale |simbolo " " spazio dopo pipe (scritto con AltGr+ <con layout di tastiera finlandese) mentre utilizzo la riga di comando bash. Immagino che ciò sia dovuto al fatto che devo tenere premuto AltGrmentre digito la pipa e rilasciarla prima di colpire lo spazio. E quando ho un pessimo tempismo per il rilascio, AltGrfinisco con un errore di battitura invisibile sulla riga di comando e messaggi di errore come

 grep: command not found

che sembra abbastanza simile a

grep: command not found

il che rende questo problema un po 'difficile da notare per la prima volta.

So che posso disabilitare NBSP ma preferirei disabilitarlo (avendo AltGr+ Spaceper produrre spazio regolare) solo dopo il carattere pipe, o se ciò non è possibile, sempre sulla riga di comando o readlinelivello di bash . Esiste un modo semplice per farlo senza modificare il codice sorgente di bash readlineo il mio emulatore di terminale ( gnome-terminal)?

Un'altra buona soluzione sarebbe quella di configurare NBSP in modo che sia visibile in qualche modo sulla riga di comando, ad esempio sostituito con un altro carattere (diciamo U + 2423 ) solo per il rendering.


@dessert non c'è bisogno di una taglia, davvero. Ho appena risolto il problema e ho scritto una domanda al riguardo. Successivamente ho trovato una configurazione abbastanza vicina tramite Ricerca Google per capire la risposta di seguito. Sto ancora cercando una risposta per rendere visibile NBSP invece di disabilitare il personaggio per tutti i casi. Penso che vorrei avere NBSP visibile a livello di readline in modo che tutto l'output del terminale non sia incasinato se ho NBSP nelle stringhe di dati.
Mikko Rantalainen,

@MikkoRantalainen potresti spiegare cosa ti manca ancora più chiaramente? Dato che hai trovato il modo di mappare i personaggi, perché non è " ":␣abbastanza? Cos'altro ti serve?
terdon,

@dessert Mi piacerebbe avere una funzione in cui poter scrivere NBSP sulla riga di comando e ottenere echo a␣bma la riga di output risultante era echo a bcon NBSP reale nell'output. In quanto tale, penso che debba essere fatto a livello di readline (ovvero, l' editor della riga di comando mostra sempre un carattere visibile ma l'emulatore di terminale non può conoscere la differenza tra la visualizzazione dell'editor e la visualizzazione dell'output e quindi l'emulatore di terminale non può fare la sostituzione visiva per il rendering ).
Mikko Rantalainen,

1
Risolverlo a livello di readline è davvero bello, ma potresti avere lo stesso problema mentre scrivi uno script di shell in vim / emacs / etc nel terminale. Vedi bugzilla.gnome.org/show_bug.cgi?id=788673 per una prova funzionale della patch di concetto per gnome-terminal per evidenziare le corrispondenze di stringhe, incluso forse il singolo carattere NBSP. (Sì, lo so che hai detto che non volevi modificare alcun codice sorgente ...)
egmont,

1
Un altro approccio è quello di indirizzarlo a livello di carattere, tramite un carattere speciale in cui il glifo di NBSP non è vuoto, insieme a una configurazione di fontconfig. Questo funzionerebbe anche con editor grafici, non solo con il terminale. Ancora un altro approccio è quello di modificare il layout della tastiera per emettere spazio regolare e utilizzare qualche altro metodo per inserire NBSP nel raro caso in cui è quello che ti serve.
egmont,

Risposte:


9

Questo può essere fatto a readlinelivello in due modi diversi.

Metodo 1

Inserisci il seguente .inputrc(il file di configurazione per 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)
" ":" "

Se il markdown incasina quanto sopra, devi inserire NBSP tra virgolette sul lato sinistro dei due punti, come spiegato nel commento. Ciò mapperà qualsiasi occorrenza di NBSP sul flusso di input con uno spazio regolare.

Metodo 2

Inserisci quanto segue .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

L'idea è di mappare la sequenza di tasti {pipe seguita da NBSP} su {pipe seguita da spazio}. Funziona se si digita la sequenza entro 250 ms (configurabile sopra). Tuttavia, fino alla scadenza del timeout, digitando il simbolo pipe da solo non verrà emesso nulla. E se si digita la sequenza troppo lentamente, la correzione non verrà applicata. Si noti inoltre che il timeout è globale, quindi se si intende utilizzare altre sequenze, è necessario impostare il timeout abbastanza a lungo da poter digitare la sequenza più lunga. (La libreria readline non è abbastanza intelligente da consentire la digitazione dei caratteri e successivamente sostituire i caratteri già visibili dopo che la sequenza di caratteri corrisponde alla configurazione.)


0

C'è un eccellente articolo che tratta questo problema:

Ho cercato di risolvere il problema principale con grepi messaggi di errore e cambiando NBSP in qualcosa di più visibile usando il execcomando. Non ho ancora la pat down della sintassi però:

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

L'idea è di avere questo comando in ~/.bashrcmodo che si carichi automaticamente con l' gnome-terminalapertura. Ma come ho già detto, non funziona ancora ...


1
Ciò riguarderebbe solo i messaggi di errore. Preferirei cogliere il problema mentre sto modificando la riga di comando perché potrei scrivere qualcosa del genere perl -i -npe 's/MARKER/4 KB/'e scivolare accidentalmente un NBSP tra il 4e K. Spiacenti, il problema viene archiviato in un file ma non viene visualizzato alcun errore e la riga di comando che ho scritto sembra perfetta.
Mikko Rantalainen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.