use package 用宏绑定按键

我的代码是这样子的 ,可是报错

use-package: groovy-mode wants arguments acceptable to the `bind-keys’ macro, or a list of such values

(defmacro run!(format)
  `(lambda()
	 (interactive)
	 (compile (format ,format (buffer-file-name)))))

(use-package groovy-mode
  :mode ("\\.gradle\\'" "\\.groovy\\'")
  :bind ("C-c C-c" . (run! "groovy %s")))

try this

(use-package groovy-mode
  :mode ("\\.gradle\\'" "\\.groovy\\'")
  :bind `("C-c C-c" . ,(run! "groovy %s")))

:bind 你只能写成

(defmacro run! (format)
  `(compile (format ,format (buffer-file-name))))

(use-package groovy-mode
  :mode ("\\.gradle\\'" "\\.groovy\\'")
  :bind ("C-c C-c" . (lambda ()
                       (interactive)
                       (run! "groovy %s"))))

更好的做法是给这个 function 一个名字

(defun groovy-compile ()
  (run! "groovy %s"))

...
:bind ("C-c C-c" . groovy-compile)
...

如果你用 which-key,这样的话可以避免出现下面这样的 closure,能有更明确的提示作用。

如果你的需求就是「少写点配置代码」,那就要给 use-package 自己写 binder。

如果实在不想定义 function,那这样也行。

(use-package groovy-mode
  :mode ("\\.gradle\\'" "\\.groovy\\'")
  :init
  (bind-key "C-c C-c" (run! "groovy %s")))

这报一样的错。

3 个赞

少了 eval 和 backquote:

(eval
 `(use-package groovy-mode
    :mode ("\\.gradle\\'" "\\.groovy\\'")
    :bind ("C-c C-c" . ,(run! "groovy %s"))))