设置颜色统计忽略 $LS_COLORS

设置颜色统计忽略 $LS_COLORS

问题

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.

相关内容