Вопрос или проблема
Зачем беспокоиться?
Очистка буфера прокрутки полезна во многих отношениях, например, когда я хочу запустить команду с длинным выводом и хочу быстро прокрутить до начала этого вывода. Когда буфер прокрутки очищается, я могу просто прокрутить вверх, и все будет готово.
Некоторые соображения:
Существует команда 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
.
Ответ или решение
Очищение буфера прокрутки терминала — это полезный навык для каждого ИТ-специалиста. Благодаря ему можно легко и быстро убрать все предыдущие выводы в терминале, оставляя только те данные, которые имеют непосредственную актуальность. В этой статье мы подробно разберем, как эффективно очистить буфер прокрутки, а также объясним основные возможности, команды и последовательности управляющих символов, используемых для этого.
Теория: Зачем очищать буфер прокрутки?
Буфер прокрутки терминала — это область памяти, в которой сохраняется история команд и выводов, отображаемых в терминале. Порой выходные данные команды могут быть настолько объемными, что трудно найти начало или конец нужной информации. Очищение буфера позволяет избавиться от "хлама", чтобы сосредоточиться на данных последних выполненных команд. Например, когда вы запускаете команду с длинным выводом, которая перекрывает предыдущий вывод, очистка буфера прокрутки позволяет начать с чистого листа.
Пример: Различные подходы к очистке буфера и их объяснение
-
Команда
clear
: Существует командаclear
, которая согласно мануалу "если это возможно, очищает ваш экран, включая буфер прокрутки (если определена расширенная возможность "E3")." Однако вgnome-terminal
командаclear
не очищает буфер прокрутки. Возможность "E3" – это спецификация в терминальном капабилити-файлеterminfo
, обозначающая возможность очистки. -
Команда
reset
: Эта команда сбрасывает настройки терминала и очищает экран вместе с буфером прокрутки, однако, работает медленно (занимает более секунды), что может быть заметно для пользователя. -
Последовательности escape:
echo -ne '\ec'
илиecho -ne '\033c'
: Это отправляет терминалу команду полного сброса, что быстро очищает буфер прокрутки.\ec
является сокращенной формой\033c
, где\033
это escape-символ.printf '\033[3J'
: Эта команда очищает буфер прокрутки в некоторых терминалах и может быть полезной альтернативой.
-
Readline команды:
C-l
: В readLineC-l
(Ctrl+L) чаще всего просто сглаживает экран путем добавления пустых строк, что не очищает буфер и приводит к его засорению.M-C-l
(Alt+Ctrl+L): В некоторых конфигурациях эта комбинация очищает экран и, если возможно, также буфер прокрутки.
Применение: Созданные пользователем команды и связывание клавиш
Некоторые пользователи могут создать собственные команды или связывания клавиш для более удобного управления очисткой. Например:
- Использование
bind
вreadline
можно настроить"\C-l"
(Ctrl-L), чтобы запускатьprintf '\033c'
, что очищает буфер прокрутки и записывается в историю команд, что не всегда удобно.
Итог
Очищение буфера прокрутки терминала — важная часть работы при взаимодействии с терминалом. Понять и использовать перечисленные выше команды помогут облегчить работу с терминальными интерфейсами. Комбинирование и настройка этих команд через пользовательские связывания клавиш может дополнительно ускорить и упростить работу вашего терминала, увеличивая вашу продуктивность.