问题
Bash<tab>
自动补全忽略$LS_COLORS
变量并使用默认颜色值。
环境
我有一个 dircolors 文件,并且 .bashrc 中有以下声明:
eval `dircolors $HOME/.config/bash/dircolors`
bind 'set colored-stats on'
bind 'set colored-completion-prefix on'
alias ls='ls --group-directories-first --color=auto'
输出ls
的颜色正确,$LS_COLORS
并且选项卡自动完成的颜色已打开。但是选项卡自动完成会忽略$LS_COLORS
并使用一些默认值(屏幕截图):
语境
我使用的是 macOS 13.2.1,使用 Apple Terminal。通过 macports 安装 GNU bash (5.2.15) 和 GNU ls (9.1, coreutils)。
问题
对有关如何开始解决此问题的任何指示感兴趣吗?
也许有人可以指出哪些源文件决定了 bash 中颜色编码自动完成背后的逻辑?
任何提示表示赞赏。
答案1
这是在中实现的行为GNU Readline 库。 ReadlineLS_COLORS
仅在初始化库并启用着色时进行解析,之后不会进行解析;如果在初始化 Readline 时(读取后inputrc
)禁用着色,LS_COLORS
则会被忽略,Readline 将使用其默认颜色。为了重现这个问题,我编写了这个示例 C 程序,您可以使用-lreadline
.
readline_test.c
:
#include <stdio.h>
#include <stdlib.h>
#include <readline/readline.h>
int readline_puts(void)
{
char *in;
if ((in = readline("> ")) != NULL) {
puts(in);
free(in);
}
return in != NULL;
}
int main(int argc, char **argv)
{
if (!readline_puts())
exit(EXIT_FAILURE);
// use coloring after Readline was initialized
rl_variable_bind("colored-stats", "on");
if (!readline_puts())
exit(EXIT_FAILURE);
return 0;
}
$ gcc readline_test.c -o readline_test -lreadline
$ mkfifo myfile1
$ touch myfile2
$ ./readline_test
> myfile<tab>
myfile1 myfile2
> myfile
myfile
> myfile<tab>
myfile1 (yellow, Readline default for pipes) myfile2 (normal)
但是当设置LS_COLORS
以其他颜色显示管道并更改main
为:
int main(int argc, char **argv)
{
// enable colors before Readline is initialized
rl_variable_bind("colored-stats", "on");
if (!readline_puts())
exit(EXIT_FAILURE);
if (!readline_puts())
exit(EXIT_FAILURE);
return 0;
}
$ gcc readline_test.c -o readline_test -lreadline
$ ./readline_test
> myfile<tab>
myfile1 (configured color) myfile2 (normal)
要LS_COLORS
在 Bash 中考虑,您可以在以下位置启用颜色~/.inputrc
:
$if Bash
set colored-stats on
$endif
请注意,对变量的更新LS_COLORS
仍然不会影响 Readline 着色,要更新颜色,您必须重新启动 Bash,打开另一个终端会话或使用exec /bin/bash
.