Как я могу связать функциональную клавишу для вывода цветового кода?

Я делаю запись терминала, и я хотел бы изменить цвет переднего плана терминала, чтобы выделить определенные части (например, определенные аргументы командной строки) в записи.

Как я могу сопоставить функциональную клавишу для выделения цветового кода в bash/readline?

Я могу привязываться к другим вещам, таким как клавиши со стрелками, с помощью bind '"\e[21~":"\e[A"', поэтому я думаю, что выполнение чего-то вроде bind '"\e[21~":"\e[[31m"' должно выдать цветовой код и изменить цвет fg.

Это не так. Как мне заставить это работать?


person aleator    schedule 04.01.2018    source источник


Ответы (1)


Если вы привязываете ключ к такой строке, как \e[A, тогда этот ключ выдает эту строку, которая, в свою очередь, снова анализируется библиотекой readline и интерпретируется (в данном случае означает «вверх», что затем указывает на функцию previous-history). Строка никогда не выводится на терминал.

Поэтому, если вы хотите что-то напечатать, вам нужно привязать клавишу к функции, которая печатает что-то произвольное (ваша управляющая последовательность цветов ANSI). Я не знаю о такой функции readline, потому что это не имеет особого смысла, если вы все обдумаете. Проблема в том, что в readline нет понятия (нет внутренней модели) цветных символов. Readline предназначен только для необработанных символов, без стилей символов. Переключение цвета, ввод некоторых видимых символов, а затем использование клавиш курсора для редактирования уже напечатанных (может быть, цветных, может быть, стандартных) символов — подобные вещи приведут к перерисовке всей строки. В этом процессе цвета будут быстро уничтожены (потому что readline на самом деле не знает о них).

Так что я предполагаю, что то, что вы хотите, просто невозможно. Это функция, не поддерживаемая readline, и которую вы не можете просто добавить к ней (правильно) извне, не сломав ничего.

person Alfe    schedule 04.01.2018
comment
Ах. Спасибо, что указали на ошибку в моей ментальной модели. Я был бы доволен цветом, который сохраняется до следующей перерисовки, но похоже, что это не так просто сделать. - person aleator; 04.01.2018