Autocomplete 如何在tcsh中为制表符完成提供颜色?

Autocomplete 如何在tcsh中为制表符完成提供颜色?,autocomplete,colors,tcsh,Autocomplete,Colors,Tcsh,() 教我们如何在tcsh提示中引入颜色 很好地解释了如何将颜色输入到echo命令的任何输出中: > echo \\e[1\;30mBLACK\\e[0m BLACK > echo '\e[1;30mBLACK\e[0m' BLACK 上面示例中的“黑色”一词是用黑色(或暗灰色)前景色打印的(取决于整体配色方案) 现在我想在tcsh的[TAB]命令自动完成功能中介绍这一点。我试过: complete testcmd 'p/*/`echo '"'"'\e[1;30mf834fef\e

()

教我们如何在tcsh提示中引入颜色

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

> echo \\e[1\;30mBLACK\\e[0m
BLACK
> echo '\e[1;30mBLACK\e[0m'
BLACK
上面示例中的“黑色”一词是用黑色(或暗灰色)前景色打印的(取决于整体配色方案)

现在我想在
tcsh
[TAB]
命令自动完成功能中介绍这一点。我试过:

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

> testcmd [TAB]
> testcmd ^[\[1\;30mf834fef^[\[0m
显然,这些角色失去了它们的特殊意义。希望我只是没有正确地逃脱。但我尝试了其他几种方法。因此,我们非常感谢您的帮助

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

我认为这必须以某种方式起作用的原因是,如果您键入
ls[TAB]
,则tcsh本身提供彩色命令完成。这在我的设置中正常工作。您还可以在自动完成中使用
ls-1F
,并且
ls
输出的颜色也会通过管道传输。例如:

complete testcmd 'p/*/`ls -1F`/'
更新:正如用户mavin指出的,本例中的
ls
的着色确实没有通过管道进行。
ls
的颜色丢失,但自动完成可以根据ls\u颜色变量,根据ls添加的提示(如
/
*
标记结尾)重新应用颜色。这可以通过执行以下操作来验证

complete testcmd 'p/*/`ls --color -1`/'
它不能提供颜色,只能提供乱码输出。(字面上是通过转义字符序列的管道)

我在
tcsh
6.13.00版上


有什么想法吗?指针?

在您的示例中,
完成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'"'"'`/'

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

tcsh
将根据后缀为文件名着色,具体取决于
$LS\u 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中尝试了这个方法,但没有成功。

我的同事有一个更新的git tcsh completion示例,它使用了用户mavin在这里指出的技巧。

这个解决方法是开箱思考的一个很好的示例。不幸的是,从可用性的角度来看,我不会接受额外的退格。确认了你的观点,即似乎不可能通过颜色。基于此,我尝试在backtick补全中使用。由
grc
生成的转义码在输出上也以类似
^[[0m^[[33m(^[[0m])的形式出现^[[35m
尽管我之前发表了评论,但我可能还是同意你的答案。我也会将此标记为答案。希望在某个时候会有更好的方法来实现这一点。再一次,这是一个很好的开窍!我必须考虑这一点。(a)必须恢复LS_颜色的值-可能使用postcmd/precmd别名的组合,以及(b)如果我有大量的补全,LS_颜色的长度可能会有问题。仔细考虑一下:着色的排序非常耗时。在precmd/postmd中进行排序,它将为shell中的每个命令运行,即使它与
testcmd
无关。我看不到有选择地只为
testcmd
,因为shell无法知道用户要键入什么。