Що саме буфер прокрутки та прокрутки?


23

Що таке "прокрутка" та "буфер прокрутки" в таких програмах, як bashі screen, і як вони відносяться до tty, запущених програм та stdin / stdout / stderr?

Ось єдине визначення "прокрутки", яке я знайшов поки що (у вікі архівану ):

Прокрутка - це функція, реалізована в текстовій консолі, щоб дозволити користувачеві повертатися назад для перегляду рядків тексту, які прокручуються з екрана. Це стає можливим завдяки буфері, створеному саме для цієї мети між відеоадаптером та пристроєм відображення; буфер прокрутки

Але це викликає у мене більше питань:

  • Чи означає це "функція", як у "підпрограмі" чи як у "функції"?
  • Чи існує стандарт Unix або API для цього буфера прокрутки?
  • У якій "стеці" програм, таких як vimзапущена в screenзапущена, в bashзапущена в sshзапущена в емуляторі терміналу, яка з цих програм керує буфером прокрутки?

Я також використовував screenдля скидання прокрутки у файл . У цьому файлі було багато білого простору вгорі, і, здається, "перегляд" мій емулятор терміналу показує, що я просто кілька нижніх рядків буфера.

  • Ось чому така програма, як, наприклад, vimможе "очистити" все моє вікно терміналу, оскільки вона отримує тимчасовий доступ до буфера прокрутки батьківської оболонки?
  • Або vimвикористовується власний буфер прокрутки, який якимось чином накладається поверх батьківського буфера прокрутки?

Відповіді:


28

Це трохи складне питання. Я спробую відповісти на ваші запитання по черзі, але спочатку загальний опис:

Буфер прокрутки реалізований емулятором терміналу (xterm , Konsole, термінал GNOME). Він містить весь текст, який відображається на екрані, включаючи як стандартний вихід, так і стандартну помилку від кожної програми, яку ви запускаєте в терміналі. Це повністю термінальна функціональність, щоб ви могли подивитися на минулий вихід, який, можливо, прокрутився повз вас, або перевірити, що щось було сказано раніше.

Ви можете вважати буфер прокрутки як довгу сторінку зареєстрованого виводу, а вікно вашого терміналу як вікно, яке в будь-який момент переглядає лише частину його. Якщо ви ще не прокрутили вгору, ви дивитесь на кінець буфера. Зазвичай в терміналі буде встановлено обмеження, скільки рядків він відстежує, перш ніж він почне забувати.

Припустимо, що межа - 1000 рядків. На першій тисячі рядків виводу в сеансі ви просто додаєте до буфера, і ви можете прокрутити праворуч до початку сеансу. Як тільки ви отримаєте 1001-й рядок виводу, перший рядок у буфері видаляється, а найдальша спинка, яку ви можете прокрутити, буде другою лінією вашого сеансу. Буфер завжди міститиме останні тисячі рядків виводу, які відображалися на вашому екрані, і ви можете прокрутити вгору, щоб переглянути будь-який попередній вихід у будь-який час.

  • Чи означає це "функція", як у "підпрограмі" чи як у "функції"?

    Це "функція", як в "функція". Емулятор терміналу має функціонал, який записує те, що на екрані, і дозволяє прокручувати його вгору та вниз. Консолі в деяких системах також підтримують обмежену прокрутку.

    Це стає трохи складніше, коли ви кидаєте screenв суміш. У цей момент screenвідбувається емуляція самого буфера прокрутки - саме тому ви можете скопіювати та вставити з нього всередині програми, а не лише з (скажімо) X виділення.

  • Чи існує стандарт Unix або API для цього буфера прокрутки?

    Коротка відповідь - ні, це просто надається вашим терміналом. Чим довше відповідь ми отримаємо внизу.

  • У "стеці" програм, таких як vim, запущений на екрані, запущений в bash, запущений в ssh, запущений в емуляторі терміналу, яка з цих програм керує буфером прокрутки?

    У разі vimі bashвони не контролюють його на всіх (застереженні, знову ж , нижче). Ваш термінал забезпечує буфер прокрутки для всіх програм всередині нього, починаючи з оболонки. screen, як було сказано вище, симулює прокрутку.

  • Я також використовував екран, щоб скинути прокрутку у файл. У цьому файлі було багато білого простору вгорі, і, здається, "перегляд" мій емулятор терміналу показує, що я просто кілька нижніх рядків буфера.

    Це screenвнутрішній буфер. Що на вашому екрані в цей час, як правило, буде те, що знаходиться в нижній частині буфера.

  • Ось чому така програма, як vim, може "очистити" все моє вікно терміналу, оскільки вона отримує тимчасовий доступ до буфера прокрутки батьківської оболонки?

    Ось одна частина, де вона стає набагато складнішою. Практично всі емулятори терміналів на базі X моделюють VT100, і одне, що вони там роблять, - це підтримка "альтернативного буфера екрана" . На відміну від звичайного буфера, який використовується для більшості термінальних взаємодій з послідовним виведенням, альтернативний буфер екрану - це саме точний розмір вашого терміналу. Немає прокручування вгору або вниз, тому що вона не більша за показ на екрані.

    Ідея полягає в тому, щоб дозволити повноекранному додатку робити те, що йому потрібно, не заважаючи нічого, що ви вже мали на екрані, а потім дозволити вам повернутися до саме того екрану, який ви мали раніше. Ось чому при введенні в vimнього заповнюється весь екран, але коли ви покинете його, тоді термінальний вихід, який ви мали раніше, - всі ваші минулі підказки та вихід команд - знову повертається. vimперемикається в альтернативний буфер екрану, коли він запускається, і повертається до звичайного буфера при виході.

    Цей альтернативний буфер є одним із застережень, про які я згадував вище. Іноді програма дійсно має можливість сказати терміналу, що робити з буфером.

    screenце ще одна програма, яка робить це, саме тому функція прокрутки вашого терміналу, як правило, не працює під час сеансу на екрані -  screenемулює сам буфер прокрутки, тому вам потрібно використовувати його внутрішню функціональність, щоб дістатися до старого виводу.

  • Або vim використовує власний буфер прокрутки, який якимось чином накладається поверх батьківського буфера прокрутки?

    Я здебільшого відповів на це в попередньому запитанні, але коротка відповідь на це питання полягає в тому, що vimвін отримує власний тимчасовий буфер, без зворотного прокрутки, з терміналу, а потім виконує всі власні прокрутки ваших документів внутрішньо.

Усі ці винятки, про які я згадав:

Знову стає трохи складніше. Я сказав, що програми не контролюють прокрутку, і це повністю забезпечується терміналом. У деяких випадках з деякими терміналами обмежена взаємодія. Програма виводить певні послідовності евакуації - якщо ви коли-небудь використовували фарбування терміналів вручну в минулому, ви побачили, як вони виглядають - і термінал може інтерпретувати їх і змінювати свою поведінку, або навіть надсилати назад інформацію в програму. Які послідовності виходу доступні, описано в базі даних termcap (термінальний потенціал) .

Деякі термінали підтримують обмежений запит та маніпулювання буфером прокрутки. Багато xtermпохідних мають послідовності втечі, які направляють термінал для прокрутки його подання. Багато терміналів також підтримують визначення конкретної області екрана для прокрутки, залишаючи всі інші недоторканими. Це має тенденцію до порушення буфера прокрутки.

Практично всі термінали підтримують послідовності переміщення курсору по екрану, саме так ncursesбібліотека здатна оновлювати всі різні частини дисплея. Ви можете подивитися послідовності VT100, які підтримуєxterm . Спосіб взаємодії з буфером прокрутки часом може бути дещо дивним, особливо у випадку чогось, що реалізує власну поведінку прокрутки, як-от lessкоманда. Ви можете скористатися дублюючими чи відсутніми рядками у вашій прокрутці, оскільки lessперемальовано текст зверху таким чином, що ваш термінал не очікував. Інші програми іноді заповнюють ваш буфер декількома копіями всього їх дисплея.


1
Дуже дякую за цю чудову відповідь! Це дуже повно і легко зрозуміти, незважаючи на складну тему. І додаткові деталі змушують мене дізнатися більше, і показують мені, де шукати.
Олег

1
У деяких терміналах є можливість необмеженої прокрутки, чи означає це, що весь прокрутка є оперативною пам’яттю (тож у якийсь момент ми отримаємо пошкодження малополосного доступу або OOM на терміналі), або він намагається записати на диск і завантажити з диска, як ви прокручування? Види подібних програм чату.
CMCDragonkai

Послідовності введення запитів, як правило, не містяться у терміні cap (також вони, як правило, не в terminfo, що було б більш повним).
Томас Дікі

@CMCDragonkai Konsole зберігає обмежену прокрутку пам’яті, але немірно зашифровує прокрутку на диску; про це ви попередили в діалоговому вікні налаштувань. VTE (gnome-terminal та інші) зберігає прокрутку (скінченну чи нескінченну) на диску, стиснуту та зашифровану. Я не знаю, що роблять інші емулятори.
Егмонт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.