GNU/Linux >> Linux Esercitazione >  >> Linux

È possibile evidenziare lo spazio infrangibile in zsh/terminale?

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:


Linux
  1. Quale terminale è migliore:Bash vs Zsh

  2. Cosa è successo allo spazio libero?

  3. Linux:è possibile accedere al framebuffer per mettere un pixel sullo schermo dalla riga di comando?

  4. Sostituire tutte le nuove righe nello spazio tranne l'ultima?

  5. In che modo il comando Sed '1!g;h;$!d' inverte il contenuto di un file?

La riga di comando di Linux può portare divertimento da lontano

Poteri di due, poteri di Linux:2048 alla riga di comando

Padroneggia la riga di comando di Linux

Personalizza la riga di comando di Debian

Trova la riga di comando?

Quattro browser Web per la riga di comando di Linux