Використання безлічі буферів

Текст, який ви редагуєте в Emacs, знаходиться в обєкті, званому буфером Кожен раз, коли ви звертаєтеся до файлу, для зберігання його тексту створюється буфер Кожен раз, коли ви запускаєте Dired, створюється буфер, що містить список каталогу Якщо ви посилаєте повідомлення за допомогою Cx m, то для тексту цього повідомлення використовується буфер з імям * mail *. Коли ви запитуєте документацію команди, вона зявиться в буфері з імям * Help *.

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

Коли Emacs створює безліч вікон, кожне вікно має свій обраний буфер, але в будь-який момент часу тільки одне з вікон є обраним, і його буфер – це обраний буфер Рядок режиму кожного вікна показує імя буфера, який в ньому відображений (див Глава 16 [Вікна], с 141)

У кожного буфера є імя, яке може бути довільної довжини, і ви можете вибрати будь-який буфер по імені Більшість буферів створюються при зверненні до файлів, і їхні імена виробляються з імені файлу Але ви можете також створити порожній буфер з будь-яким імям, яким захочете Тільки що запущений Emacs несе один буфер з імям

‘* Scratch *, який може бути використаний для обчислення виразів Лиспа в Emacs

В іменах буферів має значення відмінність між верхнім і нижнім регістрами

Кожен буфер записує окремо, до якому файлу він звертається, змінений чи він, і які основний та другорядні режими в ньому діють (див Глава 19 [Основні режими], с 175) Будь-яка змінна Emacs може бути зроблена локальної для конкретного буфера мається на увазі, що її значення в цьому буфері може відрізнятися від її значення в інших буферах Див Розділ 3124 [Локальні змінні], с 350

151  Створення і вибір буферів

C-x b буфер hRETi

Вибрати або створити буфер з імям буфер (switch-to-buffer)

C-x 4 b буфер hRETi

Аналогічно, але вибирає буфер в іншому вікні (switch-to-buffer-otherwindow)

C-x 5 b буфер hRETi

Аналогічно, але вибирає буфер в іншому фреймі (switch-to-buffer-otherframe)

Щоб вибрати буфер з імям імябуфера, наберіть C-x b імябуфера hRETi Це запустить команду switch-to-buffer з аргументом імябуфера Ви можете застосувати завершення скороченого імені бажаного буфера (див Розділ 53 [Завершення], с 47) Порожній аргумент для Cx b задає останній обраний буфер, який не відображено ні в одному вікні

Більшість буферів створюються при зверненні до файлів або ж командами Emacs, які хочуть показати деякий текст, але ви також можете явно створити буфер, набравши Cx b імябуфера hRETi Ця команда створює новий, порожній буфер, що не обращется ні до якого файлу, і вибере його для редагування Такі буфери створюються для нотаток Якщо ви спробуєте зберегти цей буфер, то у вас запитають імя файлу для запису Основний режим в новому буфері визначається значенням змінної defaultmajor-mode (див Глава 19 [Основні режими], с 175)

Відзначимо, що Cx Cf і будь-яка інша команда для звернення до файлу також можуть використовуватися для перемикання до існуючого буферу, обращающемуся до файлу Див Розділ 142 [Звернення], с 106

Emacs використовує буфери, що починаються з пробілу, для внутрішніх цілей Частково він звертається з буферами з такими іменами особливим чином – наприклад, за замовчуванням в них не записується інформація для скасування змін Вам краще уникати використання таких імен для буферів

152  Перерахування існуючих буферів

Cx Cb Перераховує існуючі буфери (list-buffers)

Щоб надрукувати список всіх існуючих буферів, наберіть Cx Cb Кожен рядок у списку показує імя одного буфера, його основний режим і файл, до якого він звертається Буфери перераховуються в тому порядку, в якому вони були поточними буфери, які були поточними недавно, йдуть першими

Знак * на початку рядка вказує, що буфер модифікований. Якщо модифіковані кілька буферів, то може бути пора записати деякі з них за допомогою Cx s (див Розділ 143 [Збереження], с 108) Знаком % позначаються буфери, доступні тільки для читання Знак .’ Відзначає обраний буфер Ось приклад переліку буферів:

