我正在使用alias ls='ls --color'
compgen 并得到奇怪的结果,它使用终端颜色代码自动完成
正确应用颜色后,放入compgen -W "$(ls /someDir/)"
终端看起来不错ls
但与
COMPREPLY=( $(compgen -W "$(ls /someDir/)" -- ${cur}))
输出
^[[34;40mfilename^[[0m
默认白色
有没有办法保留彩色结果而不是将它们作为文本获取?
答案1
ls
这里根本不要使用;无论如何,颜色不应该成为输出的一部分,因为您不希望它们作为完成的一部分。-W
对于文件名来说不是一个好的选择,因为任何匹配的文件名都可能包含用于分隔-W
.
你应该直接使用 glob 来设置COMPREPLY
:
COMPREPLY=( "$cur"* )
答案2
compgen 结果包含终端颜色代码,因为您将它们放在那里。您应该这样使用,以便仅在打印到终端alias ls='ls --color=auto'
时获得颜色,而不是在输出被另一个命令使用时获得颜色。ls
但即使没有别名也compgen -W "$(ls /someDir/)"
不起作用。它调用ls
生成文件名列表,但命令的输出是字符串,而不是列表。compgen
分割 at 空白的输出ls
,如果任何文件名包含空白字符,则分割失败。相反,您需要生成文件名列表并去除目录前缀。未经测试:
files=(/someDir/*)
if [[ -e ${files[0]} -o -L ${files[0]} ]]; then
for f in "${files[@]}"; do
compgen -- "${f#/someDir/}"
done
fi
你不会得到颜色。我不认为 bash 能够完成着色。补全系统需要控制它在终端上的显示,您不能将控制字符隐藏到显示的内容中,并且希望不要混淆补全系统。如果你想要一个具有良好功能的外壳例如彩色完成,使用桀骜(或者鱼如果您不喜欢可配置性)。
答案3
你应该使用:
COMPREPLY=( $(compgen -W "$(ls /someDir/ --color=never)" -- ${cur}))
和--颜色=从不它按预期工作。