(Crossposted to unix.stackexchange.com)
This question和the 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添加的ls
和ls
标记结尾。这可以通过
/
无法提供颜色,只提供乱码输出。 (直接通过转义字符序列管道)
我在*
版本6.13.00
有什么想法吗?指针?
答案 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)