Пометка и область

Существует множество команд Emacs, которые работают с произвольной непрерывной частью текущего буфера. Чтобы задать текст, над которым работают такие команды, вы устанавливаете метку в одном конце этого текста, и передвигаете точку в другой его конец. Текст, расположенный между точкой и меткой, называется областью. Если вы задействовали режим Transient Mark, Emacs выделяет область цветом (смотрите раздел Режим Transient Mark).

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

Многие команды, которые вставляют текст, например C-y (yank) и M-x insert-buffer, располагают метку в одном из концов вставленного текста, противоположном тому, где помещается точка, таким образом, область содержит только что вставленный текст.

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

Установка метки

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

C-SPC
Установить метку там, где находится точка (set-mark-command).
C-@
То же самое.
C-x C-x
Поменять местами метку и точку (exchange-point-and-mark).
Drag-Mouse-1
Установить точку и пометить текст, по которому вы провели.
Mouse-3
Установить метку в точке и переместить точку к позиции, на которой вы щёлкнули. (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.

Режим Transient Mark

Emacs может подсвечивать текущую область, используя X Windows. Но обычно он этого не делает. Почему?

Подсветка области обычно не работает в Emacs хорошо, потому что как только вы поставили метку, всегда есть область (в этом буфере). А постоянная подсветка области раздражала бы.

Вы можете включить подсветку помеченной области, задействовав режим Transient Mark. Это более жёсткий режим действий, в котором область "существует" только временно, так что вы должны задавать область для каждой команды, которая её использует. В режиме Transient Mark большую часть времени области нет; таким образом, подсветка области, когда она существует, удобна.

Чтобы включить режим Transient Mark, наберите команду M-x transient-mark-mode. Эта команда переключает данный режим, а значит вы можете повторить её для выключения этого режима.

Вот подробности о режиме Transient Mark:

  • Чтобы установить метку, введите C-SPC (set-mark-command). Это сделает метку активной; при перемещении точки вы увидите, что область увеличивается или уменьшается.
  • Команды мыши для задания пометки также делают её активной. То же делают и команды клавиатуры, чья цель -- установить область, включая M-@, C-M-@, M-h, C-M-h, C-x C-p и C-x h.
  • Когда метка активна, вы можете выполнять команды, действующие на область, такие как уничтожение, создание отступа или запись в файл.
  • Любое изменение буфера, например вставка или удаление знака, деактивизирует пометку. Это означает, что последующие команды, действующие на область, получат ошибку и не смогут работать. Вы можете сделать область снова активной, введя C-x C-x.
  • Команды вроде M-> и C-s, которые "оставляют метку" помимо какой-то другой основной цели, не активизируют новую метку. Вы можете активизировать новую область, выполнив C-x C-x (exchange-point-and-mark).
  • C-s не изменяет метку, если она активна.
  • Выход с помощью C-g деактивизирует метку.

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

Команды для пометки текстуальных объектов

Здесь представлены команды для помещения точки и метки вокруг текстуальных объектов, таких как слово, список, абзац или страница.

M-@
Установить метку после конца следующего слова (mark-word). Эта и следующая команды не передвигают точку.
C-M-@
Установить метку после конца следующего Лисп-выражения (mark-sexp).
M-h
Установить область вокруг абзаца (mark-paragraph).
C-M-h
Установить область вокруг текущего определения функции Лиспа (mark-defun).
C-x h
Установить область вокруг всего текущего буфера (mark-whole-buffer).
C-x C-p
Установить область вокруг текущей страницы (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 перемещало вас ко все более ранним буферам.

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



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