непрерывно выполнять функцию Emacs lisp - PullRequest
6 голосов
/ 06 августа 2010

Есть ли способ запустить выполнение функции lisp emacs, кроме Mx myfun?Я хотел бы, чтобы функция вызывалась каждый раз при смене буфера.

Справочная информация: у меня есть таблица чисел с некоторыми ошибками.Таблица содержит итоги столбцов и другие функции, которые можно использовать для выявления ошибок.Моя функция elisp выделяет подозрительные столбцы чисел.Я хотел бы, чтобы подсветка исчезла, как только числа были исправлены, без повторного вызова функции ошибок подсветки.

Аналогичная функция в Excel называется, я считаю, "условным форматированием"

Ответы [ 2 ]

9 голосов
/ 07 августа 2010

Концепция, которую вы ищите в первых абзацах: hooks . Переменная-ловушка - это список функций, которые выполняются при наступлении определенного события. Большинство переменных хуков имеют имя, оканчивающееся на -hook. Хук after-change-functions выполняется каждый раз, когда вы что-то печатаете или иным образом меняете буфер. Крючки обсуждаются в руководстве по Emacs Lisp под заголовком "Крючки".

Однако, учитывая то, что вы пытаетесь сделать, было бы проще использовать механизм подсветки Emacs. Решение может быть так же просто, как добавить регулярное выражение в нужном месте.

Большинство файлов, содержащих структурированный текст (особенно языки программирования), выделяются с помощью механизма блокировка шрифта . Это задокументировано в руководствах Emacs и Emacs Lisp в разделе «Блокировка шрифта»; посмотрите, в частности, функцию font-lock-add-keywords, для которой в руководстве Emacs приведен пример, который вам очень нужен. Также есть некоторая информация в вики Emacs .

ДОБАВЛЕНО:

Блокировка шрифта может выходить за пределы регулярных выражений; к сожалению, документация ограничена кратким объяснением в строке документации font-lock-keywords. В cperl-mode.el есть несколько простых примеров (хотя они несколько утопают в массе). В вики также упоминается ctypes.el, которая использует эту функцию. Вот пример, который выделяет неправильные целочисленные дополнения.

(defun maybe-warn-about-addition ()
  (let ((x (string-to-int (match-string 1)))
        (y (string-to-int (match-string 2)))
        (z (string-to-int (match-string 3))))
    (if (/= (+ x y) z)
        font-lock-warning-face)))
(font-lock-add-keywords
 nil
 '(("\\s-\\([0-9]+\\)\\s-*\\+\\s-*\\([0-9]+\\)\\s-*=\\s-*\\([0-9]+\\)\\s-"
    (3 (maybe-warn-about-addition) t))))

Даже регулярное выражение может быть заменено произвольным кодом, который ищет границы того, что вы хотите выделить (имя функции как MATCHER, используя словарь из строки документации). Существует расширенный пример ключевых слов блокировки шрифта в стандартном режиме C (cc-fonts.el).

1 голос
/ 06 августа 2010

Добавьте вашу функцию в переменную after-change-functions.

...