【问题标题】:How can one provide colour to tab completion in tcsh?如何为 tcsh 中的制表符补全提供颜色?
【发布时间】:2012-12-07 15:45:07
【问题描述】:

(Crossposted to unix.stackexchange.com)

This questionthe answer 教我们如何在 tcsh 提示中引入颜色。

This webpage 很好地解释了如何将颜色添加到echo 命令的任何输出中:

> echo \\e[1\;30mBLACK\\e[0m
BLACK
> echo '\e[1;30mBLACK\e[0m'
BLACK

上例中的“BLACK”一词以黑色(或深灰色)前景色打印(取决于整体配色方案)。

现在我想将此引入tcsh[TAB] 命令自动补全功能。我试过了:

complete testcmd 'p/*/`echo '"'"'\e[1;30mf834fef\e[0m'"'"'`/'

我得到:

> testcmd [TAB]
> testcmd ^[\[1\;30mf834fef^[\[0m

显然这些字符失去了它们的特殊含义。希望我只是没有得到正确的转义。但我尝试了其他几种方法。因此,我们将不胜感激。

真正的用例是我有一个命令完成,它提供三种不同类型的完成,我想在视觉上区分这些类型。备选方案也由外部命令计算。这就是为什么我需要完成以使用带有外部命令的反引号,例如echo。我不关心这个命令的细节。如果您使用tcshcomplete 命令以任何方式使其工作,我可能能够适应(考虑perl -pe 包装器等)。

我相信这个 必须 以某种方式工作的原因是 tcsh 本身提供彩色命令完成,如果你例如输入ls [TAB]。这在我的设置中正常工作。您也可以在自动完成中使用ls -1Fls 输出的颜色也可以通过管道传输。一个例子是:

complete testcmd 'p/*/`ls -1F`/'

更新:正如用户 mavin 所指出的,在这个例子中 ls 的着色确实没有通过管道传递。 ls 的颜色会丢失,但自动补全可以根据 LS_COLOURS 变量重新应用颜色,该变量基于 ls 添加的 /* 标记结尾等提示。这可以通过执行来验证

complete testcmd 'p/*/`ls --color -1`/'

无法提供颜色,仅提供乱码输出。 (字面意思是通过转义字符序列)

我在 tcsh 版本 6.13.00

有什么想法吗?指针?

【问题讨论】:

    标签: autocomplete colors tcsh


    【解决方案1】:

    在您的示例中,complete testcmd 'p/*/ls -1F/',颜色没有ls 传递。您会发现即使您将ls 设置为产生单色输出,您也会在此处获得颜色,但如果您不使用-F,则不会。发生的事情是 tcsh 正在根据 ls -F 添加到每个文件名末尾的符号进行自己的着色。例如:

    complete testcmd 'p%*%`echo dir/ symlink@ device# socket=`%'
    

    您可以在完成生成器中利用它,例如,

    complete testcmd 'p/*/`echo foo bar | perl -lane '"'"'print join " ", map { $_. "%" } @F'"'"'`/'
    

    问题在于,您最终会在完成的命令行中使用这些符号,并且每次都必须手动退格。

    【讨论】:

    • 此解决方法是开箱即用思维的绝佳示例。不幸的是,从可用性的角度来看,我不会接受额外的退格。
    • 证实了您的观点,似乎不可能通过颜色。基于this question,我尝试在反引号完成中使用grcgrc 生成的转义码也像 ^[[0m^[[33m(^[[0m^[[35m 一样出现在输出中。
    • 尽管我之前发表了评论,但我可能会在这里接受您的回答。我也会将此标记为答案。希望有一天会有更好的方法来实现这一点。
    【解决方案2】:

    tcsh 将根据后缀为文件名着色,具体取决于$LS_COLORS 环境变量(例如,将所有*.gz 文件显示为红色)。您可以预先计算潜在完成列表,将它们全部放在$LS_COLORS,然后设置虚拟文件以供完成使用。如果您使用 precmd 别名,您可以在每次显示提示时自动重新计算完成。

    complete testcmd "p#*#F:$HOME/.cache/testcmd-completions#"
    alias prep-testcmd "setenv LS_COLORS '*red=01;31:*green=01;32:' && rm -r ~/.cache/testcmd-completions && mkdir -p ~/.cache/testcmd-completions && touch ~/.cache/testcmd-completions/red ~/.cache/testcmd-completions/green"
    alias precmd prep-testcmd
    

    除此之外:最好将它与 `` 样式的完成一起使用,而不是 F 样式的完成;这样你就不需要创建虚拟文件。但是,我在 tcsh 6.17 中尝试过,但没有成功。

    【讨论】:

    • 再次,开箱即用的绝招!我必须考虑一下。 (a) 必须恢复 LS_COLORS 的值 - 可能使用 postcmd/precmd 别名的组合,以及 (b) 如果我有大量完成,则 LS_COLORS 的长度可能是一个问题。
    • 想一想:着色的排序非常耗时。通过在 precmd/postcmd 中执行它,它将为 shell 中的每个命令运行,即使它与 testcmd 无关。我看不到有选择性地只为testcmd 启用它的方法,因为 shell 无法知道用户要输入的内容。
    【解决方案3】:

    我的This question 有一个更新的示例 git tcsh 完成,它使用了用户 mavin 在his answer 这里指出的技巧。

    【讨论】:

      猜你喜欢
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 2012-03-06
      • 1970-01-01
      • 1970-01-01
      • 2020-03-24
      • 2020-02-27
      • 1970-01-01
      相关资源
      最近更新 更多