MR  Buffer

Size    Mode

File

—-

— —

*  emacstex

383402 Texinfo

/u2/emacs/man/emacstex

*Help*

1287

Fundamental

filesel

23076

Emacs-Lisp

/u2/emacs/lisp/filesel

%

RMAIL

64042

RMAIL

/u/rms/RMAIL

*%

man

747

Dired

/u2/emacs/man/

netemacs           343885 Fundamental      /u/rms/netemacs

fileioc

27691

C

/u2/emacs/src/fileioc

NEWS

67340

Text

/u2/emacs/etc/NEWS

*scratch*

0   Lisp

Interaction

Відзначимо, що буфер * Help * створюється при запиті довідки, і це не є зверненням

до якого-небудь файлу Буфер man був створений Dired для каталогу / u2/emacs/man /.

153  Різноманітні операції над буфером

Cx Cq Переключити доступ на запис у буфер (vc-toggle-read-only)

M-x rename-buffer hRETімя hRETi

Змінити імя поточного буфера

M-x rename-uniquely

Перейменувати буфер додаванням <числа>‘ в кінець імені

M-x view-buffer hRETбуфер hRETi

Переглянути буфер

Буфер може бути доступний тільки для читання, що означає, що команди для зміни його вмісту не дозволені Рядок режиму вказує на те, що буфер доступний тільки для читання, знаками %% або % * Біля лівого краю Буфери тільки для читання зазвичай створюються підсистемами начебто Dired і Rmail, які мають спеціальні команди для дій над текстом буфер тільки для читання створюється також, якщо ви звертаєтеся до файлу, для якого у вас немає доступу на запис

Якщо ви хочете зробити зміни в буфері, призначеному тільки для читання, використовуйте команду Cx Cq (vc-toggle-read-only) Вона робить буфер, доступний тільки для читання, доступним для запису, а буфер, доступний для запису – доступним тільки для читання У більшості випадків ця команда працює, встановлюючи змінну buffer-read-only, яка має локальне значення в кожному буфері і робить буфер закритим для запису, якщо її значення не nil Якщо цей файл супроводжується з контролем версій, то Cx Cq працює через систему управління версіями і змінює стану доступу на запис як для файлу, так і для буфера Див Розділ 147 [Управління версіями], с 116

Mx rename-buffer змінює імя поточного буфера Нове імя задається як аргумент мінібуфера Значення за замовчуванням немає Якщо ви напишете імя, яке використовується для якогось іншого буфера, то відбувається помилка, і перейменування не робиться

Mx rename-uniquely перейменовує поточний буфер в схоже імя з доданим числовим закінченням і робить це імя одночасно унікальним і відмінним від інших Цій команді не потрібен аргумент Вона корисна для створення декількох буферів з оболонкою: якщо ви можете перейменувати буфер * Shell * і знову зробите Mx shell, то створиться новий буфер оболонки з імям * Shell *; тим часом старий буфер оболонки продовжує існувати під своїм новим імям Цей метод також корисний для буферів поштових повідомлень, буферів компіляції і більшості програм в Emacs, які створюють спеціальні буфери з конкретними іменами

Mx view-buffer дуже схожа на Mx view-file (див Розділ 1410 [Файли Різне], с 132), за винятком того, що вона показує вже існуючий буфер Emacs Режим View передбачає команди для зручної прокрутки буфера, але не для його зміни Коли ви виходите з режиму View за допомогою q, ви перемикаєтеся назад до того буферу (і позиції), який перш відображався в цьому вікні Або ви можете вийти з режиму View за допомогою e, в результаті після прочитання збережуться буфер і значення точки

Команди Mx append-to-buffer and Mx insert-buffer можна використовувати для копі-

вання тексту з одного буфера в інший Див Розділ 93 [Накопичення тексту], с 73

154  Знищення буферів

