Обзор маркеров
Маркер указывает буфер и позицию в этом буфере. Маркер можно использовать для представления позиции в функциях, которые ее требуют, точно так же, как можно использовать целое число. В этом случае буфер маркера обычно игнорируется. Конечно, маркер, используемый таким образом, обычно указывает на позицию в буфере, с которым работает функция, но это полностью ответственность программиста. См. Позиции для полного описания позиций.
Маркер имеет три атрибута: позицию маркера, буфер маркера и тип вставки. Позиция маркера — это целое число, которое эквивалентно (в данный момент) маркера как позиции в этом буфере. Но значение позиции маркера может изменяться на протяжении всего жизненного цикла маркера, и часто изменяется. Вставка и удаление текста в буфере перемещают маркер. Идея в том, что маркер, расположенный между двумя символами, остается между этими двумя символами, несмотря на вставки и удаления в других местах буфера. Перемещение изменяет целое число, эквивалентное маркера.
Удаление текста вокруг позиции маркера оставляет маркер между символами, непосредственно перед и после удаленного текста. Вставка текста в позицию маркера обычно оставляет маркер либо перед, либо после нового текста, в зависимости от типа вставки маркера (см. Типы вставки маркеров) — если вставка не выполняется с помощью insert-before-markers (см. Вставка).
Вставка и удаление в буфере должны проверять все маркеры и перемещать их при необходимости. Это замедляет обработку в буфере с большим количеством маркеров. По этой причине, если вы уверены, что больше не нуждаетесь в маркере, лучше сделать так, чтобы он ни на что не указывал. Маркеры, к которым больше нельзя получить доступ, в конечном итоге удаляются (см. Сбор мусора).
Поскольку часто выполняется арифметические операции над позицией маркера, большинство из этих операций (включая + и -) принимают маркеры в качестве аргументов. В таких случаях маркер обозначает его текущую позицию.
Вот примеры создания маркеров, установки маркеров и перемещения точки к маркерам:
;; Make a new marker that initially does not point anywhere:
(setq m1 (make-marker))
⇒ #<marker in no buffer>
;; Set m1 to point between the 99th and 100th characters
;; in the current buffer:
(set-marker m1 100)
⇒ #<marker at 100 in markers.texi>
;; Now insert one character at the beginning of the buffer:
(goto-char (point-min))
⇒ 1
(insert "Q")
⇒ nil
;; m1 is updated appropriately.
m1
⇒ #<marker at 101 in markers.texi>
;; Two markers that point to the same position ;; are noteq, but they areequal. (setq m2 (copy-marker m1)) ⇒ #<marker at 101 in markers.texi> (eq m1 m2) ⇒ nil (equal m1 m2) ⇒ t
;; When you are finished using a marker, make it point nowhere.
(set-marker m1 nil)
⇒ #<marker in no buffer>
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Overview-of-Markers.html