Уничтожение и перемещение  текста – ЧАСТЬ 2

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

Это пример строки ?с образцом текста.

с точкой, показанной как ?. Если вы наберете M-d M-hDELM-d M-hDELi, уничтожая по очереди вперед и назад, то в конце  получите  ‘пример строки с образцом’  в качестве одного вхождения в списке уничтожений и ‘Это   текста.’ в буфере. (Обратите внимание на двойной пробел, который вы можете очистить с помощью M-hSPCили M-q.)

Другой способ уничтожить  тот же текст — переместиться назад на два слова с помощью M-b M-b и уничтожить  все четыре слова вперед командой C-u M-d. Это дает такой же результат в буфере и в списке уничтожений.  M-f M-f C-u M-hDELi  уничтожает тот же текст, проходя все время назад; и опять результат будет тем же.  Текст в элементе списка уничтожений всегда имеет тот же порядок, что он имел в буфере до того, как вы его уничтожили.

Если команда уничтожения отделена от предыдущей другими командами (не просто числовым аргументом), то она начинает новый элемент в списке уничтожений.   Но вы можете  заставить эту команду уничтожения добавлять текст к предыдущему элементу, набрав перед ней команду C-M-w (append-next-kill).  C-M-w приказывает следующей команде,  если это команда уничтожения, добавить уничтоженный ею текст к последнему уничтоженному тексту вместо того, чтобы начинать новый элемент. С помощью  C-M-w вы можете уничтожить  несколько отдельных кусков текста и накопить их для дальнейшего восстановления в одном месте.

Команда уничтожения, следующая  после M-w, не добавляет  к тексту, который M-w ско-

пировала в список уничтожений.

9.2.3  Восстановление ранее уничтоженного

Для того  чтобы вернуть уничтоженный текст,  который уже  не  является последним уничтоженным, используйте команду M-y (yank-pop).  Она берет прежде восстановленный текст,  и заменяет  его текстом более  раннего уничтожения.   Так,  чтобы вернуть текст, предшествующий  последнему уничтоженному, сначала используйте C-y, чтобы восстановить последнее уничтожение, а затем M-y, чтобы заменить его предыдущим. M-y может использоваться только после C-y или другой M-y.

M-y можно понимать в терминах указателя на “последнее  восстановление”,  который указывает на элемент в списке уничтожения. Каждый раз, когда вы уничтожаете, указатель на “последнее восстановление” передвигается в последний созданный элемент в начале списка.  C-y восстанавливает элемент, на который ссылается указатель “последнего  восстановления”.  M-y двигает указатель на “последнее восстановление” к другому элементу, и текст в буфере соответственно  изменяется.  Достаточное количество команд M-y может переместить указатель к любому элементу в списке, таким образом, вы можете получить

любой элемент в буфере. Когда наконец указатель достигает последнего элемента списка,

следующая команда M-y снова помещает его на первый элемент.

M-y двигает указатель на “последнее восстановление” по списку, но это не меняет порядок элементов, которые всегда идут от самого последнего уничтожения до самого старого, которое еще хранится.

M-y может получить числовой аргумент, который говорит, на сколько элементов вперед продвинуть указатель на “последнее восстановление”.  Отрицательный аргумент двигает этот указатель по направлению к началу списка; от начала списка он двигает к последнему элементу и продолжает движение вперед оттуда.

Как только искомый текст помещен в буфер, вы можете прекратить запускать команды M-y, и текст останется там.  Это просто копия элемента списка уничтожения, поэтому редактирование его в буфере не изменяет  содержимое  этого списка. До тех пор, пока не делается новое уничтожение, указатель на “последнее восстановление” остается в том же самом месте в списке уничтожений, таким образом, повторение C-y восстановит  еще одну копию того же самого старого уничтожения.

Если вы знаете, сколько команд M-y необходимо набрать, чтобы найти интересующий вас текст,  вы можете  восстановить этот текст за один шаг, используя C-y с числовым аргументом.  C-y с аргументом восстанавливает текст,  записанный в списке уничтожения на заданное число элементов назад. Таким образом, C-u 2 C-y достает следующий за последним блок уничтоженного текста.  Это эквивалентно C-y M-y.  C-y c числовым аргументом начинает подсчет от указателя на “последнее восстановление” и устанавливает этот указатель на элемент, который эта команда восстанавливает.

