Как изменить цветовую схему завершения bash-команд

Вопрос или проблема

Как изменить окраску завершения при автозаполнении подкоманд в bash?введите описание изображения здесь

По неизвестной причине, кажется, что результаты завершения обрабатываются bash как поврежденные символические ссылки. И это выглядит действительно тревожно.

Системная информация:

  • Версия Bash: 4.4.23(1)-release
  • ОС: Manjaro Linux

Правка: Я понимаю, что при отключении опции GNU Readline colored-stats в ~/.inputrc окраска будет полностью отключена:

set colored-stats off

Но это также отключило бы и другую окраску, например, для директории при автозаполнении.

Я считаю это странным, потому что окраска, похожая на поврежденные ссылки, происходит на моем домашнем компьютере с Manjaro Linux, но не на моем рабочем компьютере с Arch Linux. На обоих использованы одинаковые bashrc и inputrc. Но я пока не проверял другие возможные отличия.


Снова правка: Вставляю мой ~/.inputrc для справки:

$include /etc/inputrc
$if mode=emacs
# цикл по возможным вариантам завершения
TAB: menu-complete
# завершение до конца общего префикса перед циклом по возможным вариантам
set menu-complete-display-prefix on
# показывать возможные варианты, если доступно более одного завершения
set show-all-if-ambiguous on
set show-all-if-unmodified on
# не повторять символы после курсора, если они частично совпадают с вариантом завершения
set skip-completed-text on
# отображать цвета при завершении, как делает `ls`
set colored-stats on
# окрашивать совпавшую часть префикса при завершении
set colored-completion-prefix on
# отключить привязки клавиш stty. (stty -a)
set bind-tty-special-chars off
"\C-w": unix-word-rubout
"\eh": kill-region
"\eH": copy-region-as-kill
"\C-x\'": "\'\'\C-b"
"\C-x`": "``\C-b"
"\C-x\"": "\"\"\C-b"
"\C-x{": "{}\C-b"
"\C-x[": "[]\C-b"
"\C-x(": "()\C-b"
"\C-x0": vi-eWord
"\eF": "\C-x0\C-f"
"\eB": vi-bWord
"\eD": "\e \eF\eh"
$endif

Окраска завершения для GNU Readline включается с помощью colored-stats в .inputrc, как вы уже упомянули.

Цвета определяются с помощью $LS_COLORS, которые могут быть сгенерированы с помощью dircolors.

Предложения по завершению, по-видимому, наследуют свои цвета от атрибута MISSING в ~/.dircolors. Закомментировав его (или изменив на что-то менее тревожное, например, убрав 05; для отключения мигания) предложения выводятся в стандартных цветах. Соответствующая запись в $LS_COLORS выглядит как ...:mi=03;31:... (пример с ANSI цветами 03 и 31).

Похожие обсуждения:
https://bugzilla.redhat.com/show_bug.cgi?id=1648170

Ссылки:
https://wiki.archlinux.org/index.php/Readline#Colorized_completion
https://wiki.archlinux.org/index.php/Color_output_in_console#ls
dircolors: глобальное изменение цветовых настроек
https://askubuntu.com/questions/466198/how-do-i-change-the-color-for-directories-with-ls-in-the-console

Ответ или решение

Чтобы изменить цвет подсветки результатов автодополнения в Bash, нужно понять, как Bash определяет эти цвета. Во многих случаях, цвета автодополнения зависят от переменной окружения $LS_COLORS, которая управляет цветовыми кодами терминала для различных типов файлов и объектов.

Проблема:
У вас возникает ситуация, где результаты автодополнения окрашиваются как "повреждённые символические ссылки". Этот эффект вызывается настройками в $LS_COLORS, а именно атрибутом MISSING.

Решение:

  1. Проверка текущих значений $LS_COLORS: Начните с просмотра текущих значений. Это можно сделать с помощью команды:

    echo $LS_COLORS
  2. Исправление конфигурации в .dircolors:

    • Если вы хотите изменить цветовую схему для отсутствующих файлов, откройте или создайте файл ~/.dircolors.
    • Найдите строку, содержащую MISSING атрибут, к примеру, mi=03;31.
    • Измените или закомментируйте этот атрибут. Например, уберите 05; для отключения мигания:
      # mi=03;31
      mi=31
  3. Применение изменений:
    После внесения изменений в ~/.dircolors, обновите переменную окружения $LS_COLORS:

    eval "$(dircolors -b ~/.dircolors)"

    Это автоматически применит изменения в цветовой схеме.

  4. Перезагрузка Bash: После выполнения вышеуказанных шагов перезапустите терминал, чтобы изменения вступили в силу.

Альтернативное решение:
Если вы хотите полностью отключить цветовую схему для автодополнения без изменения других цветов, можно использовать опцию colored-stats в файле ~/.inputrc:

set colored-stats off

Однако, как вы отметили, это также отключит окрашивание других файловых объектов, таких как директории.

Почему это может происходить только на одном компьютере?
Такое различие в поведении может быть вызвано разными настройками или различными версиями системы. Возможно, файл ~/.dircolors или конфигурации терминала на одном из компьютеров отличаются.

Такие действия позволят вам гибко управлять настройками цвета автодополнения в Bash, сохраняя при этом удобство цветовой подсветки других объектов. Не забудьте адаптировать решения под специфику вашей системы и личные предпочтения.

Оцените материал
Добавить комментарий

Капча загружается...