Здесь важно отметить тег вопроса. Это поведение характерно для терминала GNOME и любых других эмуляторов терминала, созданных на основе libvte. Вы не увидите этого ни в Xterm, ни в Unicode RXVT, ни в эмуляторе терминала, встроенном в ядро Linux, ни в консоли FreeBSD.
В общем происходит вот что.
clear
просматривает terminfo/termcap и выдает соответствующие управляющие последовательности. E3
it, она сначала записывает ее. Это выдает управляющие последовательности для очистки буфера прокрутки. Это и история, стоящая за этим, подробно задокументированы в странице руководства Dickey ncurses для команды clear
. clear
для очистки видимого экрана. putty
определяет E3=\E[3J
, которая является управляющей последовательностью расширения Xterm. pcvtxx
консоли NetBSD является одной из многих, определяющих clear=\E[H\E[J
или что-то подобное.Это две обычные управляющие последовательности ECMA -48. H
(CUP )устанавливает курсор в исходное положение. 0
J
(ED 0 )или просто CSI J
стирает от текущей позиции курсора до конца экрана. 2
J
(ED 2 )стирает весь экран. 3
J
(ED 3 )стирает буфер прокрутки. Что касается терминала GNOME, в частности:
gnome
, но некоторые люди ошибочно оставляют его равным xterm
. gnome
terminfo не определяет возможность E3
, и на многих системах — до сих пор! - то же самое относится и к записи xterm
, поскольку она не просочилась из Dickey terminfo . Итак, clear
просто записывает содержимое возможности clear
. clear
для этих записей terminfo представляет собой управляющие последовательности для возврата курсора в исходное положение с последующим стиранием всего экрана. VteTerminalPrivate::seq_clear_screen()
функции . Вместо этого libvte прокручивает экран вниз на пустые строки всего экрана и перемещает позицию курсора на первую из этих пустых строк. Вот почему вы видите то, что видите. libvte не стирает весь экран, когда ему говорят. Скорее, он делает что-то, что имеет внешнее сходство с этим, до тех пор, пока вы не сделаете в точности то, что здесь сделал вопрошающий :прокрутите окно терминала назад, чтобы посмотреть на буфер прокрутки назад. Тогда разница очевидна.
На других эмуляторах терминала, таких как Xterm и Unicode RXVT,управляющая последовательность ED 2 действительно стирает экран, стирая каждую позицию на экране сверху вниз и не изменяя буфер прокрутки. Но в эмуляторах терминала libvte он просто подталкивает текущий экран вверх в буфер прокрутки и добавляет пустые строки на один экран. Предыдущее содержимое экрана не стирается, а перемещается в буфер обратной прокрутки.
И если вы запустите команду clear
дважды, она добавит два пустых строки на экране. Если ваш буфер обратной прокрутки достаточно велик, вы все еще можете найти исходное содержимое экрана, просто выше в буфере прокрутки.
У меня была похожая проблема со значком PyCharm.
Если вы создали свой собственный лаунчер для файла приложения(.desktop
в ~/.local/share/applications
), вам необходимо убедиться, что у вас установлен правильный атрибут StartupWMClass
.
Чтобы найти правильное значение, запустите приложение, затем откройте терминал и запустите xprop WM_CLASS
и щелкните окно приложения. Убедитесь, что значение из терминала соответствует StartupWMClass
в вашей программе запуска. Перезапустите приложение,и вы должны увидеть правильный значок.