Самый простой способ очистить буфер прокрутки терминала + более глубокое объяснение?

Вопрос или проблема

Зачем беспокоиться?

Очистка буфера прокрутки полезна во многих отношениях, например, когда я хочу запустить команду с длинным выводом и хочу быстро прокрутить до начала этого вывода. Когда буфер прокрутки очищается, я могу просто прокрутить вверх, и все будет готово.

Некоторые соображения:

Существует команда clear, согласно man-странице,

clear очищает ваш экран, если это возможно, включая его буфер прокрутки (если определена расширенная возможность “E3”).

В gnome-terminal clear не очищает буфер прокрутки. (Что это за возможность “E3”?)

Существует также reset, который очищает, но он делает немного больше, чем это, и он действительно медленный (на моей системе это занимает больше секунды, что является значительной задержкой для человека).

И есть echo -ne '\ec' или echo -ne '\033c', которые выполняют эту задачу. И действительно, они гораздо быстрее, чем reset.

Вопрос в том, что такое последовательность \ec, чем она отличается от того, что делают clear и reset, и почему для нее нет отдельной команды?

Существует также последовательность клавиш readline C-l, которая по умолчанию связана с командой clear-screen (имеется в виду команда readline, а не команда оболочки). Что это за команда? Какую escape-последовательность она генерирует? Как она вообще работает? Запускает ли она команду оболочки? Или что-то еще? Опять же, в gnome-terminal, кажется, она работает просто добавлением пустых строк, пока приглашение не появится на верхней строке терминала. Не уверен, как это происходит в других эмуляторах терминала. Это очень утомительное поведение. Оно засоряет буфер прокрутки кусками пустоты, так что вам приходится прокручивать все выше и выше. Это похоже на хак, а не на чистое решение.

Еще один вопрос: существует ли команда readline для упомянутой последовательности \ec? Я хочу связать ее с C-l вместо этого, потому что я всегда хочу очищать буфер прокрутки, когда очищаю экран.

И еще один вопрос: как просто ввести такую escape-последовательность в терминал, чтобы выполнить желаемое действие? Тогда не придется думать о привязке C-l к другой команде readline (если такая команда существует). Я пытался ввести Esc, затем c, но это не работает.

ОБНОВЛЕНИЕ
Этот вопрос в основном раскрыт здесь: https://unix.stackexchange.com/a/375784/257159. Это очень хороший ответ, который объясняет почти все заданные здесь вопросы.

Из раздела man bash о readline:

   clear-display (M-C-l)
          Очистить экран и, если возможно, буфер прокрутки терминала, затем перерисовать текущую строку, оставив
          текущую строку в верхней части экрана.
   clear-screen (C-l)
          Очистить экран, затем перерисовать текущую строку, оставив текущую строку в верхней части экрана.  При
          аргументе, обновить текущую строку без очистки экрана.

Так что нажмите control + alt + L

Многие эмуляторы терминала используют те же escape-последовательности, что и XTerm, или похожие. Для XTerm, Escc определено как “Полный сброс (RIS)”. Кажется разумным, что полный сброс очистил бы буфер прокрутки.


Мне не удалось использовать readline для привязки к самой последовательности, но обходной путь такой:

bind '"\C-l": "\C-a\C-kprintf\ "\\033c"\C-m"'

Это имеет некоторые оговорки. Во-первых, это помещает команду printf в вашу историю оболочки, что не идеально. Во-вторых, это невозможно использовать при вводе команды; это перезаписывает текущую строку ввода.

Это работает для меня:

printf '\033[3J'

(из man-страницы команды clear)

часть terminfo.src (с цветом) для NCURSES

(Учтите, что “\E обозначает символ escape (\033),” и E3=\E[3J )

#### VT100/ANSI/ECMA-48
#
# ANSI Standard (X3.64) Управляющие последовательности терминалов и периферийных устройств
# и ECMA-48 Управляющие функции для кодированных наборов символов.
#
# Большая часть содержания этого комментария адаптирована из таблицы, подготовленной
# Ричардом Шуфордом, основанной на статье из журнала Byte 1984 года.  Соответствия terminfo,
# обсуждение некоторых вопросов, связанных с terminfo, и обновления, чтобы учитывать ECMA-48,
# были добавлены.  Управляющие функции, описанные только в ECMA-48, обозначены *
# после их названий.
#
# Таблица является полным списком определенных управляющих последовательностей ANSI X3.64/ECMA-48.
# Во главной таблице, \E обозначает символ escape (\033),
# SPC обозначает пробел.  Pn обозначает один числовой параметр, вставляемый в десятичном
# ASCII.  Ps обозначает список таких параметров, разделенных точками с запятой.  Значения параметров
# для большинства параметризованных последовательностей описаны в примечаниях.
#
# Последовательность           Название последовательности                  Параметр или
# Мнемоника                    Последовательность                           Значение   Режим    terminfo
# -----------------------------------------------------------------------------
# APC  Команда программы       \E _                                         -         Delim  -
# BEL  Звонок *                ^G                                           -         -      bel
# BPH  Прервать позволено *    \E B                                         -         *      -
# BS   Назад *                 ^H                                           -         EF     -
# CAN  Отмена *                ^X                                           -         -      -   (A)
# CBT  Табуляция назад         \E [ Pn Z                                    1         eF     cbt
# CCH  Отмена предыдущего символа \E T                                      -         -      -
# CHA  Абсолютное горизонтальное положение \E [ Pn G                        1         eF     hpa (B)
# CHT  Горизонтальная табуляция \E [ Pn I                                   1         eF     tab (C)
# CMD  Разделитель метод кодирования * \E 
# CNL  Переход к следующей строке \E [ Pn E                                 1         eF     nel (D)
# CPL  Переход к предыдущей строке \E [ Pn F                                1         eF     -
# CPR  Отчет о положении курсора \E [ Pn ; Pn R                             1, 1      -      -   (E)
# CSI  Введение управляющей последовательности \E [                          -         Intro  -
# CTC  Управление табуляцией \E [ Ps W                                      0         eF     -   (F)
# CUB  Перемещение курсора назад \E [ Pn D                                  1         eF     cub
# CUD  Перемещение курсора вниз \E [ Pn B                                   1         eF     cud
# CUF  Перемещение курсора вперед \E [ Pn C                                 1         eF     cuf
# CUP  Положение курсора \E [ Pn ; Pn H                                     1, 1      eF     cup (G)
# CUU  Перемещение курсора вверх \E [ Pn A                                  1         eF     cuu

изображение terminfo

.

Ответ или решение

Очищение буфера прокрутки терминала — это полезный навык для каждого ИТ-специалиста. Благодаря ему можно легко и быстро убрать все предыдущие выводы в терминале, оставляя только те данные, которые имеют непосредственную актуальность. В этой статье мы подробно разберем, как эффективно очистить буфер прокрутки, а также объясним основные возможности, команды и последовательности управляющих символов, используемых для этого.

Теория: Зачем очищать буфер прокрутки?

Буфер прокрутки терминала — это область памяти, в которой сохраняется история команд и выводов, отображаемых в терминале. Порой выходные данные команды могут быть настолько объемными, что трудно найти начало или конец нужной информации. Очищение буфера позволяет избавиться от "хлама", чтобы сосредоточиться на данных последних выполненных команд. Например, когда вы запускаете команду с длинным выводом, которая перекрывает предыдущий вывод, очистка буфера прокрутки позволяет начать с чистого листа.

Пример: Различные подходы к очистке буфера и их объяснение

  1. Команда clear: Существует команда clear, которая согласно мануалу "если это возможно, очищает ваш экран, включая буфер прокрутки (если определена расширенная возможность "E3")." Однако в gnome-terminal команда clear не очищает буфер прокрутки. Возможность "E3" – это спецификация в терминальном капабилити-файле terminfo, обозначающая возможность очистки.

  2. Команда reset: Эта команда сбрасывает настройки терминала и очищает экран вместе с буфером прокрутки, однако, работает медленно (занимает более секунды), что может быть заметно для пользователя.

  3. Последовательности escape:

    • echo -ne '\ec' или echo -ne '\033c': Это отправляет терминалу команду полного сброса, что быстро очищает буфер прокрутки. \ec является сокращенной формой \033c, где \033 это escape-символ.
    • printf '\033[3J': Эта команда очищает буфер прокрутки в некоторых терминалах и может быть полезной альтернативой.
  4. Readline команды:

    • C-l: В readLine C-l (Ctrl+L) чаще всего просто сглаживает экран путем добавления пустых строк, что не очищает буфер и приводит к его засорению.
    • M-C-l (Alt+Ctrl+L): В некоторых конфигурациях эта комбинация очищает экран и, если возможно, также буфер прокрутки.

Применение: Созданные пользователем команды и связывание клавиш

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

  • Использование bind в readline можно настроить "\C-l" (Ctrl-L), чтобы запускать printf '\033c', что очищает буфер прокрутки и записывается в историю команд, что не всегда удобно.

Итог

Очищение буфера прокрутки терминала — важная часть работы при взаимодействии с терминалом. Понять и использовать перечисленные выше команды помогут облегчить работу с терминальными интерфейсами. Комбинирование и настройка этих команд через пользовательские связывания клавиш может дополнительно ускорить и упростить работу вашего терминала, увеличивая вашу продуктивность.

Оцените материал
Добавить комментарий

Капча загружается...