Spec-Zone.ru › Elisp

Обзор маркеров

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

Маркер имеет три атрибута: позицию маркера, буфер маркера и тип вставки. Позиция маркера — это целое число, которое эквивалентно (в данный момент) маркера как позиции в этом буфере. Но значение позиции маркера может изменяться на протяжении всего жизненного цикла маркера, и часто изменяется. Вставка и удаление текста в буфере перемещают маркер. Идея в том, что маркер, расположенный между двумя символами, остается между этими двумя символами, несмотря на вставки и удаления в других местах буфера. Перемещение изменяет целое число, эквивалентное маркера.

Удаление текста вокруг позиции маркера оставляет маркер между символами, непосредственно перед и после удаленного текста. Вставка текста в позицию маркера обычно оставляет маркер либо перед, либо после нового текста, в зависимости от типа вставки маркера (см. Типы вставки маркеров) — если вставка не выполняется с помощью 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 not eq, but they are equal.
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API