你这个是误用了defun
spec。defun
spec定义在lisp-indent-defun-method
里,默认是(4 &lambda &body)
也就是说第一个参数缩进4格,第二个参数按lambda-list缩进,其余参数按body缩进。除非你的宏真的是类似defun的宏,否则慎用。
这种混合keyword和forms的建议直接用(indent 0)
然后写的时候参数全部另起一行写
你这个是误用了defun
spec。defun
spec定义在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,原来的实现太脏了。
重写考不考虑合并上游?比默认的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,不方便看
你需要单独为 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)))