Вопрос или проблема
Как изменить окраску завершения при автозаполнении подкоманд в 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
.
Решение:
-
Проверка текущих значений
$LS_COLORS
: Начните с просмотра текущих значений. Это можно сделать с помощью команды:echo $LS_COLORS
-
Исправление конфигурации в
.dircolors
:- Если вы хотите изменить цветовую схему для отсутствующих файлов, откройте или создайте файл
~/.dircolors
. - Найдите строку, содержащую
MISSING
атрибут, к примеру,mi=03;31
. - Измените или закомментируйте этот атрибут. Например, уберите
05;
для отключения мигания:# mi=03;31 mi=31
- Если вы хотите изменить цветовую схему для отсутствующих файлов, откройте или создайте файл
-
Применение изменений:
После внесения изменений в~/.dircolors
, обновите переменную окружения$LS_COLORS
:eval "$(dircolors -b ~/.dircolors)"
Это автоматически применит изменения в цветовой схеме.
-
Перезагрузка Bash: После выполнения вышеуказанных шагов перезапустите терминал, чтобы изменения вступили в силу.
Альтернативное решение:
Если вы хотите полностью отключить цветовую схему для автодополнения без изменения других цветов, можно использовать опцию colored-stats
в файле ~/.inputrc
:
set colored-stats off
Однако, как вы отметили, это также отключит окрашивание других файловых объектов, таких как директории.
Почему это может происходить только на одном компьютере?
Такое различие в поведении может быть вызвано разными настройками или различными версиями системы. Возможно, файл ~/.dircolors
или конфигурации терминала на одном из компьютеров отличаются.
Такие действия позволят вам гибко управлять настройками цвета автодополнения в Bash, сохраняя при этом удобство цветовой подсветки других объектов. Не забудьте адаптировать решения под специфику вашей системы и личные предпочтения.