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

Ale*_*kin 7 linux terminal zsh console

我正在寻找以某种方式突出显示\xA0shell 输出中的不可破坏空间 ( ) 的可能性,以在调试会话期间将其与正常空间区分开来。例如,我想看到类似的输出$ echo -e "[\xC2\xA0]|[ ]"

[_]|[ ]
Run Code Online (Sandbox Code Playgroud)

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

mpy*_*mpy 4

恕我直言,这种突出显示在终端仿真器中比在 shell 中更容易实现。作为一个好处,您可以获得独立于 shell 的突出显示 - 因此它甚至可以与less等一起工作。既然您可以切换 shell,我想您也可以切换到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
Run Code Online (Sandbox Code Playgroud)
  • 第 1 行激活相应的分机
  • 第 2 行配置使用鼠标中键单击“,,超链接”
  • 第 3 行定义了要匹配的正则表达式,这里是每个不可破坏的空格;A0 (hex) = 240 (oct)
  • 第 4 行定义了操作,在您的情况下,您不想打开浏览器或任何程序,所以/bin/true应该没问题

通过重新启动 X 服务器来重新加载~/.Xdefaults(这可能有点过头了,但我不确定 a 是否xrdb ~/.Xdefaults足够......),您将获得所需的结果。使用放大镜,甚至可以区分不可破坏的空格和下划线(注意移动 1 个像素);)

在此输入图像描述


以下是“后端”解决方案的概念证明。请注意,这会破坏很多东西,即交互式程序man,例如less等(vim正在抱怨但仍然有效)。这种方法由 Atom Smasher 于2009 年 5 月 16 日星期六发布在zsh-users邮件列表上,用于对. 我根据您的要求采用了它: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)
Run Code Online (Sandbox Code Playgroud)

棘手的部分是exec > >(highlight_nbs)通过该函数处理替换 shell 的完整输出highlight_nbs。该precmd定义对于避免竞争条件是必要的,否则新的提示符将在执行命令的实际输出之前打印。

这是一个演示:

在此输入图像描述