Як скинути прокрутку в терміналі за допомогою команди оболонки?


41

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

Однак все це - це відсунути поточний вміст екрану назад на одну висоту екрана та скинути курсор / вхід у перший рядок. Значить, ви все ще можете прокрутити назад і побачити це.

Те, що ви також можете зробити, - скинути всю прокрутку, натиснувши + K(Command-K).

Після цього ви не можете прокрутити назад взагалі.

У певних ситуаціях (зокрема, перед запуском screenабо vim), я хотів би скинути прокрутку назад, перш ніж команда насправді виконає.

Чи є команда (як clear), реалізована в OS X, яка дозволяє мені це робити? Враховуючи існування pbcopyта pbpaste, я думаю, може існувати щось подібне, що дозволить мені це зробити.


Як говорить відповідь Кріс Сторінс у команді використання терміналу: clear && printf '\e[3J' (Ви вибрали неправильну відповідь як правильну відповідь!)
Кіборг

Відповіді:


57

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

ESC [Ps J

Параметр Значення параметра

0 Стерти з активного положення до кінця екрана
1 Стерти з початку екрана до активного положення
2 Стерти весь екран

Термінал ( і xterm ) додає:

3 Стерти прокрутку назад (також "Збережені лінії")

Зауважте, що це стирає лише прокрутку, а не екран. Це дозволяє стерти те чи інше, або і те, і інше, надіславши дві послідовності відходу.

Наприклад, ви можете очистити екран та прокрутку за допомогою наступної команди оболонки: clear && printf '\e[3J'

( clearКоманда шукає відповідну послідовність для очищення екрана для поточного терміналу, але послідовність втечі "стирання прокрутки" є власною і повинна бути жорстко закодована. Якщо ви помістите це в сценарій оболонки, який ви не знаєте напевно, коли-небудь запускатимуться лише з Terminal, ви повинні перевірити, що $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 Чому ви створюєте виконуваний файл замість того, щоб просто надрукувати послідовність виходу в stdout?
Кріс Пейдж

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! :)


Суть у тому, що я хотів би налаштувати щось у середовищі моєї оболонки, щоб, коли я запускаю команду (скажімо vim), оболонка виконує "скидання прокрутки" перед виконанням vim. Програмна, не інтерактивна.
Джейсон Салаз

1
@JasonSalaz Добре, не зрозумів, вибач. Для цього доданий код.
MattiSG

1
@JasonSalaz, якщо ця відповідь вирішила вашу проблему, не забудьте підтвердити її. Якщо цього не сталося, будь ласка, поверніться до нас у коментарях :) Пам'ятайте, користувачі з майбутнього будуть вам вдячні;)
MattiSG

Цей комікс про мене, знаєте. Я програму в Денвері, Колорадо. (Ні, не дуже, було б божевільно, якби це було.)
Джейсон Салаз

Це не працює для мене. Наскільки я можу сказати, це еквівалент набору тексту clear; тобто очищає екран, але я все ще можу прокрутити назад. Натискання Command Kпрацює нормально.
Zev Eisenberg

7

Ось код, який працює як для терміналу macOS, так і для iTerm2. Також не потрібно, щоб вікно було на передньому плані.

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

Як це працює

Це композиція з 3 послідовностей відходу ANSI , зокрема команд "Control Sequence Introducer" .

\033являє собою послідовність евакуації, яка жорстко кодує кодову точку символу, який він представляє. Ведучий 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 - Стерти на дисплеї", яка має форму CSI n J
    • nЗначення одно 2в даному випадку, яка викликає другий варіант: «Якщо п дорівнює 2, чіткий весь екран (і переміщує курсор до верхнього зліва на DOS ANSI.SYS).»
  2. CSI 3 J:
    • Це екземпляр команди "ED - Стерти на дисплеї", яка має форму CSI n J
    • nЗначення одно 3в даному випадку, яка викликає третій варіант: «Якщо п дорівнює 3, чіткий весь екран і видалити всі рядки , збережені в буфері прокрутки (ця функція була додана для XTerm і підтримується іншими термінальними додатками).»
  3. CSI 1 ; 1 H:
    • Це екземпляр команди "ED - Стерти на дисплеї", яка має форму 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 - видалити на дисплеї" (варіант 2), "ED - Стерти на дисплеї" (варіант 3), "CUP - Позиція курсору" (перехід на 1, 1)
Олександр - Відновіть Моніку
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.