Elisp:临时缓冲区中的字体锁?

时间:2014-05-09 15:42:56

标签: emacs elisp

我喜欢在我的lisp缓冲区中将lambda字体锁定到λ。 我这样做:

(defvar keyword-lambda
  '(("(\\(lambda\\)\\>"
     (0 (prog1 () (compose-region
                   (match-beginning 1)
                   (match-end 1) ?λ))))))
(font-lock-add-keywords 'emacs-lisp-mode keyword-lambda)

符号lambda的字符宽度变为1,indent-sexp尊重它, 但似乎不是在临时缓冲区。在elisp缓冲区中使用 C-u C-x C-e 进行验证:

(insert
 "\n"
 (with-temp-buffer
  (emacs-lisp-mode)
  (insert "(lambda () (interactive)\n   (foo))")
  (goto-char (point-min))
  (indent-sexp)
  (buffer-substring-no-properties
   (point-min)
   (point-max))))

代码缩进是:

(λ () (interactive)
        (foo))

这是缩进,好像λ是5个字符宽。

有解决方法吗?

1 个答案:

答案 0 :(得分:1)

font-lock-add-keywords用于装饰lambda,并附上一个简短的说明"将其显示为λ"。

但是没有应用font-lock的方式"因为文本被插入缓冲区"。相反,它应用了#34;文本插入缓冲区之后和显示之前的某个时间",其中发生的确切时间取决于各种因素和配置。此外,在临时缓冲区中禁用了font-lock。

所有这些意味着您需要在致电indent-sexp之前强制使用font-lock来执行此操作,例如:致电font-lock-ensure