是否可以在 zsh / 终端中突出显示不可破坏的空间?

是否可以在 zsh / 终端中突出显示不可破坏的空间?

我正在寻找一种可能,以某种方式突出显示 shell 输出中的不可分割空格 ( \xA0),以便在调试会话期间将其与正常空格区分开来。例如,我希望看到如下输出$ echo -e "[\xC2\xA0]|[ ]"

[_]|[ ]

颜色、下划线,甚至闪烁都可以。我甚至可以切换zsh到任何可配置的 shell。至少可以吗?

答案1

我认为,在终端仿真器中实现此突出显示比在 shell 中更容易。而且,这样做的好处是,您可以获得独立于 shell 的突出显示 - 因此它甚至可以与lessetc 一起使用。既然您不介意切换 shell,我想您也不介意切换到尿路感染, 也。

与 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应该没问题

通过重新启动 X 服务器重新加载~/.Xdefaults(这可能有点过头了,但我不确定是否xrdb ~/.Xdefaults足够……)然后您就会得到想要的结果。使用放大镜甚至可以区分不可中断的空格和下划线(注意 1 个像素的偏移);)

在此处输入图片描述


以下是概念验证为“后端”解决方案。请注意,这将破坏很多东西,即交互式程序man,如less等(正在抱怨但仍在工作)。这种方法由 Atom Smasher 在邮件列表vim中发布zsh-users2009 年 5 月 16 日星期六着色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)通过函数处理替换 shell 的完整输出highlight_nbsprecmd必须定义以避免竞争条件,否则会在执行命令的实际输出之前打印新的提示符。

以下是一个演示:

在此处输入图片描述

答案2

当然。

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

答案3

如果你使用的是 Mac,你可以考虑使用 iTerm这个黑客. 它也是与 shell 无关的。

它使用 iTerm 中的“触发器”功能来改变 NBSP 的背景颜色。

相关内容