Puis-je configurer bash / readline pour convertir automatiquement NBSP en espace normal?

10

J'utilise la disposition du clavier finlandais qui mappe AltGr+ Spaceà un espace insécable (NBSP, U + 00A0). Je suis satisfait de cela en général, mais je trouve que j'écris souvent accidentellement NBSP au lieu de l'espace normal après le |symbole " " (écrit avec AltGr+ <avec la disposition du clavier finlandais) lorsque j'utilise la ligne de commande bash. Je suppose que cela est dû au fait que je dois tenir AltGrtout en tapant le tuyau et le relâcher avant de toucher l'espace. Et quand j'ai un mauvais timing pour la sortie de AltGrje me retrouve avec une faute de frappe invisible sur la ligne de commande et des messages d'erreur tels que

 grep: command not found

qui ressemble assez à

grep: command not found

ce qui rend ce problème un peu difficile à remarquer la première fois.

Je sais que je peux désactiver NBSP mais je préférerais le désactiver (avoir AltGr+ Spacepour produire de l'espace régulier) seulement après le caractère pipe, ou si ce n'est pas possible, toujours sur la ligne de commande bash ou au readlineniveau. Existe-t-il un moyen simple de le faire sans modifier le code source de bash readlineou mon émulateur de terminal ( gnome-terminal)?

Une autre bonne solution serait de configurer NBSP pour qu'il soit en quelque sorte visible sur la ligne de commande, par exemple remplacé par un autre caractère (disons U + 2423 ) pour le rendu uniquement.

Mikko Rantalainen
la source
@dessert pas vraiment besoin d'une prime. Je viens de toucher le problème et j'ai écrit une question à ce sujet. Plus tard, j'ai trouvé assez de configuration via la recherche Google pour trouver la réponse ci-dessous. Je cherche toujours une réponse pour rendre NBSP visible au lieu de désactiver le caractère dans tous les cas. Je pense que j'aimerais avoir NBSP visible au niveau de la ligne de lecture afin que toutes les sorties du terminal ne soient pas gâchées si j'ai NBSP dans les chaînes de données.
Mikko Rantalainen
@MikkoRantalainen pourriez-vous expliquer plus clairement ce qui vous manque encore? Puisque vous avez trouvé le moyen de mapper des personnages, pourquoi n'est-ce pas " ":␣suffisant? De quoi d'autres avez-vous besoin?
terdon
@dessert J'adorerais avoir une fonctionnalité où je pourrais écrire NBSP sur la ligne de commande et obtenir echo a␣bmais la ligne de sortie résultante était echo a bavec un vrai NBSP dans la sortie. En tant que tel, je pense que cela doit être fait au niveau de la ligne de lecture (c'est-à-dire que l' éditeur de ligne de commande affiche toujours un caractère visible mais l'émulateur de terminal ne peut pas faire la différence entre l'affichage de l'éditeur et l'affichage de sortie et donc l'émulateur de terminal ne peut pas faire le remplacement visuel du rendu ).
Mikko Rantalainen
1
Le résoudre au niveau de la ligne de lecture est en effet agréable, mais vous pourriez rencontrer le même problème lors de l'écriture d'un script shell dans vim / emacs / etc dans le terminal. Voir bugzilla.gnome.org/show_bug.cgi?id=788673 pour un correctif de preuve de concept fonctionnel pour gnome-terminal pour mettre en évidence les correspondances de chaînes, y compris peut-être le seul caractère NBSP. (Oui, je sais que vous avez dit que vous ne vouliez modifier aucun code source…)
egmont
1
Une autre approche consiste à l'adresser au niveau de la police, via une police spéciale où le glyphe de NBSP n'est pas vide, avec une configuration de fontconfig. Cela fonctionnerait également pour les éditeurs graphiques, pas seulement pour le terminal. Une autre approche consiste à modifier la disposition du clavier pour émettre de l'espace normal et à utiliser une autre méthode pour entrer dans NBSP dans les rares cas où c'est ce dont vous avez besoin.
egmont

Réponses:

9

Cela peut se faire au readlineniveau de deux manières différentes.

Méthode 1

Mettez le suivant dans .inputrc(le fichier de configuration pour 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)
" ":" "

Si le démarquage gâche ce qui précède, vous devez mettre NBSP entre guillemets sur le côté gauche des deux points comme expliqué dans le commentaire. Cela mappera toute occurrence de NBSP sur le flux d'entrée avec un espace régulier.

Méthode 2

Mettez ce qui suit dans .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'idée est de mapper la séquence de touches {pipe suivie de NBSP} à {pipe suivie d'espace}. Cela fonctionne si vous tapez la séquence dans les 250 ms (configurable ci-dessus). Cependant, tant que le délai n'est pas écoulé, la saisie du symbole de tuyau seul ne produira rien. Et si vous tapez la séquence trop lentement, le correctif ne sera pas appliqué. Notez également que le délai d'expiration est global, donc si vous avez l'intention d'utiliser d'autres séquences, vous devez définir le délai d'expiration suffisamment longtemps pour pouvoir taper la séquence la plus longue. (La bibliothèque readline n'est pas assez intelligente pour permettre de taper les caractères et remplacer plus tard les caractères déjà visibles une fois que la séquence de caractères correspond à la configuration.)

Mikko Rantalainen
la source
0

Il existe un excellent article traitant de ce problème:

J'ai essayé de résoudre le problème principal avec greples messages d'erreur et de changer NBSP en quelque chose de plus visible en utilisant la execcommande. Cependant, je n'ai pas encore obtenu la syntaxe:

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

L'idée est d'avoir cette commande ~/.bashrcpour qu'elle se charge automatiquement à l' gnome-terminalouverture. Mais comme je l'ai dit, cela ne fonctionne pas encore ...

WinEunuuchs2Unix
la source
1
Cela ne traiterait que les messages d'erreur. Je préférerais attraper le problème pendant que j'édite la ligne de commande car j'écris peut-être quelque chose comme perl -i -npe 's/MARKER/4 KB/'et je glisse accidentellement un NBSP entre le 4et K. Oups, le problème est stocké dans un fichier mais je n'ai aucune erreur et la ligne de commande que j'ai écrite est parfaite.
Mikko Rantalainen