Уничтожение и перемещение текста

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

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

Emacs хранит единый для всех буферов список уничтожений, так что вы можете уничтожить текст в одном буфере и восстановить его в другом.

Удаление и уничтожение

Большинство команд, которые стирают текст из буфера, сохраняют его в списке уничтожений, чтобы вы могли перенести или скопировать его в другие части буфера. Эти команды известны как команды уничтожения. Остальные команды, стирающие текст, не записывают его в список уничтожений; они известны как команды удаления. (Такое отличие делается только для стирания текста в буфере). Если вы уничтожили или удалили текст по ошибке, вы можете использовать команду C-x u (undo) для отмены изменений (смотрите раздел Отмена сделанных изменений).

Команды удаления включают C-d (delete-char) и DEL (delete-backward-char), которые удаляют только один знак за один раз, и те команды, которые удаляют только пробелы или ограничители новой строки. Команды, которые могут уничтожить существенное количество нетривиальных данных, обычно являются командами уничтожения. Имена команд и их описания используют слова `kill' и `delete', чтобы пояснять что они делают.

Удаление

C-d
Удалить следующий знак (delete-char).
DEL
Удалить предыдущий знак (delete-backward-char).
M-\
Удалить все пробелы и табуляцию вокруг точки (delete-horizontal-space).
M-SPC
Удалить пробелы и табуляцию вокруг точки, оставляя один пробел (just-one-space).
C-x C-o
Удалить пустые строки вокруг текущей строки (delete-blank-lines).
M-^
Объединить две строки, удаляя находящийся между ними ограничитель новой строки и любой отступ, следующий за ним (delete-indentation).

Самые основные команды удаления -- это C-d (delete-char) и DEL (delete-backward-char). C-d удаляет знак после точки, над которым находится курсор. Точка не передвигается. DEL удаляет знак перед курсором и передвигает точку назад. Ограничитель новой строки может быть удален точно также, как и любой другой знак в буфере. Удаление ограничителя новой строки объединяет две строки. Фактически C-d и DEL не всегда являются командами удаления; если им дать аргумент, они уничтожают, так как этим способом они могут стереть уже более одного знака.

Другие команды удаления -- это те, что удаляют только пробельные знаки: пробелы, табуляцию и ограничители новых строк. M-\ (delete-horizontal-space) удаляет все пробелы и символы табуляции перед и после точки. M-SPC (just-one-space) делает то же самое, но оставляет одиночный пробел после точки, независимо от количества пробелов, существовавших прежде (даже если оно было равно нулю).

C-x C-o (delete-blank-lines) уничтожает все пустые строки после текущей строки. Если текущая строка пустая, то также уничтожает все пустые строки, предшествующие текущей строке (оставляя одну пустую строку, текущую).

M-^ (delete-indentation) объединяет текущую строку и предшествующую ей, удаляя ограничитель новой строки и все окружающие пробелы, обычно оставляя одиночный пробел. Смотрите раздел Отступы.

Уничтожение строк

C-k
Уничтожить остаток строки, либо одну или несколько строк (kill-line).

Простейшей командой уничтожения является C-k. Если она даётся в начале строки, то уничтожает весь текст на строке, оставляя её пустой. Если команда дана на пустой строке, то уничтожает всю строку, включая ее ограничитель. Чтобы уничтожить непустую строку целиком, перейдите в её начало и нажмите C-k дважды.

В более общем виде, C-k уничтожает все от точки вплоть до конца строки, если это не происходит в конце строки. В этом случае она уничтожает ограничитель новой строки, следующий за строкой, таким образом происходит слияние следующей строки с текущей. При решении вопроса о том, какой случай применять, невидимые пробелы и табуляция в конце строки игнорируются, так, если точка выглядит стоящей в конце строки, вы можете быть уверены, что C-k уничтожит перевод строки.

Если C-k будет присвоен положительный аргумент, она уничтожит ровно столько строк вместе со следующими за ними ограничителями (однако, текст на текущей строке перед точкой сохраняется). С отрицательным аргументом -n она уничтожает n строк, предшествующих текущей (вместе с текстом на текущей строке перед точкой). Таким образом, C-u - 2 C-k в начале строки уничтожает две предыдущие строки.

C-k с аргументом, равным нулю, уничтожает текст перед точкой на текущей строке.

Если переменная kill-whole-line не равна nil, C-k в самом начале строки уничтожает всю эту строку, включая последующий перевод строки. Эта переменная обычно равна nil.

Другие команды уничтожения

C-w
Уничтожить область (от точки до метки) (kill-region).
M-d
Уничтожить слово (kill-word). Смотрите раздел Слова.
M-DEL
Уничтожить предыдущее слово (backward-kill-word).
C-x DEL
Уничтожить назад до начала предложения (backward-kill-sentence). Смотрите раздел Предложения.
M-k
Уничтожить до конца предложения (kill-sentence).
C-M-k
Уничтожить s-выражение (kill-sexp). Смотрите раздел Списки и s-выражения.
M-z знак
Уничтожить вплоть до следующего появления знака (zap-to-char).

C-w (kill-region) -- очень распространенная команда уничтожения, которая уничтожает все между точкой и меткой. С помощью этой команды вы можете уничтожить любую непрерывную последовательность знаков, если сначала установите метку в одном её конце и отправитесь в другой конец.

Удобный способ уничтожения -- это уничтожение скомбинированное с поиском: M-z (zap-to-char) считывает знак и уничтожает от точки вплоть до следующего появления этого знака (и включая его) в буфере. Числовой аргумент действует как счётчик повторов. Отрицательный аргумент означает поиск в обратную сторону и уничтожение текста перед точкой.

Могут уничтожаться другие синтаксические единицы: слова, с помощью M-DEL и M-d (смотрите раздел Слова); s-выражения, с помощью C-M-k (смотрите раздел Списки и s-выражения); и предложения, с помощью C-x DEL и M-k (смотрите раздел Предложения).

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

Восстановление

Восстановление возвращает обратно текст, который был ранее уничтожен. Это то же самое, что в других системах называется "вставкой". Обычный способ копирования или перемещения текста --- уничтожить его, а затем восстановить один или несколько раз.

C-y
Восстановить последний уничтоженный текст (yank).
M-y
Заменить только что восстановленный текст предшествующим куском уничтоженного текста (yank-pop).
M-w
Сохранить область как последний уничтоженный текст без фактического уничтожения (kill-ring-save).
C-M-w
Добавить следующее уничтожение к последнему куску уничтоженного текста (append-next-kill).

Список уничтожений

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

Команда C-y (yank) вновь вставляет текст, уничтоженный самым последним. Она оставляет курсор в конце текста, метка устанавливается в его начале. Смотрите раздел Пометка и область.

C-u C-y оставляет курсор перед текстом и устанавливает метку после него. Это происходит, только если аргумент задан с помощью просто C-u. Любой другой вид аргумента, включая C-u и цифры, обозначают восстановление уничтоженного ранее (смотрите раздел Восстановление ранее уничтоженного).

Если вы хотите скопировать блок текста, вы можете использовать M-w (kill-ring-save), которая копирует область в список уничтожений без удаления его из буфера. Это приблизительный эквивалент C-w, за которой следует C-x u, за исключением того, что M-w не изменяет историю восстановлений и не изменяет на время экран.

Добавление уничтожений

Обычно каждая команда уничтожения добавляет новый блок в список уничтожений. Однако, две или более команды уничтожения подряд объединяют текст в единый элемент, так что одиночная C-y возьмет весь его обратно таким, каким он был перед уничтожением.

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

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

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

с точкой, показанной как -!-. Если вы наберете M-d M-DEL M-d M-DEL, уничтожая по очереди вперёд и назад, то в конце получите `пример строки с образцом' в качестве одного вхождения в списке уничтожений и `Это текста.' в буфере. (Обратите внимание на двойной пробел, который вы можете очистить с помощью M-SPC или M-q.)

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

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

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

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

Для того чтобы вернуть уничтоженный текст, который уже не является последним уничтоженным, используйте команду 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.

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

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

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; она также принимает имя буфера как аргумент. Эта команда вставляет копию текста из буфера с заданным именем в выбранный буфер. Или вы можете выбрать другой буфер для редактирования, возможно, перемещая впоследствии текст из него путем уничтожения. Смотрите раздел Использование множества буферов, для получения базовой информации о буферах.

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

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

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

@hyphenation{пря-мо-уголь-ни-ка пря-мо-уголь-ник пря-мо-уголь-ни-ки пря-мо-уголь-ни-ков}

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

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

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

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 RET строка RET
Вставить строку в каждую строку области-прямоугольника (string-rectangle).

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

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

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

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

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

Прямоугольники также могут быть скопированы в регистры и из регистров с помощью C-x r r r и C-x r i r. Смотрите раздел Запись прямоугольников в регистры.

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

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

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

Назад |  Вперед |  Содержание



Распространение материалов сайта означает, что распространитель принял условия лицензионного соглашения.
Идея и реализация: © Владимир Довыденков и Анатолий Камынин,  2004-2024