Почему установка mi в LS_COLORS влияет на завершение вкладок postgresql и python?

Aug 18 2020

Итак, у меня есть индивидуальная LS_COLORSнастройка, и в ней есть следующее:

mi=05;01;33:
or=05;01;33:

miпредназначен для отсутствующих файлов в правом столбце при просмотре списка ls и orдля отсутствующих файлов в обычном режиме ls или слева в режиме списка. В приведенном выше примере оба индикатора мигают ярко-желтым цветом. Я установил это так, потому что думал, что мигание будет самым очевидным способом предупредить себя о недостающем звене, что отлично работает.

Но проблема в том, что когда я запускаю питон в интерактивном режиме и запрашиваю завершение табуляции, например, import reтогда re.[tab key]. Вместо того , чтобы просто получить нормальный список , что находится в miв LS_COLORSбудет применяться к предложениям. Таким образом, я получаю экран, полный мигающего текста, из-за чего границу невозможно читать с любой разумной скоростью.

То же самое происходит, когда я использую автодополнение в консоли интерактивного режима postgresql. Точно так же, как питон. Однако большинство других программ или подобных им подходят, и завершение bash вполне нормально.

Используются ли эти программы lsдля форматирования своего вывода? В настоящее время я просто miвернулся к чему-то другому, чтобы обойти проблему, и это не имеет особого значения, потому что я все еще вижу неработающие ссылки через or. Но мне было бы очень любопытно узнать, почему это происходит, и могу ли я это остановить.

Ответы

1 Quasímodo Aug 18 2020 at 23:24

Используется строка чтения GNU , что можно подтвердить перечислением модулей по умолчанию :

$ python3
>>> import sys
>>> sys.modules.keys()
dict_keys([...,'readline', 'atexit', 'rlcompleter'])

Readline, в свою очередь, использует LS_COLORS. От man 3 readline,

цветная статистика (Выкл.)
Если установлено значение Вкл., строка чтения отображает возможные завершения, используя разные цвета для обозначения их типа файла. Определения цвета берутся из значения переменной среды LS_COLORS.

Если вы не уверены, вернитесь к интерактивному сеансу Python и введите

>>> a<TAB><TAB>
abs(     all(     and      any(     as       ascii(   assert   async    await
>>> import readline
>>> readline.parse_and_bind("set colored-stats off")
>>> a<TAB><TAB>
abs(     all(     and      any(     as       ascii(   assert   async    await

После отключения цветной статистики предлагаемые завершения ( bs(, ll(и т. Д.) Должны иметь обычный цвет терминала. Префикс по- aпрежнему наследует цвет, LS_COLORSи вы также можете отключить его с помощью

readline.parse_and_bind("set colored-completion-prefix off")