Questa evidenziazione IMHO è implementata più facilmente nell'emulatore di terminale che nella shell. E come vantaggio ottieni l'evidenziazione indipendente dalla shell, quindi funziona anche con less
ecc. Dato che ti va bene cambiare shell, suppongo che ti vada bene anche passare a URxVt.
Insieme alle estensioni perl urxvt-perls è possibile rendere cliccabili URL ecc. Ma possiamo abusare di questa caratteristica solo per sottolineare gli spazi infrangibili.
La configurazione viene eseguita in ~/.Xdefaults
:
URxvt.perl-ext: default,matcher
URxvt.matcher.button: 2
URxvt.matcher.pattern.0: (\\240)
URxvt.matcher.launcher.0: /bin/true
- la riga 1 attiva l'estensione appropriata
- la riga 2 configura l'uso del pulsante centrale del mouse per fare clic sul ,,collegamento ipertestuale''
- la riga 3 definisce la regex da abbinare, qui ogni spazio non divisibile;
A0 (hex) = 240 (oct)
- la riga 4 definisce l'azione, nel tuo caso non vuoi aprire un browser o alcun programma, quindi
/bin/true
dovrebbe andare bene
Ricarica ~/.Xdefaults
riavviando il server X (questo potrebbe essere eccessivo, ma non sono sicuro se un xrdb ~/.Xdefaults
è sufficiente...) e si ottiene il risultato desiderato. Con una lente d'ingrandimento è persino possibile distinguere tra spazi infrangibili e underscore (notare lo spostamento di 1 pixel) ;)
:
Quella che segue è una specie di prova di concetto per una soluzione "back-end". Tieni presente che ciò interromperà molte cose, in particolare programmi interattivi come man
, less
ecc. (vim
si lamenta ma funziona ancora). Questo approccio è stato pubblicato da Atom Smasher su zsh-users
mailing list di sabato 16 maggio 2009 per colorare STDERR
. L'ho adattato alle tue esigenze:
# ## highlight_nbs.zsh ##
zmodload zsh/terminfo zsh/system
autoload colors is-at-least
if [[ "${terminfo[colors]}" -ge 8 ]] { colors }
highlight_nbs() {
while sysread line
do
syswrite "${line//$'\xC2\xA0'/${bg[red]} ${terminfo[sgr0]}}"
done
}
precmd() { sleep 0 }
## i'm not sure exactly how far back it's safe to go with this
## 4.3.4 works; 4.2.1 hangs.
is-at-least 4.3.4 && exec > >(highlight_nbs)
La parte difficile è exec > >(highlight_nbs)
che elabora l'output completo della shell sostitutiva attraverso il highlight_nbs
funzione. Il precmd
la definizione è necessaria per evitare una race condition, altrimenti il nuovo prompt viene stampato prima dell'effettivo output del comando eseguito.
Ecco una demo: