Как сбросить прокрутку в терминале с помощью команды оболочки?

41

При использовании Terminal.app вы можете очистить экран, используя встроенную оболочку clearили нажав ^+ L(Control-L).

Однако все, что это делает, это сдвигает текущее содержимое экрана на одну высоту экрана и сбрасывает курсор / ввод в первой строке. Это означает, что вы все еще можете прокрутить назад и увидеть это.

То, что вы также можете сделать, это сбросить весь прокрутку нажатием + K(Command-K).

После того, как вы сделали это, вы не можете прокрутить назад вообще.

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

Есть команда (как clear), которая реализована в OS X, которая позволяет мне сделать это? Учитывая существование pbcopyи pbpaste, я думаю, может существовать нечто подобное, что позволит мне сделать это.

Джейсон Салаз
источник
Как говорит Крис Пейдж, в Терминале используйте команду: clear && printf '\e[3J' (Вы выбрали неправильный ответ как правильный ответ!)
Киборг

Ответы:

57

Терминал поддерживает расширение escape-последовательности ED (Erase in Display) для удаления обратной прокрутки. Это также поддерживается xterm. Команда ED, описанная в руководстве по VT100 , принимает эти значения для параметра Ps:

ESC [Ps J

Параметр Параметр Значение

0 Стереть с активной позиции до конца экрана
1 Стереть с начала экрана в активную позицию
2 Стереть весь дисплей

Терминал ( и xterm ) добавляет:

3 Сотрите прокрутку назад (она же «Сохраненные линии»)

Обратите внимание, что при этом стирается только прокрутка назад, а не экран. Это позволяет вам стереть один или другой, или оба, отправив две escape-последовательности.

Например, вы можете очистить экран и прокрутку с помощью следующей команды оболочки: clear && printf '\e[3J'

(Команда clearищет соответствующую последовательность для очистки экрана для текущего терминала, но escape-последовательность «erase scroll-back» является пользовательской и должна быть жестко запрограммирована. Если вы поместите это в сценарий оболочки, который вы не знаете наверняка будет только когда - либо будет работать с терминалом, вы должны проверить , что $TERM_PROGRAMэто Apple_Terminalперед его отправкой.)

Крис Пейдж
источник
4
Это намного быстрее, чем osascript!
Сергей
3
Это гораздо лучший ответ. Итак, чтобы сделать это постоянным, добавьте в ваш ~ / .bash_profile: alias clear="clear && printf '\e[3J'"
Том
1
Я поместил этот сценарий в свой ПУТЬ:echo $'#!/usr/bin/env bash\n/usr/bin/clear\nprintf \'\\e[3J\'' >clr; chmod +x clr
Уокер Хейл IV
2
@WalkerHaleIV Почему вы создаете исполняемый файл, а не просто печатаете escape-последовательность на стандартный вывод?
Крис Пейдж
1
$ TERM_APPLICATION должно быть $ TERM_PROGRAM
pbatey
30

⌘K, ярлык «Вид> Очистить прокрутку».

ОБНОВЛЕНИЕ : Это может быть автоматизировано с AppleScript следующей командой:

osascript -e 'tell application "System Events" to keystroke "k" using command down'

... что вы можете, конечно, aliasна что угодно, или сохранить в функции в вашем ~/.profileскрипте входа в систему :)

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

if application "Terminal" is frontmost

... который дает нам следующий код:

osascript -e 'if application "Terminal" is frontmost then tell application "System Events" to keystroke "k" using command down'

... который, в свою очередь, должным образом избежал и aliasиздал, заканчивается:

alias clear="osascript -e 'if application \"Terminal\" is frontmost then tell application \"System Events\" to keystroke \"k\" using command down'"

А вот и твой новый clear! :)

MattiSG
источник
Суть в том, что я хотел бы настроить что-то в среде моей оболочки, чтобы при запуске команды (скажем vim) оболочка выполняла «сброс с прокруткой» перед выполнением vim. Программный, не интерактивный.
Джейсон Салаз
1
@JasonSalaz Хорошо, не понял, извини. Добавлен код для этого.
MattiSG
1
@JasonSalaz, если этот ответ решил вашу проблему, пожалуйста, не забудьте проверить ее. Если этого не произошло, пожалуйста, свяжитесь с нами в комментариях :) Помните, что пользователи из будущего будут вам благодарны;)
MattiSG
Знаешь, этот комикс обо мне. Я занимаюсь программированием в Денвере, Колорадо. (Нет, не совсем, было бы безумно, если бы это было так.)
Джейсон Салаз
Это не работает для меня. Насколько я могу судить, это эквивалентно печатанию clear; то есть он очищает экран, но я все еще могу прокрутить назад. Удар Command Kработает нормально.
Зев Айзенберг
7

Вот код, который работает как для терминала MacOS, так и для iTerm2. Ему также не нужно окно, чтобы быть на переднем плане.

printf '\033[2J\033[3J\033[1;1H'

Как это работает

Это состав из 3 escape-последовательностей ANSI , в частности, команд "Control Sequence Introducer" .

\033это escape-последовательность, которая жестко кодирует кодовую точку для символа, который она представляет. Ведущий 0указывает, что остальная часть последовательности кодирует восьмеричное значение, в данном случае, 33восьмеричное. Десятичное значение этого 27( 3 * 8^1 + 3 * 8^0= 3 * 8 + 3= 24 + 3= 27). В ASCII кодовой точкой 27является символ «ESC» (escape).

CSIКоманды начинаются с ESC [, иначе \033[. Зная это, мы можем разбить строку на 3 части.

  1. CSI 2 J
    • Это экземпляр команды «ED - Erase in Display», который имеет вид CSI n J
    • В этом случае nзначение устанавливается на 2, что вызывает второй вариант: «Если n равно 2, очистить весь экран (и переместить курсор в верхний левый угол в DOS ANSI.SYS)».
  2. CSI 3 J:
    • Это экземпляр команды «ED - Erase in Display», который имеет вид CSI n J
    • В этом случае nзначение устанавливается равным 3третьему варианту: «Если n равно 3, очистите весь экран и удалите все строки, сохраненные в буфере прокрутки (эта функция была добавлена ​​для xterm и поддерживается другими терминальными приложениями)».
  3. CSI 1 ; 1 H:
    • Это экземпляр команды «ED - Erase in Display», который имеет вид CSI n ; m H

      Перемещает курсор в строку n, столбец m. Значения основаны на 1, и по умолчанию 1 (верхний левый угол), если не указано. Последовательность, такая как CSI ;5Hявляется синонимом, CSI 1;5Hа также CSI 17;Hтакая же, как CSI 17H иCSI 17;1H

    • nИ mзначения оба установлены на 1, что означает эта команда перемещает курсор в верхнем углу крайний левый.
Александр - Восстановить Монику
источник
Могу я спросить, откуда ты это взял? +1 от меня - все равно работает
rbrtl
1
Я не помню, но это их состав: en.wikipedia.org/wiki/ANSI_escape_code
Александр - Восстановить Монику
1
Похоже, что это " CSI n J" (где n = 2) + " CSI n J" (где n = 3) + " CSI n ; m H" (где n, m = 1, 1), что переводится как: "ED - Erase in Display" (вариант 2), «ED - Стереть на дисплее» (вариант 3), «CUP - Положение курсора» (перемещение на 1, 1)
Александр - Восстановить Монику