Длина списка уничтожений управляется переменной  kill-ring-max;  не  может быть записано больше блоков текста, чем определено этой величиной.

Действительное  содержимое списка уничтожений хранится в переменной  kill-ring; вы можете  просмотреть все содержимое списка уничтожений с помощью команды C-h v kill-ring.

9.3  Накопление текста

Обычно мы копируем или переносим текст путем его уничтожения и восстановления, но существуют и другие способы, удобные для копирования одного блока текста во многие места или для копирования многих рассеянных блоков текста в одно место. Чтобы скопировать один блок во много мест, запишите его в регистр (см. Глава 10 [Регистры], с. 77). Здесь мы описываем команды для накопления разбросанных кусков текста в буфер или в файл.

M-x append-to-buffer

Добавить область в заданный  буфер после точки.

M-x prepend-to-buffer

Добавить область в заданный  буфер перед точкой.

M-x copy-to-buffer

Копировать область в заданный буфер, удаляя старое содержимое буфера.

M-x insert-buffer

Вставить содержимое заданного буфера в текущий буфер в точке.

M-x append-to-file

Добавить область в конец заданного файла.

Для накопления текста в буфере используется  M-x append-to-buffer.  Она считывает имя буфера, а затем вставляет в этот буфер копию области. Если буфер с таким именем не существует, то append-to-buffer создаст его.  Текст вставляется в то место в этом

буфере,  где  находится точка.   Если вы использовали  этот  буфер для редактирования,

скопированный текст вставляется в середину текста, где оказалась точка.

Точка  в этом буфере  остается в конце  копируемого текста, таким образом,  последовательное использование append-to-buffer накапливает текст в заданном  буфере в том же самом порядке, в котором части были скопированы. Строго говоря, append-to-buffer не всегда добавляет к тексту, уже  находящемуся в буфере — она добавляет, если точка находится в конце этого буфера. Однако, если append-to-buffer является единственной командой, которую вы используете  для изменения  буфера, точка  всегда расположена  в конце.

M-x prepend-to-buffer подобна append-to-buffer за исключением того, что точка в другом буфере остается перед скопированным  текстом, таким образом, последовательное применение этой команды добавляет текст в обратном порядке.  M-x copy-to-buffer действует так  же,  за исключением того, что любой существующий текст в другом буфере удаляется, так что в буфере остается  лишь вновь скопированный текст.

Чтобы  вернуть  накопленный текст  из  другого  буфера, используйте  команду  M-x insert-buffer;  она также принимает имя буфера как аргумент.  Эта команда вставляет копию текста из буфера с заданным именем в выбранный  буфер. Или вы можете выбрать другой буфер для редактирования, возможно, перемещая впоследствии  текст из него путем уничтожения.  См.  Глава 15 [Буферы], с. 135, для получения базовой информации  о буферах.

Вместо накопления текста внутри буфера Emacs вы можете добавить текст непосредственно в файл с помощью команды M-x append-to-file, которая использует имя файла в качестве аргумента.  Она добавляет текст области в конец заданного файла. Файл на диске изменяется сразу.

Вы должны использовать append-to-file  только с файлами, к которым вы не обращаетесь из Emacs.  Использование этой команды для файла,  к которому обратились из Emacs, может изменить файл без ведома Emacs,  что может привести к потере некоторых результатов вашего редактирования.

9.4  Прямоугольники

Команды для прямоугольников работают с прямоугольными областями текста: всеми знаками между  определенной парой столбцов в определенном диапазоне  строк.   Эти команды предназначены для уничтожения прямоугольников,  восстановления уничтоженных прямоугольников, их очистки, заполнения пробелами или текстом, или удаления. Команды для прямоугольников полезны для работы с текстом в многоколоночных форматах и для приведения текста к такому формату или извлечения из него.

Когда вам нужно задать прямоугольник для команды, которая будет с ним работать, вы делаете это, устанавливая метку в одном углу и точку  в противоположном. Прямоугольник, описанный таким образом, называется областьюпрямоугольником,  так как вы управляете им почти так же, как и областью. Но помните, что данная комбинация значений точки и метки может быть интерпретирована и как область, и как прямоугольник в зависимости от команды, которая их использует.

Если точка и метка находятся на одном столбце, то прямоугольник, который они ограничивают, пуст.  Если они находятся на одной строке, то прямоугольник имеет высоту в одну строку. Эта несимметричность между строками и столбцами происходит из того, что точка (и метка) располагается между двух столбцов, но внутри строки.

C-x r k       Уничтожить  текст области-прямоугольника,  сохраняя его содержимое в каче-

стве “последнего уничтоженного прямоугольника” (kill-rectangle).

C-x r d      Удалить текст области-прямоугольника (delete-rectangle).

C-x r y       Восстановить последний уничтоженный прямоугольник, помещая его верхний левый угол в точке (yank-rectangle).

C-x r o      Вставить   пустое  место,  заполняя  пространство   области-прямоугольника (open-rectangle).          Предыдущее    содержимое    области-прямоугольника выталкивается вправо.

M-x clear-rectangle

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

M-x delete-whitespace-rectangle

Удалить пробельные знаки в каждой строке заданного прямоугольника, начи-

ная с его самого левого столбца.

C-x r t строка hRETi

Вставить   строку   в   каждую    строку   области-прямоугольника  (stringrectangle).

Операции, работающие с прямоугольниками,  делятся на два класса: команды удаления и вставки прямоугольников и команды для пустых прямоугольников.

Существует два способа избавиться  от текста в прямоугольнике:  вы можете сбросить (удалить) его или записать его как “последний уничтоженный” прямоугольник. Для этого используются две команды C-x r d (delete-rectangle) и C-x r k (kill-rectangle).  В обоих случаях часть каждой строки, которая попала внутрь границ прямоугольника, удаляется, заставляя последующий текст в строке (если он существует) сдвигаться влево.

Заметьте,  что “уничтожение” прямоугольника не есть уничтожение в обычном понимании; этот прямоугольник хранится не в списке уничтожений, а в специальном  месте, которое в состоянии записать только самое последнее уничтожение прямоугольника. Это происходит из-за того, что восстановление прямоугольника настолько отличается от восстановления линейного текста, что для этого должны использоваться другие команды восстановления, и в этом случае трудно приписать смысл команде, выдающей  более ранние уничтожения.

Чтобы  вставить последний  уничтоженный  прямоугольник, наберите  C-x r y  (yankrectangle).   Восстановление  прямоугольника — это противоположность уничтожения. Левый верхний угол задается положением точки.  Туда помещается первая строка прямоугольника, вторая строка прямоугольника помещается в позиции точки, но строкой ниже, и так далее. Число затронутых строк определяется высотой записанного прямоугольника.

Вы можете превратить списки из одной колонки в списки из двух колонок, используя уничтожение и восстановление прямоугольников; уничтожьте вторую половину списка как прямоугольник и затем восстановите его рядом с первой строчкой списка. См. Раздел 30.9 [Two-Column], с. 336, другой способ редактировать  двухколоночный  текст.

Прямоугольники также могут быть скопированы в регистры и из регистров с помощью

C-x r r r и C-x r i r . См. Раздел 10.3 [Регистры для прямоугольников], с. 78.

Есть две команды для работы с пустыми прямоугольниками: M-x clear-rectangle, чтобы расписать пробелами  существующий текст,  и C-x r o (open-rectangle),  чтобы вставить пустой прямоугольник.  Очистка прямоугольника эквивалентна его удалению с последующей вставкой на его место пустого прямоугольника такого же размера.

Команда M-x delete-whitespace-rectangle удаляет горизонтальное пустое пространство, начиная с определенного столбца. Это относится к каждой строке в прямоугольнике, а столбец задается левым краем прямоугольника. Правый край прямоугольника не имеет значения для этой команды.

Команда C-x r t (M-x string-rectangle) замещает прямоугольник заданной строкой (вставляя ее один раз в каждую строку). Ширина строки не обязана совпадать  с шириной прямоугольника.  Если ширина строки меньше, текст после прямоугольника смещается влево; если строка шире прямоугольника, текст после него смещается вправо.

10 Регистры

Регистры Emacs — это места, куда вы можете записать текст или позиции для дальнейшего использования. Текст или прямоугольник, однажды записанный в регистр, может быть скопирован в буфер один или несколько раз; позицию, записанную в регистр, можно один или несколько раз использовать для передвижения к ней точки.

Каждый  регистр имеет имя, состоящее из одиночного знака. Регистр может хранить кусок текста, позицию, прямоугольник, конфигурацию окна или имя файла, но только чтото одно из перечисленного в каждый конкретный момент. Всякий раз, когда вы сохраняете что-то в регистре, оно остается там до тех пор, пока вы не поместите в этот регистр что-то еще. Чтобы узнать, что содержит регистр r, используйте M-x view-register.

M-x view-register hRETi r

Выдать описание того, что содержит регистр r.

10.1  Запись  позиций в регистры

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

C-x r hSPCi r

Записать положение точки в регистр r (point-to-register).

C-x r j r    Перейти в позицию, записанную в регистре r (jump-to-register).

Чтобы записать текущее положение точки в регистр, выберите имя r и наберите C-x r hSPCi r . Регистр r сохраняет записанное таким образом положение до тех пор, пока вы не запишете в этот регистр что-то другое.

Команда C-x j r передвигает точку  в позицию, записанную в регистре r.  Регистр не затрагивается, он продолжает хранить ту же самую позицию. Вы можете перейти в одну и ту же позицию, используя один и тот же регистр, любое число раз.

Если вы используете C-x r j для перехода к записанной позиции, но буфер, в котором она была записана, уже  уничтожен, C-x r j пытается снова создать буфер, обращаясь  к тому же файлу. Конечно, это работает только для буферов, которые обращались к файлам.

10.2  Запись  текста в регистры

Если вы захотите вставить копию одного и того же куска текста несколько раз, использование списка уничтожений может оказаться неудобным,  так  как  каждое последующее уничтожение сдвигает кусок текста все дальше  вглубь списка. Альтернативой этому методу является сохранение текста в регистре с последующим его восстановлением.

C-x r s r    Копировать область в регистр r (copy-to-register).

C-x r i r    Вставить текст из регистра r (insert-register).

C-x r s r записывает копию текста области в регистр с именем r. Запущенная с число-

вым аргументом, C-x r s r кроме того удаляет текст из буфера.

C-x r i r вставляет в буфер текст из регистра r. Обычно эта команда оставляет точку перед текстом, а метку располагает после него, но с числовым аргументом (C-u), наоборот, точку ставит после текста, а метку перед ним.

10.3  Запись  прямоугольников в регистры

Регистр может содержать вместо линейного текста прямоугольник.  Прямоугольники представляются в виде списка строк. См. Раздел 9.4 [Прямоугольники], с. 74, для получения основной информации по прямоугольникам и о том, как они определяются в буфере.

C-x r r r    Копирует область-прямоугольник в регистр r (copy-region-to-rectangle). С

числовым аргументом еще и удаляет его.

C-x r i r    Вставляет прямоугольник, который записан в регистре r (если тот содержит прямоугольник) (insert-register).

Команда C-x r i r вставляет строку текста, если регистр содержит строку, и вставляет прямоугольник, если регистр содержит прямоугольник.

Смотрите  также  команду sort-columns, которую можно рассматривать как команду сортировки прямоугольника. См. Раздел 30.7 [Сортировка], с. 333.

10.4  Запись  конфигурации окон в регистры

Вы можете записать в регистр конфигурацию окон в выбранном  фрейме или даже кон-

фигурацию  всех окон во всех фреймах и позднее восстановить  эту конфигурацию.

C-x r w r    Записать   состояние  окон   выбранного  фрейма    в   регистр   r    (windowconfiguration-to-register).

C-x r f r    Записать состояние всех фреймов, включая все их окна, в регистр  r  (frame configuration-to-register).

Используйте C-x r j r для восстановления конфигурации окон или фреймов. Это та же команда, что используется для восстановления позиции курсора. Когда вы восстанавливаете конфигурацию фреймов, все существующие  фреймы, не входящие в эту конфигурацию, становятся невидимыми. Если вы вместо этого хотите удалить эти фреймы, используйте C-u C-x r j r .

10.5  Хранение чисел  в регистрах

Существуют команды для записи числа в регистр, вставки его в буфер в десятичном виде и для увеличения этого числа. Эти команды могут быть полезны в макросах клавиатуры (см. Раздел 31.3 [Макросы клавиатуры], с. 353).

C-u число C-x r n рег

Записать число в регистр рег (number-to-register).

C-u число C-x r + рег

Увеличить число в регистре рег на заданное число (increment-register).

C-x r g рег

Вставить число из регистра рег в буфер.

C-x r g — это та же  команда, что  используется  для вставки в буфер содержимого регистров другого типа.

10.6  Запись  имен файлов в регистры

Если вы часто обращаетесь к определенным именам файлов, вам будет удобно поместить эти имена в регистры. Вот код на Лиспе, используемый для записи имени файла в регистр:

(set-register ?r  ’(file . имя))

Например,

(set-register ?z ’(file . "/gd/gnu/emacs/19.0/src/ChangeLog"))

помещает показанное имя файла в регистр ‘z’.

Чтобы обратиться к файлу, чье имя находится в регистре r, наберите C-x r j r .  (Это та же команда, что используется для перехода к записанной позиции или восстановления конфигурации фреймов.)

10.7  Закладки

Закладки отчасти похожи на регистры тем, что они записывают позиции, к которым вы можете перейти. В отличие от регистров, они имеют длинные имена и сохраняются автоматически от одного сеанса Emacs до другого.  Шаблонное  применение закладок — запись места “где вы читали” в различных файлах.

C-x r m hRETi

Заложить закладку в текущем файле в позиции точки.

C-x r m закладка hRETi

Заложить в точке закладку с именем закладка (bookmark-set).

C-x r b закладка hRETi

Перейти к закладке с именем закладка (bookmark-jump).

C-x r l   Перечислить  все закладки (list-bookmarks).

M-x bookmark-save

Сохранить все текущие значения закладок в файле закладок, используемом по умолчанию.

Как  правило закладки используются для записи одной текущей позиции в каждом из нескольких файлов. Таким образом, команда C-x r m, устанавливающая закладку, по умолчанию использует в качестве имени закладки имя файла, к которому вы обращаетесь в данный момент. Если вы называете каждую закладку по имени файла, на который она указывает, то сможете удобно повторно обратиться к любому из этих файлов с помощью C-x r b и в то же время переместиться к позиции закладки.

Чтобы отобразить список всех ваших закладок в отдельном  буфере, наберите C-x r l (list-bookmarks).  Если вы переключитесь в этот буфер,  вы сможете отредактировать определения закладок или дать им описания. Наберите в этом буфере C-h m для получения более подробных  сведений о специальных командах редактирования в нем.

Когда  вы уничтожаете  Emacs, он предложит вам сохранить значения закладок в вашем файле закладок по умолчанию, ‘~/.emacs.bmk’, если вы изменяли какие-либо из этих значений. Вы также можете сохранить закладки в любое время с помощью команды M-x bookmark-save. Команды, работающие с закладками, автоматически загружают ваш файл закладок по умолчанию. Благодаря этим сохранениям и загрузкам закладки переходят от одного сеанса Emacs к другому.

Если вы установите переменную bookmark-save-flag в значение 1, то каждая команда, устанавливающая закладку, также будет записывать ваши закладки; при этом вы не потеряете значения закладок, даже если Emacs останавливается аварийно.  (Это значение, если оно является числом, говорит, сколько изменений закладок проходит между сохранениями.)

Значения позиций в закладках сохраняются вместе с окружающим контекстом, так что bookmark-jump  может найти правильную позицию, даже  если файл был слегка изменен. Переменная bookmark-search-size говорит,  сколько знаков контекста по обе стороны от позиции закладки нужно записывать.

Вот несколько дополнительных команд для работы с закладками:

M-x bookmark-load hRETимяфайла hRETi

Загрузить файл с именем имяфайла, содержащий  список значений закладок. Вы можете  использовать эту  команду, как  и команду bookmark-write,  для работы с другими файлами закладок помимо вашего файла закладок по умолчанию.

M-x bookmark-write hRETимяфайла hRETi

Сохранить все текущие значения закладок в файле имяфайла.

M-x bookmark-delete  hRETзакладка hRETi

Удалить закладку с именем закладка.

M-x bookmark-insert-location hRETзакладка hRETi

Вставить в буфер имя файла, на который указывает закладка закладка.

M-x bookmark-insert hRETзакладка hRETi

Вставить в буфер содержимое  файла, на который указывает закладка заклад

ка.

Источник: Ричард Столмен, Руководство по GNU Emacs

Похожие посты:

Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий