使用font-lock替换带符号的字符串?

问题描述 投票:1回答:1

我正在尝试使用字体锁钩来替换数学符号插件的文本字符串。

所以我想“/”(注意空格)会变成“÷”,但“/”不会。 (这是一个主要用于R统计语言的软件包。)

我正在玩手册中的例子,我甚至无法让它工作大声笑。我试图让FIXIT这个词改变字体颜色。

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

我甚至不完全理解语法,因为我只是习惯了lisp。它是否使用RegEx来识别字符串?如果是这样,什么是RegEx引擎。

我希望它会改变字体颜色,但它没有......但是,再次,这只是我玩它试图理解它,而不是最终目标。最终结果将是我提到的第一件改变数学符号的事情。

elisp
1个回答
0
投票

就你的例子而言:也许你在FIXIT之后错过了“:”?尝试粘贴

;; FIXIT: needs work

启用钩子进入elisp缓冲区,它应该工作。

就正则表达式而言,它们的语法在Regexps下的用户手册和Syntax of Regexps下的Elisp手册中有详细说明。

我不太确定font-lock在你的情况下是否真的有用。改变显示文本的一种方法是使用Text Properties,特别是Display Property。如果用空格包围,则以下代码将所有斜杠更改为“÷”。

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

但是,与将字体应用为文本更改的font-lock不同,在删除文本或更改属性之前,这将是“永久”的。 如果字体可以做同样的事情(例如通过字体本身的显示属性),你可能会发现自己很幸运,否则你将不得不找到一个不重新实现字体锁定的解决方法。

编辑:事实证明,你可以使用jit-lock-register来运行你自己的fontification函数。根据检查glasses-mode来源所做的观察,我写了一个小模式,可以做你想要的概念证明。它使用overlays而不是文本属性,因为它们更容易删除。

(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)))))
© www.soinside.com 2019 - 2024. All rights reserved.