我正在尝试使用字体锁钩来替换数学符号插件的文本字符串。
所以我想“/”(注意空格)会变成“÷”,但“/”不会。 (这是一个主要用于R统计语言的软件包。)
我正在玩手册中的例子,我甚至无法让它工作大声笑。我试图让FIXIT
这个词改变字体颜色。
(add-hook 'emacs-lisp-mode-hook
(lambda ()
(font-lock-add-keywords nil
'(("\\<\\(FIXIT\\):" 1
font-lock-warning-face t)))))
我甚至不完全理解语法,因为我只是习惯了lisp。它是否使用RegEx来识别字符串?如果是这样,什么是RegEx引擎。
我希望它会改变字体颜色,但它没有......但是,再次,这只是我玩它试图理解它,而不是最终目标。最终结果将是我提到的第一件改变数学符号的事情。
就你的例子而言:也许你在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)))))