$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一部のデフォルト値を無視して使用します(スクリーンショット)。

画面

コンテキスト

私はApple端末を使用するmacOS 13.2.1を使用しています。 macportsを介してGNU bash(5.2.15)とGNU ls(9.1、coreutils)をインストールします。

質問

このトラブルシューティングを始める方法についてのアドバイスに興味がありますか?
誰かがbashでカラーコーディングオートコンプリートのロジックを決定するソースファイルを指摘することができますか?
どんなアドバイスにも感謝します。

答え1

これは以下で実装された動作です。GNU Readlineライブラリ。 Readlineは、LS_COLORSライブラリが初期化され、色付けが有効になっている場合にのみ解析され、その後はそうではありません。inputrcReadlineが初期化されたとき(読み取り後)に色付けが無効になっている場合、これは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_COLORSBashでこれを説明するには、次の色を有効にできます~/.inputrc

$if Bash
set colored-stats on
$endif

変数の更新はLS_COLORSまだReadlineの色には影響しません。色を更新するには、Bashを再起動するか、別のターミナルセッションを開くか、exec /bin/bash

関連情報