可以在终端中突出显示制表符吗?

Posted

技术标签:

【中文标题】可以在终端中突出显示制表符吗?【英文标题】:Can one highlight tab characters in the terminal? 【发布时间】:2010-12-10 06:30:18 【问题描述】:

使用终端序列,我可以在终端模拟器中为文本着色:

$ echo -e '\e[37;41m--this is white on red--\e[0m'

这行得通。

以下打印一个红色矩形,即空格字符具有红色背景和空白前景:

$ echo -e '\e[37;41m     \e[0m '

但下面会打印两个由制表符分隔的红色矩形:

$ echo -e '\e[37;41m  \t  \e[0m '

也就是说,制表符不接受红色背景突出显示。它采用默认的终端背景颜色。

为什么选项卡不像空格一样突出显示?我可以通过其他方式强制吗?

【问题讨论】:

哪个终端? 【参考方案1】:

如果您不需要标签是标签,您可以通过 expand(1) 预处理您的文本。

【讨论】:

这是一个很好的建议,我很可能最终会这样做。【参考方案2】:

我找到了答案:不,不能在符合标准的终端仿真器中突出显示选项卡。 Tab 在终端中并不是真正的空白;它明确是一个光标移动字符,可以前进到下一个制表位。因此,实际上我的示例说“在红色背景上打印两个空格,前进到下一个制表位,然后在红色背景上再打印两个空格”。

解决方法是 ankon 建议在打印之前将制表符转换为空格。

【讨论】:

它适用于 Mac OS X 终端(我使用的是 10.8)。它使用当前背景颜色为选项卡着色。您是否参考了说明不应该这样做的文档?【参考方案3】:

因为我很难找到一个好的解决方案(而且这个页面是第一个搜索结果)...这是我在 .bashrc 文件中的内容(来自 http://pastebin.com/Pn1fkkJq 的修改):

catt()  # Highlight whitespace on the terminal -- rolfwr
    local C=`printf '\033[0;36m'` R=`printf '\033[0m'`
    #cat "$@" | sed -e "s/      /$C▹▹▹▹▹▹▹▹$R/g" -e "s/ /$C·$R/g" -e "s/$/$C⁋$R/"
    #cat "$@" | sed -e "s/ /$C·$R/g" -e "s/\t/$C ▹▹ $R/g" -e "s/$/$C⁋$R/"
    cat "$@" | sed -e "s/ /$C·$R/g" | expand | sed -e "s/ \( *\)/$C▹\1$R/g" -e "s/$/$C⁋$R/"
    #cat "$@" | sed -e "s/ /$C.$R/g" | expand | sed -e "s/ \( *\)/$C>\1$R/g" -e "s/$/$CP$R/"

希望这对其他人也有帮助。

【讨论】:

谁知道呢,这是个好主意 :-) 虽然执行起来可能有点混乱,但我更喜欢:hl-nonprinting () local C=$(printf '\033[0;36m') R=$(printf '\033[0m'); sed -e "s/\t/$C▹&$R/g" -e "s/$/$C⁋$R/"; -- 这给了我$ echo -e 'foo\tbar fie' | hl-nonprinting foo▹ bar fie⁋

以上是关于可以在终端中突出显示制表符吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 matplotlib 图中,我可以突出显示特定的 x 值范围吗?

如何突出显示终端中的输入文字?

我可以使用 maphilight 插件在两个不同的地图上突出显示具有相同类别的区域吗?

使用 Elasticsearch,我可以为不同的匹配标记使用不同的 HTML 标签突出显示吗?

在 Vim 中突出显示搜索而不是替换?

如何在 ios 地图中突出显示国家/地区