用sly-el-indent获得更好的Elisp缩进

你这个是误用了defun spec。defunspec定义在lisp-indent-defun-method里,默认是(4 &lambda &body) 也就是说第一个参数缩进4格,第二个参数按lambda-list缩进,其余参数按body缩进。除非你的宏真的是类似defun的宏,否则慎用。

这种混合keyword和forms的建议直接用(indent 0)然后写的时候参数全部另起一行写

Sly有sticker,差不多一个意思。

我要的是能获得 breakpoint 的 lexical environment,然后能在这个 environment 里面 eval code。sticker 说白了就是个 visual goodies,没提供新功能

那手动加break进debugger呢

一样沒有 lexical env eval。我说了 sticker 和手动加沒实质区別

哦,cl的debugger能eval但不是lexical

搜索了 ~/.emacs.d/elpa 下的包和 Emacs 内置的包,似乎“误用”的情况不少。

有时候参数跟函数/宏名写在一行看起来比较顺眼。

突然发现use-package用tagbody的缩进不错

(put 'use-package 'common-lisp-indent-function '(4 &rest lisp-indent-tagbody))

效果

(use-package helm
 :defer 1
 :after-call post-command-hook
 :init
   (setq helm-describe-function-function 'helpful-callable)
   (setq helm-inherit-input-method nil)
 :bind
   ([remap apropos] . helm-apropos)
   ([remap find-library] . helm-locate-library)
   ([remap bookmark-jump] . helm-bookmarks)
   ([remap execute-extended-command] . helm-M-x)
   ([remap find-file] . helm-find-files)
   ([remap imenu-anywhere] . helm-imenu-anywhere)
   ([remap imenu] . helm-semantic-or-imenu)
   ([remap noop-show-kill-ring] . helm-show-kill-ring)
   ;; ([remap persp-switch-to-buffer] . +helm/workspace-mini)
   ([remap switch-to-buffer] . helm-mini)
   ;; ([remap projectile-find-file] . +helm/projectile-find-file)
   ([remap projectile-recentf] . helm-projectile-recentf)
   ([remap projectile-switch-project] . helm-projectile-switch-project)
   ([remap projectile-switch-to-buffer] . helm-projectile-switch-to-buffer)
   ([remap recentf-open-files] . helm-recentf)
   ([remap yank-pop] . helm-show-kill-ring)
   ([remap woman] . helm-man-woman)
   ([remap comint-history-isearch-backward-regexp] . helm-comint-input-ring)
   ([remap comint-history-isearch-backward] . helm-comint-input-ring)
   ("C-c C-r" . helm-resume)
   (:map minibuffer-local-map
         ("C-r" . helm-minibuffer-history)
         ("C-c C-l" . helm-minibuffer-history))
 :config
   (helm-mode 1)
   (add-to-list 'helm-completing-read-handlers-alist
                `(,#'find-file-at-point . nil)))

cl-def{un,macro} 参数缩进的时候,除了以 & 关键字做为基准之外,可否把前一个参数作为优先考虑的因素?例如:

(cl-defun foo (
               ;; actual    ;; expected
               &key key1    ;; &key key1
                 key2       ;;      key2
                 key3       ;;      key3
                 )
  ...)

可能我有空考虑重写一下sly-cl-indent,原来的实现太脏了。

1 个赞

重写考不考虑合并上游?比默认的indent强多了。

wow!确实挺棒的!(咦,好像挖坟了

怎么得到这样的缩进呢?

 (use-package dired
   :bind (:map dired-mode-map
               ("C-j" . dired-jump-other-window)
               ("C-x M-o" . dired-omit-switch)
               ("C-x d" . dired)
          :repeat-map dired-sort-repeat-map
               ("s" . dired-sort-size)
               ("x" . dired-sort-extension)
               ("t" . dired-sort-time)
               ("c" . dired-sort-ctime)
               ("a" . dired-sort-utime)
               ("n" . dired-sort-name)
          :exit
               ("<escape>" . nil)))

按照你写的括号层级,应该是这样的缩进。

(use-package dired
    :bind (:map dired-mode-map
                ("C-j" . dired-jump-other-window)
                ("C-x M-o" . dired-omit-switch)
                ("C-x d" . dired)
                :repeat-map dired-sort-repeat-map
                ("s" . dired-sort-size)
                ("x" . dired-sort-extension)
                ("t" . dired-sort-time)
                ("c" . dired-sort-ctime)
                ("a" . dired-sort-utime)
                ("n" . dired-sort-name)
                :exit
                ("<escape>" . nil)))

那样就没有考虑tag的意义了,不能突出tag,不方便看 :grinning:

你需要单独为 use-package 写一条缩进规则,具体可参考 sly--lisp-indent-init-standard-indentation 里的写法——也许可行,我没试过:

我用自己的包试了一下是可以的:

不知道 sly-el-indent-elisp 能不能识别 innermost 外层的 form。如果不能就会比较麻烦。

例如定义了规则 (use-package ...),在以下情况是可以匹配到的(|表示光标):

;; 此时的 innermost form 是 use-package
(use-package dired
  :bind|(:map dired-mode-map
              ("C-j" . dired-jump-other-window)
              ("C-x M-o" . dired-omit-switch)
              ("C-x d" . dired)
         :repeat-map dired-sort-repeat-map
              ("s" . dired-sort-size)
              ("x" . dired-sort-extension)
              ("t" . dired-sort-time)
              ("c" . dired-sort-ctime)
              ("a" . dired-sort-utime)
              ("n" . dired-sort-name)
         :exit
              ("<escape>" . nil)))

一旦光标进入到内层,就匹配不到 (use-package ...) 规则了:

;; 此时的 innermost form 是 :map
(use-package dired
  :bind (:map dired-mode-map
             |("C-j" . dired-jump-other-window)
              ("C-x M-o" . dired-omit-switch)
              ("C-x d" . dired)
         :repeat-map dired-sort-repeat-map
              ("s" . dired-sort-size)
              ("x" . dired-sort-extension)
              ("t" . dired-sort-time)
              ("c" . dired-sort-ctime)
              ("a" . dired-sort-utime)
              ("n" . dired-sort-name)
         :exit
              ("<escape>" . nil)))