Emacs Lisp 模式下 If 缩进出问题

每个地方都加list很麻烦啊。

之前我是用的这个方案:

(propertize icon 'face `(:inherit
                         ,face
                         :height
                         1.1)

pcase 的确很好用,但是也要看场合,这是我某个包中的真实代码:

(let* ((st (parse-partial-sexp (point-min) (point)))
       (depth0?                (eq 0 (nth 0 st)))
       (start-of-innermost     (nth 1 st))
       (at-string?             (nth 3 st))
       (cst (car (syntax-after (point))))  ;; See (info "(elisp) Syntax Table Internals") for more
       (lparens?               (eq 4 cst)) ;; "("
       (rparens?               (eq 5 cst)) ;; ")"
       (at-string-end?         (and at-string? (eq 7 cst)))
       (beg (if (and depth0? (not (and at-string?
                                       (not at-string-end?))))
                (if lparens?
                    (point))
              (if (or (not at-string?)
                      at-string-end?)
                  start-of-innermost))))

  ...)

我并不是总是直接使用 parse-partial-sexp 的返回值,也没有顺序/全部使用,而是挑选了其中某些值计算之后再拿来用,而且我希望在一个 let 中搞定。

` 有时候也麻烦,如果效果跟 list 一样,用哪个都可行。

你这个方案可行,应该不少人都会这么办,还有实在不行就这么写:

(
 :foreground "red"
 :background "white")

然后再加一句注释来吐槽默认的缩进。

对,不知道为什么默认是这一种效果。我以前也采用过你说的这种方案。对于强迫症来说都不完美,最后用了上面说的那个改装版解决了这个问题。

pcase-let*了解下

pcase 如何跳跃式取值? 例如:

(let ((n (nth 5 '(1 2 3 4 5 6 7 8 9 0))))
  n)

pcase 必须一格一格地数着跳过:

(pcase-let ((`(,_ ,_ ,_ ,_ ,_ ,n . ,_) '(1 2 3 4 5 6 7 8 9 0)))
  n)

还是有更简便的写法?

没办法,毕竟是模式匹配。只能用wildcard跳过

seq Pattern 写法要简单些:

(pcase (stream-range)
  ((seq _ _ _ _ _ n) n))
;; => 5

(stream-range) 表示自然数序列,需要安装 stream.el

还有一个办法是 File / Dir Local variable 里专门设置 lisp-indent-function,我没折腾过,感觉可行?

File / Dir Local variable 就是用来协同作业的吧,记得以前代码常常会加上两行:

/* -*- mode: c++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 
/* vim: set ts=2 et sw=2 tw=80: */ 

.dir-locals.el 可以写更多,把缩进规则一条一条加进去,但冒号关键字缩进似乎无法简单通过配置来解决。

前面用的那个缩进函数偶尔还是会出错:

(foo :a
  1
  :b
  2
  :c
  3)

而且这个函数看起来挺复杂,我干脆自己写了一个 lisp-keyword-indent 包,用来应对:&关键字的缩进,也实现了#13楼的锯齿效果。代码总量比单个函数略有增加,但是可配置,自己看得懂,容易扩展。


UPDATE

我错了,目前我的代码其实比那单个函数较少,逐步完善之后应该会超过。