![ANSI输入](https://linux22.com/image/218527/ANSI%E8%BE%93%E5%85%A5.png)
我想在状态栏中显示具有 ANSI 转义序列的文本。
状态文本由第三方工具生成,这些工具自行管理 ANSI 颜色(以及超链接,尽管这些可能会分开)。状态栏将显示在 i3 窗口管理器 (Linux) 中。
我至少看到了三种解决这个问题的方法,但每一种都失败了:
- 找到一个在其状态栏上呈现 ANSI 颜色的状态栏输入。
- 找到一种方法将 ANSI 颜色转换为状态栏使用的任何标记语言。
- 将终端窗口显示为状态栏。
ANSI输入
我搜索了 i3 周围的状态栏,发现了很多(i3status、dzen2、xmobar、polybar、lemonbar、i3cat、conky、barmaid、sbar、yabar)。
据我了解,除了 conky 之外,它们都不允许在文本输入中进行任何格式化在文本模式下(不支持 unicode 并且经常崩溃)。
dwm 似乎提到了一些允许与状态栏相关的 ANSI 输入的补丁,但我无法理解如何构建它们。
ANSI 到标记
阅读文档,我发现所有状态栏都在配置级别定义了自己的标记语言。(我承认我觉得这有点奇怪,为什么不使用无处不在的 HTML?仅仅它的一个子集就已经允许利用强大的工具,比如 pandoc。另外,还有一些工具可以使用颜色标签将 ANSI 颜色转换为 HTML 范围。 )
它们都将输入视为文本(或数值),等待在配置步骤中进行格式化。就我而言,生成输入的工具自行决定是否显示(或不显示)信息以及如何为其着色。在状态栏中实现它提供的复杂功能本身会很麻烦。
因为他们使用自己的标记语言,所以我发现没有现有的工具能够转换成它。因为它处于配置级别而不是输入级别,所以设置这样的管道似乎很复杂。
终端作为酒吧
这可能是最有希望的方法。
watch --no-wrap --no-title --colors <mycmd>
由于提供了“状态更新”功能,每秒调用一个命令非常容易。
从技术上来说,玩起来似乎是可行的xdo工具使 X11 终端窗口充当状态栏,如中所述这个答案,但我没能让它在i3下工作。
编辑:如何在 i3 状态栏中显示具有 ANSI 转义颜色的文本(使用一种或另一种方法)?
答案1
这是使用第三种方法的答案。它通过设置 i3 理解的 X11 属性来转换扩展坞中的终端窗口。它仅适用于终端仿真器,该仿真器不会从公共进程中分叉会话。它也不支持多个显示器。
#!/bin/bash
# Usage: ./dock.sh <command>
height="20" # Expects a single line status, you may edit this to fit your own terminal configuration.
# Cannot use terminal emulator reusing a common daemon from which to fork windows, or else the PID will change.
# e.g. gnome-terminal, terminator, etc.
# urxvt gets X11 errors and shorten the output...
# xterm works just fine.
xterm -bg black -e watch --no-title --color --no-wrap --interval 1 $@ &
PID="$!"
ID=$(xdotool search --sync -pid $PID 2>/dev/null)
width=$(xrandr -q | head -n1 | awk '{print $8}')
xdotool windowunmap --sync ${ID}
xdotool windowsize --sync ${ID} ${width} ${height}
xprop -id "${ID}" -format _NET_WM_WINDOW_TYPE 32a -set _NET_WM_WINDOW_TYPE "_NET_WM_WINDOW_TYPE_DOCK"
xprop -id "${ID}" -format _NET_WM_STRUT_PARTIAL 32cccccccccccc -set _NET_WM_STRUT_PARTIAL "0,0,${height},0,0,0,0,0,0,${width},0,0"
xdotool windowmap ${ID}