GNU/Linux >> Tutoriels Linux >  >> Linux

Est-il possible de mettre en évidence l'espace insécable dans zsh/terminal ?

Cette mise en évidence est IMHO plus facilement implémentée dans l'émulateur de terminal que dans le shell. Et comme avantage, vous obtenez la mise en surbrillance indépendante du shell - donc cela fonctionne même avec less etc.Puisque vous êtes d'accord pour changer de shell, je suppose que vous pouvez aussi passer à URxVt.

En conjonction avec les extensions perl urxvt-perls, il est possible de rendre les URL etc. cliquables. Mais on peut abuser de cette fonctionnalité juste pour souligner les espaces insécables.

La configuration se fait en ~/.Xdefaults :

URxvt.perl-ext:           default,matcher
URxvt.matcher.button:     2
URxvt.matcher.pattern.0:  (\\240)
URxvt.matcher.launcher.0: /bin/true
  • la ligne 1 active l'extension appropriée
  • la ligne 2 configure l'utilisation du bouton central de la souris pour cliquer sur le ,,hyperlien''
  • la ligne 3 définit la regex à faire correspondre, ici chaque espace insécable ; A0 (hex) = 240 (oct)
  • la ligne 4 définit l'action, dans votre cas, vous ne voulez pas ouvrir un navigateur ou un programme, donc /bin/true ça devrait aller

Recharger ~/.Xdefaults en redémarrant le serveur X (c'est peut-être exagéré, mais je ne sais pas si un xrdb ~/.Xdefaults est suffisant...) et vous obtenez le résultat souhaité. Avec une loupe, il est même possible de distinguer les espaces insécables des traits de soulignement (remarquez le décalage de 1 pixel) ;) :

Ce qui suit est une sorte de preuve de concept pour une solution "back-end". Soyez conscient que cela va casser beaucoup de choses, à savoir des programmes interactifs comme man , less etc. (vim se plaint mais fonctionne toujours). Cette approche a été publiée par Atom Smasher sur le zsh-users mailinglist du samedi 16 mai 2009 pour coloriser STDERR . Je l'ai adapté à vos exigences :

# ## 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 partie délicate est exec > >(highlight_nbs) qui traite la sortie complète du shell de remplacement via le highlight_nbs fonction. Le precmd la définition est nécessaire pour éviter une condition de concurrence, sinon la nouvelle invite est imprimée avant la sortie réelle de la commande exécutée.

Voici une démo :


Linux
  1. Quel terminal est le meilleur :Bash vs Zsh

  2. Qu'est-il arrivé à l'espace libre ?

  3. Remplacer toutes les nouvelles lignes par un espace sauf la dernière ?

  4. Comment la commande Sed '1!g;h;$!d' inverse-t-elle le contenu d'un fichier ?

  5. Comment lire l'avant-dernière ligne d'un fichier avec Bash ?

La ligne de commande Linux peut s'amuser de loin

Puissances de deux, puissances de Linux :2048 en ligne de commande

Maîtrisez la ligne de commande Linux

Personnaliser la ligne de commande Debian

Trouver la ligne de commande ?

Quatre navigateurs Web pour la ligne de commande Linux