使用字体锁用符号替换字符串?

时间:2019-02-17 15:31:14

标签: elisp

我正在尝试制作一个字体锁定钩子来替换数学符号插件的文本字符串。

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

我正在使用手册中的示例,但我什至无法使它正常工作。我试图让单词FIXIT更改字体颜色。

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

由于我只是习惯于口齿不清,因此我什至不完全了解语法。是否使用RegEx识别字符串?如果是的话,什么是RegEx引擎。

我希望它能改变字体颜色,但是并没有...但是,再次,那只是我在尝试理解它,而不是最终目标。最终结果将是我提到的更改数学符号的第一件事。

1 个答案:

答案 0 :(得分:0)

就您的示例而言:FIXIT之后是否丢失了“:”?尝试粘贴

;; FIXIT: needs work

插入启用了钩子的elisp缓冲区中,它应该可以工作。

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

我不太确定字体锁定是否真的可以为您提供帮助。更改显示的文本的一种方法是使用Text Properties,特别是Display Property。下面的代码将所有斜杠更改为“÷”(如果被空格包围)。

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

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

编辑:事实证明,您可以使用jit-lock-register运行自己的字体功能。基于检查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)))))