格式化(美化)Elisp代码的命令


21

假设我有一个如下所示的函数(在打印elisp输出时通常是这种情况)。

(defun my-example-function () (let ((a (do-something)) (b (do-something))) (setq someone me) (with-current-buffer b (do-that (or this (and that those))) (format "%s" a))))

我想要一个可以将其转换为人类可以编写的命令的命令,例如以下命令。

(defun my-example-function ()
  (let ((a (do-something))
        (b (do-something)))
    (setq someone me)
    (with-current-buffer b
      (do-that (or this (and that those)))
      (format "%s" a))))

我了解,格式化elisp代码的方式不只一种,而且不同的人做的方式也不同。此外,我了解它有些主观。但是,要想出一套规则,使代码至少是体面的,应该相当容易。

实际上,我前一段时间确实很难做到这一点,但是我认为最好是在重新发明轮子之前先问一下。

请注意,我知道pp函数,但还不能完全实现:

(defun my-example-function nil
  (let
      ((a
        (do-something))
       (b
        (do-something)))
    (setq someone me)
    (with-current-buffer b
      (do-that
       (or this
           (and that those)))
      (format "%s" a))))

4
这有帮助吗?Elisp格式
路加福音

格式化必须是主观的。我不确定您会比的稍好版本做得更好pp
shosti

@King谢谢,这当然是相关的。
马拉巴巴2014年

Answers:


10

这是lispy为我重新格式化的方式(通过按下M表达式的任一端):

(defun my-example-function ()
  (let ((a (do-something))
        (b (do-something)))
    (setq someone me)
    (with-current-buffer b (do-that (or this (and that those)))
                         (format "%s" a))))

要将其转换为指定的格式,请按qk C-m [


(local-set-key (kbd "s-8") #'lispy-multiline) (local-set-key (kbd "s-*") #'lispy-oneline)
grettke

8

正如其他人在评论中所建议的那样,“格式设置”可能意味着不同的含义。

对于非常传统的缩进,请尝试使用C-M-qindent-pp-sexp在Lisp模式下执行命令)将光标与要重新缩进的顶级sexp内的某个位置(例如defunsexp)一起使用。

不,这不是“自动”缩进,但是使用它会成为一种习惯。;-)

对于缩进以外的其他事情,您将需要手动执行或者滚动自己的“格式”命令,或者找到一些现有的格式命令。

另请参见Emacs手册“节点多行缩进”和Elisp手册“节点” Mode-Specific Indent


3
谢谢,我对elisp压痕感到非常满意,我正在寻找可以断线的东西。:-)是的,我知道这是主观的。:-(
马拉巴巴2014年

M-qfill-paragraph)有时对于Emacs-Lisp模式下的换行很有用,具体取决于上下文。但是您可能也在寻找对齐方式
Drew
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.