如何在tcsh中为标签完成提供颜色?

时间:2012-12-07 15:45:08

标签: autocomplete colors tcsh

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”字样印有黑色(或深灰色)前景色(取决于整体配色方案)。

现在我想将此介绍到[TAB]的{​​{1}}命令自动完成功能中。我试过了:

tcsh

我得到了:

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

显然,人物失去了特殊的意义。希望我没有得到逃脱的权利。但我尝试了其他几种方法。所以任何帮助都表示赞赏。

真正的用例是我有一个命令完成,提供三种不同类型的完成,我想在视觉上区分类型。替代方案也是由外部命令计算的。这就是为什么我需要完成使用外部命令的反引号,例如> testcmd [TAB] > testcmd ^[\[1\;30mf834fef^[\[0m 。我不关心这个命令的细节。如果你使用echo的{​​{1}}命令以任何方式使它工作,我可能会适应(思考tcsh包装器等)。

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

ls -1F

更新:正如用户mavin指出的那样,此示例中ls的颜色确实没有通过。 complete testcmd 'p/*/`ls -1F`/' 的颜色会丢失,但自动完成可以根据LS_COLOURS变量重新应用颜色,这些变量基于提示,例如由ls添加的lsls标记结尾。这可以通过

来验证
/

无法提供颜色,只提供乱码输出。 (直接通过转义字符序列管道)

我在*版本6.13.00

有什么想法吗?指针?

3 个答案:

答案 0 :(得分:1)

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

ls -F

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

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

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

答案 1 :(得分:1)

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中尝试过,但它没有用。

答案 2 :(得分:0)

我的This question有一个更新的示例git tcsh completion,它使用了mavin在his answer中指出的技巧。