elispfl -- 增强emacs-lisp mode的语法高亮


#1

Emacs对Elisp mode默认的语法高亮有点少,只有macro和special form,以及函数定义的语法高亮。

很久以前从doom-emacs抄到了 https://github.com/hlissner/doom-emacs/blob/develop/modules/lang/emacs-lisp/autoload.el#L39 这个函数,让emacs和高亮函数调用和全局变量。

昨天整理配置的时候,把这段函数拿出来重构了一下,理清了逻辑,做成elispfl这个单独的package。

使用方式

(with-eval-after-load 'elisp-mode
  (require 'elispfl)
  (elispfl-mode))

Have fun!


#2

用doom-emacs的是不是可以偷懒了


#3

是的 :stuck_out_tongue: doom-emacs已经有这个选项了


#4

Q: 上melpa吗

A: https://github.com/melpa/melpa/pull/6372


#5

伸手:elispfl和highlight-function-calls哪个更好一点?


dolist is a Lisp macro in ‘subr.el’.

cond is a special form in ‘src/eval.c’.

这两种东西有区别吗,c源码的叫special form,lisp的叫macro?


#6

都差不多的。只是我个人觉得elispfl的代码比较简洁,不过不支持Emacs24。


macro默认对所有参数都不求值,要手动求值。special form是对部分参数求值的(比如setq form就要对value进行求值。当然也可以理解成从C里手动求值)。还有就是从C定义和从Lisp定义的区别


#7

special form 是有只能通过编译器/解释器特殊处理实現的 primitive 功能,不能用 macro 实现的。


#8

#9

这个把大部分default-face的都变成function face了,好像没什么用。。


#10

有的special form纯粹是为了性能or可读性。


#11
           ;; NOTE: We treat symbol after left round bracket as subroutine.
           ;; May trigger false positive in list literal e.g. '(foo bar),
           ;; but it's suitable for most cases.

那这里只要有个'就不要把foo亮起来?


#12

实际上自定义的复杂 macro 不用 compiler component 是没法处理的。


#13

可以用

'(
 foo
 bar)

加量qouted form里的内容也有写macro方面的考虑


#14

哦!我把macro忘了


#15

能不能和highlight-defined比较一下,哪个好呢


#16

基本一样。elispfl的代码更简洁


#17

加入了ielm的高亮

ielm


#18

报个bug,关键字在 require 后面的时候不要高亮,比如 (require 'display-line-numbers)


#19

我也不知道这个他为什么会这样高亮,等我回学校研究一下


#20

同样的问题, provide 后面也高亮了.