Странное поведение команды Bash clear: удаляется буфер прокрутки.

Странное поведение команды Bash clear: удаляется буфер прокрутки.

Всякий раз, когда я запускаю clear в своем терминале, он удаляет буфер прокрутки от верхней части экрана до текущей строки. Я пробовал это в xterm, st и urxvt, и проблема остается. Есть ли способ изменить поведение clear, чтобы он не трогал буфер прокрутки?

решение1

Комментарий "от верха экрана до текущей строки" двусмысленный. Если вы имели в виду от верха экранавидимая частьэкрана, это непрокрутить назад. Прокрутка терминала — это та часть, которую вы можете увидеть только с помощью полосы прокрутки (или соответствующих клавиш, таких как shift pageup).

Последовательности управления XTermдокументирует соответствующую последовательность побега:

CSI Ps J  Erase in Display (ED).
            Ps = 0  -> Erase Below (default).
            Ps = 1  -> Erase Above.
            Ps = 2  -> Erase All.
            Ps = 3  -> Erase Saved Lines (xterm).

Возможность описания терминала clearиспользует предпоследний, например,

clear=\E[H\E[2J

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

Ссылаясь на очисткупрокрутить назад: Это специфическая функция терминала, изначально управляющая последовательность в xterm (1999, задокументировано вctlseqs.msно не упомянуто в изменениях) и позже (2011) реализовано как расширение для консоли Linux и соответствующее описание терминала. База данных терминалов содержит его как"разное расширение".

В настоящее время эти описания терминалов имеют следующую функцию:

Поддерживается ли он в аналогах xterm, таких как VTE, придется выяснить путем тестирования (полезной документации для VTE или Konsole нет).

Если вы предпочитаете не использовать расширение, вы можете удалитьE3возможность из описания терминала, который вы используете, например,

infocmp -1x >foo
edit foo, removing the line with "E3="
tic -x foo

Я предложил использовать варианты-1и-xдля упрощения форматирования и для демонстрации возможности изменения. Пример, приведенный вhttps://ghostbin.com/paste/kfsbjсоответствует этому совету:

  • имя пути /home/flowerpick/.terminfo/x/xtermбудет использоваться ncurses
  • возможности AXи XTявляются расширенными возможностями (например, E3), отображаемыми с -xопцией.

Если вы используете более одного типа терминала, вам придется сделать это для каждого (значение $TERM), и изменение будет применяться только к той машине, на которой вы запускаете clear. Первые несколько строк вывода infocmpпоказывают, на какой из них вы работаете:

#   Reconstructed via infocmp from file: /home/flowerpick/.terminfo/x/xterm
xterm|xterm terminal emulator (X Window System),

Например, uxrvtустанавливает $TERMчто-то вроде rxvt-unicode, создавая такие строки в infocmp:

#       Reconstructed via infocmp from file: /lib/terminfo/r/rxvt-unicode       
rxvt-unicode|rxvt-unicode terminal (X Window System),

Программа stиспользует xterm(или, возможно,xterm-256color , ), хотя прошло уже некоторое время с тех пор, как я видел копиючтокоторый сработал достаточно хорошо, чтобы его прокомментировать.

Кстати, тымогесть псевдоним, для clearкоторого отправляется заданная escape-последовательность (игнорируя описание терминала), но я не видел, чтобы кто-то об этом сообщал.

Если вы хотите "очистить выше", это не так просто, как набрать "очистить". Escape \033[1Jстирает от верхнего левого угла до текущей позиции курсора. Вы можете создать скрипт, который делает это, чтобы очистить тольколиниинад текущим курсором:

  • используйте отчет о положении курсора, чтобы найти строку/столбец, на котором в данный момент находится курсор, и
  • если курсор не находится на первой строке, (сохраняя эту позицию), переместите курсор на одну строку вверх, а затем (с последовательностью hpa) переместитевернобольшое количество,
  • выдать «ясно выше» и
  • вернуться в исходное положение, используя cup(курсорную адресацию).

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

решение2

У меня была та же проблема, и добавление псевдонима .bashrcпомогло:

alias clear='printf "\E[H\E[2J"'

Напоминание: изменения .bashrcвступят в силу после открытия нового терминала!

решение3

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

Проверяя страницу руководства, можно увидеть, что там четко указано:

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

Там также есть вариант:

-x не пытаться очистить буфер прокрутки терминала с помощью расширенной возможности «E3».

С тех пор я добавил это в свой список псевдонимов в ~/.bashrc:

alias clear='clear -x'

При запуске я по-прежнему получаю запрос на переход наверх clear, но теперь я могу прокрутить страницу еще выше, если захочу.

решение4

Мое решение этой проблемы — добавить следующий псевдоним к моему.bashrc

alias clear='tput reset'

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

\clear

Связанный контент