Emacs: проблемы с активацией метки в интерактивной команде - PullRequest
4 голосов
/ 30 января 2012

Кажется, что изменение буфера каким-либо образом останавливает активацию метки defun:

(defun mark-five-next ()
  "Marks the next five chars as expected"
  (interactive)
  (push-mark (+ 5 (point)) t t))

(defun insert-an-a-then-mark-five-next ()
  "Does not mark the next five chars"
  (interactive)
  (insert "a")
  (push-mark (+ 5 (point)) t t))

Я бы предпочел способ исправить это, но просто объяснение тоже хорошо.

1 Ответ

8 голосов
/ 31 января 2012

Оказывается, что все команды редактирования устанавливают var deactivate-mark, который делает это только после завершения команды.

Чтобы избежать такого поведения, вы должны обернуть изменяющие буфер функции в let -состоянии, предотвращая изменение глобального deactivate-mark var.

(let (deactivate-mark)
   (...))

Я потратил больше часа на эту проблему, потому что я просто пропустил deactivate-mark в руководстве, думая, что это описание функции. Конечно, как я уже знал, но теперь правильно понял: в emacs lisp есть другое пространство имен для функций и переменных.

...