Как остановить `clear` от очистки буфера обратной прокрутки
Первоначально я думал, что Unlimited прокрутка не работает с приложением терминала 16.04. У меня опция "Ограничить прокрутку до" снята. Иногда он прокручивает назад, а иногда нет. Тогда я понял, что не прокручивать назад, когда я использую clear команда. Прокручивает только один осыпь.
Я много использую clear (почти один раз в каждые 3 команды).
Страница руководства для ясных указаний на terminfo. В terminfo есть несколько параметров, но я не могу найти файл конфигурации, в котором я могу определить параметры. Все файлы в /lib/terminfo/, откуда кажется, что clear читает их конфигурацию, находятся в скомпилированном формате, и я их не понимаю.
Я не видел эту проблему с ранее до 14.04(догадываясь).
Любая помощь очень ценится.
Благодарю.
7 ответов
Вам нужно набрать CTRL+L вместо clear,
Это отправит "Form Feed" на терминал. По сути, он будет перемещать все по высоте окна терминала, очищая экран, не влияя на прокрутку.
Мне потребовалось некоторое время, чтобы понять, так что я думаю, я должен поделиться, как я заставил это работать.
Если вы наберете "man clear", вы увидите, что в руководстве говорится:
clear очищает ваш экран, если это возможно, включая его буфер прокрутки (если определена расширенная возможность "E3").
Мы собираемся удалить эту возможность E3:
Сначала выясните тип вашего терминала:
echo $TERM
Для меня это привело к "xterm-256color". Что бы это ни выводило, запомни это.
Теперь введите команду:
infocmp -x xterm-256color > tempfile
Где вы, очевидно, замените xterm-256color выводом первой команды. Это выведет расширенные возможности для этого типа терминала в "tempfile".
Теперь отредактируйте этот недавно созданный файл. Ты ищешь:
E3=\E[3J,
Найдите это и просто удалите это. Все дело, так что если бы это выглядело так:
...
Cs=\E]12;%p1%s\007, E3=\E[3J,
Ms=\E]52;%p1%s;%p2%s\007, Se=\E[2 q, Ss=\E[%p1%d q,
...
Теперь это должно выглядеть так:
...
Cs=\E]12;%p1%s\007,
Ms=\E]52;%p1%s;%p2%s\007, Se=\E[2 q, Ss=\E[%p1%d q,
...
Сохраните файл. И из вашего терминала выполните:
sudo tic -x tempfile
Это загрузит ваш измененный terminfo и сохранит его. перезапустите свой терминал и очистите теперь больше не нужно удалять скроллбуфер
Краткий ответ: Если у вас относительно новая версия clear, вы можете избежать очистки прокрутки -x вариант.
Длинный ответ:
clear комманов является частью ncurses,
Согласно журналу изменений,
20130622
+ изменитьclearпрограмма для учета расширенного E3
возможность очистки буфера обратной прокрутки терминала
Мирослав Личвар, Редхат #815790).
таким образом, предположение ОП
Я не видел эту проблему с ранее до 14.04(догадываясь).
может быть прав. Список изменений также говорит
20170819
+ добавить-xвозможность очистить /tput, чтобы сделать расширение E3 необязательным
(ср.: 20130622).
Так что вы можете использовать -x вариант, если дата выпуска ncurses равно или новее 2017-08-19. Это может быть проверено clear -V команда. Например,
$ clear -V
ncurses 6.1.20180127
и это можно прочитать как "ncurses 6.1 выпущен на 2018-01-27".
Я подтвердил, что процедура действительна на Arch Linux а также Linut Mint 19, Однако на Raspbian Stretch Liteэто недопустимо по умолчанию, потому что ncurses-base пакет поставляется через apt Старый. Я не знаю о новее Raspbian Buster Lite,
Этот ответ основан на ответе ската (над которым он проделал действительно хорошую работу) и предназначен для его завершения.
1 - Чтобы очистить без потери прокрутки, введите в консоли следующую команду (для Python нет необходимости, как предлагается в ответе stringray):
printf '\33[H\33[2J'
2 - Чтобы не запоминать это, вы можете отредактировать ваш файл.bashrc, чтобы создать для него псевдоним. Я бы назвал псевдоним ясным. В bash введите:
nano ~/.bashrc
И добавьте эту строку в конце:
alias clean="printf '\33[H\33[2J'"
Я также хотел бы добавить div (для делителя):
alias div='echo;echo "------------------------------------------------------------------------------";echo;echo;echo;echo;echo;echo;echo;echo;echo;echo;echo;echo "------------------------------------------------------------------------------";clean'
Это делает так, что когда вы выполняете команду div, он вводит два разделителя с 10 новыми строками между ними, после чего следует команда clean. Это сделает так, чтобы при прокрутке назад вы точно знали, где вы использовали div.
Вы можете изменить поведение sudo bash, выполнив sudo su перед процедурой, которую я перечислил.
Я рекомендовал бы это вместо ответа bashBedlam об использовании tic для редактирования.bashrc:
1) он не требует привилегий sudo и может быть легко взят на ходу.
2) влияет только на вашего пользователя (не все пользователи захотят модифицированную функцию очистки)
3) выживет обновления, которые обычно не касаются bashrc
Как упоминалось выше,
clear -x делает свое дело.
Однако, если вы похожи на меня и обычно печатаете
clear сотни раз в день, не надеясь вывести из строя пальцы, вы можете создать простой псевдоним в
.bashrc (или эквивалент) вот так:
alias clear='clear -x'.
@heemayl и @bashBedlam Спасибо.
CTRL+L делает то, что я хочу. Но я привык печатать постоянно. Так что я вроде обошел это, скопировав /lib/xterm/x/{xterm, xterm-256color} из Ubuntu 12.04. Существует переменная окружения с именем $TERM, в которой хранится этот файл. Затем я прочитал ваш ответ и попробовал CTRL+L, и это сработало. Мне стало любопытно, и я пытался понять, смогу ли я вставить CTRL+L в сценарий, и не получил нигде. Тогда я вспомнил, что Strace может дать мне то, что я хочу. Итак, я побежал strace clear и обнаружил, что пишет "\33[H\33[2J" для очистки экрана. Поэтому я написал печатную версию на python oneliner ("\33[H\33[2J"), поместил ее в файл и добавил ссылку с именем clear, чтобы указать на нее. Получил 2 обходных пути сейчас. Мне все еще интересно, как файлы terminfo могут быть прочитаны и изменены.
Еще раз спасибо.
У меня нет проблем с локальным запуском, но если я подключаюсь по ssh к другому хосту и
clearзапускается там, он уничтожает мою историю прокрутки, очень плохо; удаленная машина имеет слишком большой доступ IMO.
Я закончил редактировать исходный код консоли (21.12.1). Файл src/Vt102Emulation.cpp с этим:
========================
- case token_csi_ps('J', 3): clearHistory(); ломать;
- case token_csi_ps('J', 3) : /* ИГНОРИРОВАТЬ clearHistory(); */ ломать;
========================
Это заставляет консоль ничего не делать, если она видит строку \E[3J, которая мешает истории прокрутки.