Readline: привязка последовательности escape ANSI к ключу

Я хотел бы связать ключ с bash / readline, чтобы очистить нижнюю часть экрана консоли.

Последовательность ANSI для очистки нижней части экрана: \e[J , поэтому я попытался добавить следующую строку в мой .inputrc , но она не работает, она просто игнорирует три символа:

 Control-N: "\e[J" 

Если я добавлю несколько тестовых символов внутри строки:

 Control-N: "BEFORE \e[J AFTER" 

, то строка BEFORE вставлена ​​и останавливается там.

На данный момент я нашел это обходное решение, но он явно отображает строку с командой echo , и я не хочу этого:

 Control-N: "echo -ne \"\\e[J\"\n" 

Можно ли отправлять последовательности ANSI с привязкой к readline ?

2 Solutions collect form web for “Readline: привязка последовательности escape ANSI к ключу”

Две части:

  • bash позволяет привязать ключ к функции очистки экрана readline (которая, кажется, является исходной целью).
  • в bash, целью readline является подготовка текста (путем редактирования и т. д.) для выдачи команд bash . Управляющая последовательность будет отправлена ​​на терминал . Ни одна из перечисленных функций для readline не будет использоваться для замены echo или printf .

Ключевые привязки для readline ожидают одну строку имени-функции или литерала. В вашем примере readline прочитал то, что он считал возможным именем функции, и проигнорировал остальную часть строки.

Итак: no, bash / readline не предоставляют полезных функций для эхо-эвенсирования escape-последовательности непосредственно в качестве связывания ключей. Вы должны пойти на другой уровень, как отмечено, используя echo .

Немного улучшив использование команды echo внутри команды .inputrc , если в итоге получился результат, я хотел бы точно:

Я применил следующий func в моем .bashrc , выбирая заведомо короткое имя для func:

 cbs() { echo -ne '\e[J\e[F\e[2K' history -d $(history 1) } 

Он использует последовательности ANSI, чтобы очистить нижнюю часть экрана ( \\e[J ), затем переместите курсор обратно в ту же строку, в которой он был первоначально ( \\e[F ), прежде чем окончательно очистить строку, в которую была вставлена ​​команда ( \\e[2K ).

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

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

Затем я связываю Ctrl-N соответственно в .inputrc :

 Control-N: "cbs\n" 
  • запуск команд из файлов
  • Проблема с сокращением Tmux
  • Изменение цвета фона терминала GNOME на лету
  • Как предотвратить отображение искаженного экрана во время запуска скриптов на удаленных хостах?
  • Использование переменных для хранения цветовых кодов терминала для PS1?
  • Почему мои стрелочные клавиши не работают в sh?
  • вызов javac из CentOS 7
  • Команда dd не реагирует при попытке создать загрузочный USB-носитель в Debian?
  • Как узнать, что наводняет терминал?
  • Терминатор не работает!
  • Как я могу очистить терминал другими командами?
  • Linux и Unix - лучшая ОС в мире.