Заменить строку символами с помощью font-lock? - PullRequest
0 голосов
/ 17 февраля 2019

Я пытаюсь сделать хук блокировки шрифта, чтобы заменить строки текста для математического плагина записи.

Так что я думаю "/" (обратите внимание на пробелы) превратится в "÷", но "/" не будет.(Это пакет в основном для статистического языка R.)

Я играю с примерами из руководства и даже не могу заставить это работать, lol.Я пытался заставить слово FIXIT изменить цвет шрифта.

(add-hook 'emacs-lisp-mode-hook
        (lambda ()
        (font-lock-add-keywords nil
            '(("\\<\\(FIXIT\\):" 1
            font-lock-warning-face t)))))

Я даже не до конца понимаю синтаксис, так как я просто привыкла шуметь.Использует ли он RegEx для идентификации строк?и если да, то какой движок RegEx.

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

1 Ответ

0 голосов
/ 10 апреля 2019

Что касается вашего примера: возможно, вы пропускаете ":" после FIXIT?Попробуйте вставить

;; FIXIT: needs work

в буфер elisp с включенным хуком, он должен работать.

Что касается регулярных выражений, их синтаксис подробно описан в руководстве пользователя в Regexps и в руководстве Elisp под Синтаксис Regexps .

Я не слишком уверен, может ли font-lock действительно помочь в вашем случае.Один из способов изменить отображаемый текст - использовать Свойства текста , в частности, Свойство отображения .Следующий код меняет все слэши на «÷», если они окружены пробелами.

(while (re-search-forward " \\(/\\) " nil t)
  (put-text-property (match-beginning 1)
                     (match-end 1)
                     'display "÷"))

Однако, в отличие от font-lock, который применяет шрифты как изменения текста, он будет «постоянным», пока текст не будет удален илисвойство изменилось. Если шрифты могут делать то же самое (например, через свойство display самого шрифта), вам может повезти, в противном случае вам придется найти обходной путь, который не реализует блокировку шрифта.

Редактировать: Оказывается, вы можете использовать jit-lock-register для запуска собственных функций фонификации.Основываясь на наблюдениях, сделанных при проверке источника glasses-mode, я написал второстепенный режим, который делает то, что вы хотите, в качестве доказательства концепции.Он использует оверлеи , а не текстовые свойства, потому что их легче удалить.

(defun make-divisions-fancy (beg end)
  (save-excursion
    (save-match-data
      (goto-char beg)
      (while (re-search-forward " \\(/\\) " end t)
        (let ((overlay (make-overlay (match-beginning 1)
                                     (match-end 1)
                                     nil t)))
          (overlay-put overlay 'category 'fancy-divide)
          (overlay-put overlay 'evaporate t)
          (overlay-put overlay 'display "÷"))))))

(defun make-divisions-boring (beg end)
  (dolist (o (overlays-in beg end))
    (when (eq (overlay-get o 'category) 'fancy-divide)
      (delete-overlay o))))

(defun remake-fancy-divisions (beg end)
  (make-divisions-boring beg end)
  (make-divisions-fancy beg end))

(define-minor-mode fancy-div-mode
  "Minor mode to make divisions like \" / \" fancier."
  :init-value nil 
  (save-excursion
    (save-restriction
      (widen)
      (make-divisions-boring (point-min) (point-max))
      (if fancy-div-mode
          (jit-lock-register 'remake-fancy-divisions)
        (jit-lock-unregister 'remake-fancy-divisions)))))
...