É possível destacar o espaço não quebrável no zsh / terminal?

5

Estou procurando a possibilidade de destacar de alguma forma o espaço não quebrável ( \xA0 ) na saída do shell para diferenciá-lo do espaço normal durante as sessões de depuração. E. g., Gostaria de ver a saída de $ echo -e "[\xC2\xA0]|[ ]" como:

[_]|[ ]

Cores, sublinhados e até piscando OK. Eu até posso mudar de zsh para qualquer shell, onde ele é configurável o suficiente. É pelo menos possível?

    
por Aleksei Matiushkin 09.09.2013 / 11:42

2 respostas

4

Este destaque é IMHO mais facilmente implementado no emulador de terminal do que no shell. E como benefício você obtém o destaque independente do shell - por isso, ele está trabalhando com less etc. Já que você está bem em trocar o shell, eu suponho que você está bem em mudar para o URxVt também.

Em conjunto com as extensões perl urxvt-perls , é possível tornar os URLs clicáveis. Mas podemos abusar desse recurso apenas para sublinhar os espaços não quebráveis.

A configuração é feita em ~/.Xdefaults :

URxvt.perl-ext:           default,matcher
URxvt.matcher.button:     2
URxvt.matcher.pattern.0:  (\240)
URxvt.matcher.launcher.0: /bin/true
  • a linha 1 ativa a extensão apropriada
  • a linha 2 configura o uso do botão do meio do mouse para clicar no "hyperlink"
  • a linha 3 define o regex para corresponder, aqui cada espaço não quebrável; %código%
  • a linha 4 define a ação, no seu caso você não quer abrir um navegador ou qualquer programa, então A0 (hex) = 240 (oct) deve ficar bem

Recarregue /bin/true reiniciando o servidor X (isso pode ser um exagero, mas não tenho certeza se um ~/.Xdefaults é suficiente ...) e você obtém o resultado desejado. Com uma lupa, é até possível distinguir entre espaços não quebráveis e sublinhados (observe a mudança em 1 pixel) xrdb ~/.Xdefaults :

Oseguinteéumaespéciedeprovadeconceitoparaumasolução"backend". Esteja ciente de que isso quebrará muitas coisas, como programas interativos como ;) , man etc. ( less está reclamando, mas ainda está trabalhando). Essa abordagem foi postada por Atom Smasher na lista de discussão vim em Sáb, 16 de maio de 2009 para colorir zsh-users . Adotei as suas necessidades:

# ## 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)

A parte complicada é STDERR , que processa a saída completa do shell de substituição através da função exec > >(highlight_nbs) . A definição highlight_nbs é necessária para evitar uma condição de corrida, caso contrário, o novo prompt será impresso antes da saída real do comando executado.

Aqui está uma demonstração:

    
por 09.09.2013 / 21:47
1

Claro.

$ echo -e "[\xC2\xA0]|[ ]" | cat -A
[M-BM- ]|[ ] 
    
por 09.09.2013 / 15:31