Це трохи складне питання. Я спробую відповісти на ваші запитання по черзі, але спочатку загальний опис:
Буфер прокрутки реалізований емулятором терміналу (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
перемальовано текст зверху таким чином, що ваш термінал не очікував. Інші програми іноді заповнюють ваш буфер декількома копіями всього їх дисплея.