1

交叉发布到 unix.stackexchange.com

这个问题答案教我们如何在 tcsh 提示中引入颜色。

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

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

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

现在我想把它引入[TAB]tcsh. 我试过:

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

我得到:

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

显然,这些字符失去了它们的特殊意义。希望我只是没有得到正确的转义。但我尝试了其他几种方法。所以任何帮助表示赞赏。

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

我认为这必须以某种方式起作用的原因是,如果您键入ls [TAB]. 这在我的设置中正常工作。您也可以ls -1F在自动完成内部使用,并且输出的颜色ls也可以通过管道传输。一个例子是:

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

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

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

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

我在tcsh版本 6.13.00

有任何想法吗?指针?

4

3 回答 3

1

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

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

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

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

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

于 2012-12-15T13:51:08.307 回答
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

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

于 2012-12-16T13:54:22.297 回答
0

我的这个问题有一个更新的示例 git tcsh 完成,它使用了用户 mavin 在他的回答中指出的技巧。

于 2012-12-19T10:26:05.580 回答