Как отобразить управляющие символы (^ C, ^ D, ^ [, …) по-разному в оболочке

Когда вы вводите управляющие символы в оболочке, они отображаются с использованием так называемой «нотации каретки». Например, Escape записывается как ^[ в каретной нотации.

Мне нравится настраивать мою оболочку bash, чтобы она выглядела круто. Я, например, изменил свои PS1 и PS2 чтобы стать раскрашенными. Теперь я хочу, чтобы управляющие символы получили уникальный внешний вид, чтобы сделать их более различимыми от обычных символов.

 $ # Here I type CTRL-C to abort the command. $ blahblah^C ^^ I want these two characters to be displayed differently 

Есть ли способ заставить мои оболочки выделять контрольные символы по-разному?

Можно ли отображать их жирным шрифтом или, возможно, отображать их в разных цветах из обычного текста?

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

Обратите внимание, что я не знаю, на каком уровне происходит выделение контрольных символов. Сначала я подумал, что это было в самой оболочке. Теперь я слышал, что это readline, который контролирует, как управляющие символы находятся в оболочках типа bash . Итак, вопрос теперь отмечен readline и я все еще ищу ответы.

2 Solutions collect form web for “Как отобразить управляющие символы (^ C, ^ D, ^ [, …) по-разному в оболочке”

Когда вы нажимаете Ctrl + X , ваш эмулятор терминала записывает байт 0x18 на основную сторону пары псевдотерминалов.

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

Команда для настройки этой дисциплины tty line является командой stty .

При запуске немого приложения, такого как cat о котором не известно, и его не волнует, является ли его stdin терминалом или нет, терминал находится в каноническом режиме по умолчанию, где дисциплина tty line реализует грубый редактор строк .

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

Обычно, когда вы вводите командную строку, оболочка помещает дисциплину линии tty в этот режим, и когда вы нажимаете клавишу ввода для запуска текущей команды, оболочка восстанавливает обычный режим tty (как это было до выдачи подсказки).

Если вы запустите команду stty -a , вы увидите текущие настройки, используемые для немых приложений . Вероятно, вы echoctl параметры icanon , echo и echoctl .

Это означает, что:

  • icanon : этот редактор сырой линии включен.
  • echo : вводимые вами символы (то, что эмулятор терминала записывает на основную сторону) отсылаются обратно (доступны для чтения эмулятором терминала).
  • echoctl : вместо эхо- сигналов asis управляющие символы повторяются как ^X

Итак, допустим, вы вводите A B Backspace-aka-Ctrl + H /? C Ctrl + X Backspace Return .

Ваш эмулятор терминала отправит: AB\bC\x18\b\r . Линейная дисциплина будет повторяться обратно: AB\b \bC^X\b \b\b \b\r\n , а приложение, которое считывает вход со стороны подчиненного устройства ( /dev/pts/x ), будет читать AC\n .

Все приложение видит AC\n , и только когда вы нажимаете Enter, чтобы он не мог контролировать какой-либо выход для ^X

Вы заметите, что для эха первое ^H ( ^? С некоторыми терминалами, см. erase ) привело к тому, что \b \b было отправлено обратно на терминал. Это последовательность, чтобы переместить курсор назад, перезаписать пробел, переместить курсор назад, а второй ^H привел к \b \b\b \b чтобы стереть эти два символа ^ и X

Сам ^X (0x18) переводился в ^ и X для вывода. Подобно B , он не попал в приложение, поскольку мы удалили его с помощью Backspace.

\r (aka ^M ) переводится в \r\n ( ^M^J ) для эха и \n ( ^J ) для приложения.

Итак, каковы наши варианты для этих немых приложений:

  • отключить echo ( stty -echo ). Это эффективно изменяет способ отображения управляющих символов, не повторяя ничего. На самом деле это не решение.
  • отключить echoctl . Это изменяет способ отображения управляющих символов (кроме ^H , ^M … и всех других, используемых редактором строк). Затем они повторяются как есть. Это, например, символ ESC посылается в 0x1b байта \e ( ^[ / 0x1b ) (который распознается как начало escape-последовательности терминалом), ^G вы отправляете a \a (BEL, что делает звуковой сигнал терминала) … Не вариант.
  • отключите редактор stty -icanon строки ( stty -icanon ). Не совсем вариант, поскольку сырые приложения стали бы намного менее полезными.
  • отредактируйте код ядра, чтобы изменить поведение дисциплины линии tty, поэтому эхо контрольного символа отправляет \e[7m^X\e[m вместо просто ^X (здесь \e[7m обычно разрешает обратное видео в большинстве терминалов) ,

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

Идя еще дальше, вы могли бы даже попробовать такие решения, как этот, который захватывает все входные данные терминала, чтобы пройти через редактор строк zsh (что происходит с подсветкой ^X s в обратном видео), основываясь на функции :exec .

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

Для zsh см.

 info --index-search='highlighting, special characters' zsh 

По умолчанию zsh выделяет непечатаемые символы. Вы можете настроить подсветку, например:

 zle_highlight=(special:fg=white,bg=red) 

Для белого цвета на красной подсветке для этих специальных символов.

Однако текстовое представление этих символов не настраивается.

В локали UTF-8 0x18 будет отображаться как ^X , \u378 , \U7fffffff (две неназначенные кодовые точки <0378> ) как <0378> , <7FFFFFFF> , \u200b (не совсем печатный символ \u200b ) как <200B> .

\x80 в локали iso8859-1 будет отображаться как ^ … и т. д.

Я обычно использую этот код в моем файле .bashrc:

 function get_exit_status() { local code=$? if [ $code -ne 0 ] then printf $'\001\033[31m\002'"($code)"$'\001\033[0m\002'" " fi } 

и затем я вызываю эту функцию в своем PS1

 PS1='\u@\h \w $(get_exit_status)' 

При этом, если вы нажмете ^ C, вы увидите его в своем приглашении

 I@mycomputer ~ ^C I@mycomputer ~ (130) 

Будут предложены все коды состояния выхода, которые не являются «0».

  • Отдельный ярлык для прямого поиска после обратного поиска Ctrl-R
  • Является ли один bash shellshock для исправления файла tar для SLES?
  • ~ / .inputrc файл не работает правильно
  • Как условия гонки влияют на чтение и запись (которые происходят одновременно)
  • Каковы разделители слов readline?
  • Как вы настраиваете .inputrc, поэтому ALT + UP имеет эффект cd
  • привязка ключа режима vi только в обычном режиме
  • Перемещение по пробельному разделительному слову в bash / readline
  • Как повторить в настоящее время введенный параметр на консоли bash?
  • Как печатать быстрые клавиши в форме для человека?
  • Как преобразовать параметры inputrc в bashrc?
  • Linux и Unix - лучшая ОС в мире.