Якщо ви продовжуєте роботу в Emacs досить довго, ви можете накопичити велику кількість буферів Тоді ви можете порахувати зручним знищити ті з них, в яких ви більше не потребуєте У більшості операційних систем знищення буфера звільняє займане ним простір, так що його зможуть використовувати інші процеси Ось кілька команд для знищення буферів:

C-x k імябуфера hRETi

Знищує буфер імябуфера (kill-buffer)

M-x kill-some-buffers

Пропонує знищити кожен буфер один за іншим

Cx k (kill-buffer) знищує один буфер, чиє імя задано в мінібуфер За замовчуванням, якщо ви наберете в мінібуфер просто hRETi, Знищиться поточний буфер Якщо знищується поточний буфер, то обраним стає іншою буфер – той, який вибрали недавно, але зараз його не видно ні в одному вікні Якщо ви попросили знищити буфер, який звертається до файлу і був модифікований (містить збережені зміни), тоді вас запитають про підтвердження з yes перед тим, як буфер буде знищений

Команда Mx kill-some-buffers запитує про кожного буфері, один за іншим Відповідь y означає знищити буфер Знищення поточного буфера або буфера, що містить незаписані зміни, вибирає новий буфер або вимагає такого ж підтвердження, як і kill-buffer

Меню буферів (див Розділ 155 [Кілька буферів], с 138) також надає удоб-

ний спосіб знищення різних буферів

Якщо ви хочете робити щось особливе кожного разу, коли знищується буфер, ви можете додати свої функції в пастку kill-buffer-hook (див Розділ 3123 [Пастки], с 349)

Якщо ви продовжуєте один сеанс Emacs в перебігу багатьох днів, як роблять багато, він може наповнитися буферами, які ви використовували кілька днів тому Команда Mx clean-buffer-list – це зручний спосіб очистити їх вона знищує все незмінені буфери, які ви не використовували довгий час Звичайні буфери знищуються, якщо вони не відображалися на протязі трьох днів однак, ви можете вказати певні буфери, які ніколи не повинні знищуватися автоматично, та інші, які потрібно знищувати, якщо їх не використовували хоча б годину

Ви також можете зробити так, щоб ці буфери очищалися для вас самі щодня опівночі, включивши режим Midnight Режим Midnight працює щодня опівночі в цей час він запускає clean-buffer-list або інші функції, які ви помістіть в звичайну пастку midnight-hook (див Розділ 3123 [Пастки], с 349)

Щоб включити режим Midnight, використовуйте буфер Customization для установки пе-

пасової midnight-mode в значення t Див Розділ 3122 [Проста настройка], с 344

155  Дії над декількома буферами

Меню буферів схоже на Dired для буферів. Воно дозволяє вам запитувати дії для різних буферів Emacs за допомогою редагування буфера, що містить їх список Ви можете зберігати буфери, знищувати їх (тут це називається видаленням для узгодження з Dired) або показувати їх

M-x buffer-menu

Почати редагування буфера, що містить список всіх буферів Emacs

Команда buffer-menu записує список всіх буферів Emacs в буфер з імям * Buffer List * і вибирає цей буфер в режимі Buffer Menu Цей буфер призначений тільки для читання і може бути змінений тільки за допомогою спеціальних команд, описаних в цьому розділі У буфері * Buffer List * можуть використовуватися звичайні команди Emacs для руху курсора Наступні спеціальні команди застосовуються до буферу, описаному в поточному рядку:

d Запросити видалення (знищення) буфера, і потім зрушити вниз Запит показується як D на рядку перед імям буфера Витребувані видалення відбуваються, коли ви друкуєте команду x

Cd Як d, але зрушує вгору, а не вниз

s Запросити збереження буфера Запит показується як S на рядку Необхідні збереження відбуваються, коли використовується команда x Ви можете запросити і запис, і видалення для одного і того ж буфера

x Виконати раніше запитані видалення та збереження

u Знищити будь-який запит, зроблений для поточного рядка, і зрушити курсор вниз

hDELi              Зрушити курсор до попереднього рядка і знищити будь-який запит, зроблений для цього рядка

