5

Я ищу возможность как-то выделить неразрывный пробел (\xA0) в выводе оболочки, чтобы отличить его от обычного пространства во время сеансов отладки. Например, я хотел бы видеть вывод $ echo -e "[\xC2\xA0]|[ ]" как:

[_]|[ ]

Цвета, подчеркивание, даже мигание в порядке. Я даже могу переключиться с zsh на любую оболочку, где она достаточно настраиваема. Это по крайней мере возможно?

2 ответа2

4

ИМХО эта подсветка легче реализовать в эмуляторе терминала, чем в оболочке. И в качестве преимущества вы получаете подсветку, независимую от оболочки - так что она даже работает с less и т.д. Поскольку вы хорошо переключаете оболочку, я полагаю, что вы также можете переключиться на URxVt .

В сочетании с расширениями perl urxvt-perls можно сделать URL-адреса кликабельными. Но мы можем злоупотреблять этой функцией, чтобы подчеркнуть неразрывные пробелы.

Конфигурация выполняется в ~/.Xdefaults:

URxvt.perl-ext:           default,matcher
URxvt.matcher.button:     2
URxvt.matcher.pattern.0:  (\\240)
URxvt.matcher.launcher.0: /bin/true
  • строка 1 активирует соответствующее расширение
  • строка 2 настраивает использование средней кнопки мыши для нажатия на гиперссылку
  • строка 3 определяет регулярное выражение для сопоставления, здесь каждый неразрывный пробел; A0 (hex) = 240 (oct)
  • строка 4 определяет действие, в вашем случае вы не хотите открывать браузер или любую программу, поэтому /bin/true должно быть в порядке

Перезагрузить ~/.Xdefaults X перезапускает X-сервер (это может быть излишним, но я не уверен, что xrdb ~/.Xdefaults достаточно ...) и вы получите желаемый результат. С помощью лупы можно даже отличить неразрывные пробелы от подчеркивания (обратите внимание на смещение на 1 пиксель) ;):


Следующее является своего рода доказательством концепции "внутреннего" решения. Имейте в виду, что это сломает много вещей, а именно интерактивные программы, такие как man , less и т.д. (vim жалуется, но все еще работает). Этот подход был опубликован Atom Smasher в zsh-users в субботу 16 мая 2009 года для раскрашивания STDERR . Я принял это к вашим требованиям:

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

Сложная часть - exec > >(highlight_nbs) которая обрабатывает полный вывод замещающей оболочки через функцию highlight_nbs . Определение precmd необходимо, чтобы избежать условия гонки, в противном случае новое приглашение выводится перед фактическим выводом выполненной команды.

Вот демо:

1

Конечно.

$ echo -e "[\xC2\xA0]|[ ]" | cat -A
[M-BM- ]|[ ] 

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .