Существует множество команд Emacs, которые работают с произвольной непрерывной частью текущего буфера. Чтобы задать текст, над которым работают такие команды, вы устанавливаете метку в одном конце этого текста, и передвигаете точку в другой его конец. Текст, расположенный между точкой и меткой, называется областью. Если вы задействовали режим Transient Mark, Emacs выделяет область цветом (смотрите раздел Режим Transient Mark).
Чтобы регулировать границы области, вы можете двигать точку или метку. Не имеет значения, которая из них установлена первой в хронологическом порядке, или какая появляется первой в тексте. Как только метка установлена, она остается до тех пор, пока не будет установлена снова в другом месте. Каждый буфер имеет свою собственную метку, таким образом, когда вы возвращаетесь в буфер, который выбирался прежде, он сохраняет ту же самую метку, что и прежде.
Многие команды, которые вставляют текст, например C-y
(yank
) и M-x insert-buffer, располагают метку в одном из
концов вставленного текста, противоположном тому, где помещается точка,
таким образом, область содержит только что вставленный текст.
Помимо ограничения области, пометка также полезна для запоминания места, к которому вы, возможно, захотите вернуться. Чтобы сделать эту возможность более полезной, Emacs запоминает 16 предыдущих позиций метки в списке пометок.
Здесь приводятся некоторые команды для установки метки:
set-mark-command
).
exchange-point-and-mark
).
mouse-save-then-kill
).
Например, если вы хотите преобразовать часть буфера так, чтобы он весь
был набран прописными буквами, вы можете использовать команду C-x
C-u (upcase-region
), которая оперирует с текстом в области. Вы
можете сначала отправится в начало текста, который должен быть написан
прописными буквами, набрать C-SPC, чтобы установить там
метку, передвинуться в конец текста и затем набрать C-x C-u. Либо
вы можете установить метку в конце текста, сдвинуться в начало и затем
набрать C-x C-u.
Наиболее общий способ установки метки -- делать это с помощью команды
C-SPC (set-mark-command
). Так устанавливается
пометка в позиции точки. Затем вы можете отодвинуть точку, оставляя
метку на месте.
Есть два способа установить метку с помощью мыши. Вы можете провести мышью с нажатой первой кнопкой по отрезку текста; это поместит точку там, где вы отпустили кнопку мыши, и установит метку на другом конце этого отрезка. Или вы можете щелкнуть третьей кнопкой мыши, что устанавливает метку в точке (как C-SPC) и затем перемещает точку (как Mouse-1). Оба этих способа помимо установки метки копируют область в список уничтожений; такое поведение соответствует поведению других оконных приложений, но если вы не хотите изменять список уничтожений, вы должны использовать для установки метки команды клавиатуры. Смотрите раздел Команды мыши для редактирования.
На обычных терминалах есть только один курсор, так что Emacs не может
показать вам местонахождение метки. Вы должны его помнить. Обычный
выход из ситуации -- установить метку, а затем быстро ее использовать
до того, как вы забудете, где она расположена. Но вы можете увидеть
позицию метки с помощью команды C-x C-x
(exchange-point-and-mark
), которая устанавливает метку туда, где
была точка, а точку туда, где была метка. Положение области остается
неизменным, а курсор и точка находятся теперь в предыдущей позиции
метки. В режиме Transient Mark эта команда активизирует пометку.
C-x C-x также полезна, когда вы удовлетворены положением точки, но хотите передвинуть другой конец области (где находится метка); сделайте C-x C-x для того, чтобы установить точку на место метки, и затем вы можете двигать метку. Используя C-x C-x во второй раз, если это необходимо, вы установите метку в новой позиции, а точку вернете в ее прежнюю позицию.
В ASCII не существует знака C-SPC; когда вы набираете
SPC, удерживая CTRL в нажатом положении, на большинстве
обычных терминалов вы получите знак C-@. Это и есть ключ,
фактически привязанный к set-mark-command
. Но если вы не
настолько неудачливы, чтобы получить терминал, где набирая
C-SPC, вы не получаете C-@, вы можете думать об этом
знаке как о C-SPC. Под X, C-SPC на самом деле
является отдельным знаком, но привязан он все равно к
set-mark-command
.
Emacs может подсвечивать текущую область, используя X Windows. Но обычно он этого не делает. Почему?
Подсветка области обычно не работает в Emacs хорошо, потому что как только вы поставили метку, всегда есть область (в этом буфере). А постоянная подсветка области раздражала бы.
Вы можете включить подсветку помеченной области, задействовав режим Transient Mark. Это более жесткий режим действий, в котором область "существует" только временно, так что вы должны задавать область для каждой команды, которая ее использует. В режиме Transient Mark большую часть времени области нет; таким образом, подсветка области, когда она существует, удобна.
Чтобы включить режим Transient Mark, выполните команду M-x transient-mark-mode. Эта команда переключает данный режим, а значит вы можете повторить ее для выключения этого режима.
Вот подробности о режиме Transient Mark:
set-mark-command
). Это сделает метку активной; при перемещении
точки вы увидите, что область увеличивается или уменьшается.
exchange-point-and-mark
).
Для подсветки области используется начертание region
; вы можете
настроить способ подсветки области, изменив это начертание.
Смотрите раздел Настройка начертаний.
Когда несколько окон показывают один и тот же буфер, они имеют разные
области, потому что у них могут быть разные значения точки (хотя все они
имеют одинаковую позицию метки.) Обычно только выбранное окно
подсвечивает область (смотрите раздел Множество окон). Однако, если переменная
highlight-nonselected-windows
не равна nil
, то каждое окно
подсвечивает свою область (если включен режим Transient Mark, и метка в
буфере этого окна активна).
Когда режим Transient Mark не включен, каждая команда, устанавливающая метку, также и активизирует ее, но ничто не деактивизирует метку.
Если в режиме Transient Mark переменная mark-even-if-inactive
не равна nil
, то команды могут использовать метку и область, даже
если они не активны. Подсветка области появляется и исчезает так же, как
обычно в режиме Transient Mark, но метка на самом деле не исчезает,
когда исчезает подсветка.
Режим Transient Mark также известен как "режим Zmacs", потому что редактор Zmacs на MIT Lisp Machine обращался с пометкой похожим образом.
Как только вы создали область, и метка активна, вы можете делать различные вещи с текстом этой области:
Большинство команд, которые оперируют с текстом в области, в своем
имени содержат слово region
.
Здесь представлены команды для помещения точки и метки вокруг текстуальных объектов, таких как слово, список, абзац или страница.
mark-word
). Эта и
следующая команды не передвигают точку.
mark-sexp
).
mark-paragraph
).
mark-defun
).
mark-whole-buffer
).
mark-page
).
M-@ (mark-word
) устанавливает метку в конце следующего
слова, а C-M-@ (mark-sexp
) устанавливает ее в конец
следующего выражения Лиспа. Эти команды обрабатывают свои аргументы так
же, как M-f и C-M-f.
Другие команды устанавливают как метку, так и точку, чтобы ограничить
объект в буфере. Например, M-h (mark-paragraph
)
передвигает точку в начало абзаца, который окружает точку или следует за
ней, и устанавливает метку в конце этого абзаца (смотрите раздел Абзацы). Эта
команда подготавливает область, чтобы вы могли сделать отступы,
переключить регистр или уничтожить весь абзац.
C-M-h (mark-defun
) также устанавливает точку впереди, а
метку после текущего или следующего определения функции
(смотрите раздел Определения функций). C-x C-p (mark-page
)
устанавливает точку перед текущей страницей, а метку -- в конце
страницы (смотрите раздел Страницы). Пометка идет после ограничителя страницы
(чтобы включить и его), точка идет после ограничителя предыдущей
страницы (чтобы исключить его). Числовой аргумент задает более позднюю
страницу (если аргумент положителен) или более раннюю (если он
отрицателен) вместо текущей страницы.
Наконец, C-x h (mark-whole-buffer
) помечает весь буфер
как область, устанавливая точку в начало, а метку в конец.
В режиме Transient Mark все эти команды активизируют метку.
Помимо ограничения области, пометка служит также для запоминания места, в которое вы хотели бы вернуться. Чтобы сделать эту возможность более полезной, Emacs запоминает 16 предыдущих позиций метки в списке пометок. Большинство команд, которые устанавливают метку, вставляют старую метку в этот список. Чтобы вернуться к отмеченной позиции, используют C-u C-SPC (или C-u C-@), это команда set-mark-command, которой дан числовой аргумент. Она передвигает точку туда, где была пометка, и восстанавливает метку из списка прежних пометок. Так, повторное использование этой команды передвигает точку ко всем старым пометкам в списке, к одной за другой. Метки, через которые вы проходите, попадают в конец списка, таким образом ни одна из них не пропадает.
Каждый буфер имеет свой собственный список пометок. Все команды редактирования используют список пометок текущего буфера. В частности, C-u C-SPC всегда остается в том же самом буфере.
Многие команды, передвигающие на большие расстояния, такие, например,
как M-< (beginning-of-buffer
), начинают с установки метки и
записи старого значения в список пометок. Это сделано для того, чтобы
вам было легче впоследствии вернуться назад. Поиски делают это за
исключением тех случаев, когда они фактически не двигают точку. Вы
можете видеть, когда какая-либо команда устанавливает метку, по тому,
что она печатает в эхо-области сообщение `Mark Set'.
Если вы хотите возвращаться к одному и тому же месту снова и снова, список пометок может оказаться недостаточно удобным. В таком случае вы можете записать позицию в регистр для последующего получения (смотрите раздел Запись позиций в регистры).
Переменная mark-ring-max
задает максимальное число элементов в
списке пометок. Если уже имеется максимальное количество элементов, и
заталкивается еще один, то последний из существующего списка
сбрасывается. Повторение C-u C-SPC прокручивает среди
позиций, которые находятся в данный момент в списке.
Переменная mark-ring
хранит сам список пометок как список
помеченных объектов, где первым идет записанный самым последним. Данная
переменная является локальной в каждом буфере.
Кроме обычного списка пометок, который принадлежит каждому буферу, в Emacs есть единый глобальный список пометок. В нем записывается последовательность буферов, в которых вы недавно устанавливали метки, чтобы вы могли вернуться к этим буферам.
При установке метки всегда создается вхождение в списке пометок текущего буфера. Если вы переключали буферы после предыдущей установки метки, позиция новой метки вносится также и в глобальный список пометок. В результате глобальный список пометок хранит последовательность буферов, в которых вы побывали, и место в каждом из них, где вы поставили метку.
Команда C-x C-SPC (pop-global-mark
) переводит к
буферу и позиции последнего вхождения в глобальном списке пометок. Она
также проматывает этот список, чтобы последовательное применение команды
C-x C-SPC перемещало вас ко все более ранним буферам.