Команди d, Cd, s і u для додавання або скидання прапорів також переміщують вниз (або вгору) на один рядок Вони приймають числовий аргумент як лічильник повторів

Ці команди діють відразу на буфер, перерахований в поточному рядку:

~ Помітити буфер як незмінений. Команда ~ робить це негайно після того, як ви її ввели

% Перемикає прапор доступності на запис для буфера Команда% діє відразу після введення

t Звернутися до буферу як до таблиці тегів Див Розділ 22133 [Вибір таблиці тегів], с 228

Є також команди для вибору іншого буфера або декількох буферів:

q Вийти з меню буферів – відразу відобразити останній буфер, колишній перш видимим на його місці

hRETi

f Негайно вибрати буфер на цьому рядку на місце буфера * Buffer List *.

o Негайно вибрати буфер на цьому рядку в іншому вікні, як якщо б це було зроблено за допомогою Cx 4 b, залишаючи * Buffer List * видимим

Co Негайно відобразити буфер на цьому рядку в іншому вікні, але не вибирати це вікно

1 Негайно вибрати буфер на цьому рядку в повноекранному вікні

2 Негайно створити два вікна, одне з буфером на цьому рядку, а другий з пре-

дидущей обраним буфером (крім буфера * Buffer List *)

b Сховати буфер, перерахований в поточному рядку

m Помітити цей буфер для показу в іншому вікні, якщо ви вийдіть за допомогою команди q Такий запит показується як > на початку рядка (Один і той же буфер не може мати і запит на показ, і запит на видалення)

v Негайно вибрати буфер на цьому рядку, а також показати в інших вікнах будь буфери, перш помічені за допомогою команди m Якщо таких буферів немає, то ця команда еквівалентна 1

Все, що buffer-menu робить безпосередньо, – це створює і вибирає відповідний буфер і включає режим Buffer Menu Все інше з описаного вище здійснюється за допомогою спеціальних команд, що надаються в режимі Buffer Menu Одним з наслідків цього є те, що ви можете переключитися з буфера * Buffer List * в інший буфер Emacs і редагувати там Ви можете вибрати заново буфер * Buffer List * пізніше, щоб виконати вже запитані дії, або ви можете знищити його або більше не звертати на нього уваги

Існує тільки одна різниця між buffer-menu і list-buffers – це те, що buffer-menu вибирає буфер * Buffer List * в поточному вікні, а list-buffers відображає його в іншому вікні Якщо ви запускаєте list-buffers (це відбувається при наборі Cx Cb) і вибираєте список буферів вручну, то ви можете використовувати всі описані тут команди

Буфер * Buffer List * не оновлюється автоматично, коли створюються або знищуються буфери його вміст – це просто текст Якщо ви створювали, видаляли або перейменовували буфери, ви можете оновити * Buffer List *, щоб він показував те, що ви зробили, надрукувавши g (revert-buffer) або повторивши команду buffer-menu

156  Непрямі буфери

Непрямий буфер поділяє текст з якимось іншим буфером, званим базовим буфером непрямого буфера Це свого роду аналог символьних посилань на файли, але для буферів

M-x make-indirect-buffer базовийбуфер hRETнепрямеімя hRETi

Створює непрямий буфер з імям непрямеімя, чий базовий буфер – це

базовийбуфер

Текст в непрямому буфері завжди ідентичний тексту його базового буфера зміни, зроблені в одному, відразу ж стають видні в іншому Але в усьому іншому непрямий буфер і його базовий буфер абсолютно різні У них різні імена, різні значення точки, різне звуження, різні позначки, різні основні режими і різні локальні змінні

Непрямі буфери не можуть звертатися до файлів, але їх базові буфери можуть Якщо ви намагаєтеся записати непрямий буфер, це насправді працює як запис базового буфера Знищення базового буфера знищує непрямий буфер, але знищення непрямого буфера не впливає на базовий буфер

Один із способів застосування непрямих буферів – відображення декількох різних видів схеми тексту Див Розділ 2184 [Кілька видів для Outline], с 193

Джерело: Річард Столмен, Керівництво по GNU Emacs

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*