質問
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
ライブラリが初期化され、色付けが有効になっている場合にのみ解析され、その後はそうではありません。inputrc
Readlineが初期化されたとき(読み取り後)に色付けが無効になっている場合、これは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
。