通过use-package设置的快捷键不起作用

(use-package smartparens-config
  :config (show-smartparens-global-mode)
  :bind
  (:map smartparens-mode-map
        (("C-M-a" . sp-beginning-of-sexp)
         ("C-M-e" . sp-end-of-sexp)

         ("C-<down>" . sp-down-sexp)
         ("C-<up>"   . sp-up-sexp)
         ("M-<down>" . sp-backward-down-sexp)
         ("M-<up>"   . sp-backward-up-sexp)

         ("C-M-f" . sp-forward-sexp)
         ("C-M-b" . sp-backward-sexp)

         ("C-M-n" . sp-next-sexp)
         ("C-M-p" . sp-previous-sexp)

         ("C-S-f" . sp-forward-symbol)
         ("C-S-b" . sp-backward-symbol)

         ("C-<right>" . sp-forward-slurp-sexp)
         ("M-<right>" . sp-forward-barf-sexp)
         ("C-<left>"  . sp-backward-slurp-sexp)
         ("M-<left>"  . sp-backward-barf-sexp)

         ("C-M-t" . sp-transpose-sexp)
         ("C-M-k" . sp-kill-sexp)
         ("C-k"   . sp-kill-hybrid-sexp)
         ("M-k"   . sp-backward-kill-sexp)
         ("C-M-w" . sp-copy-sexp)
         ("C-M-d" . delete-sexp)

         ("M-<backspace>" . backward-kill-word)
         ("C-<backspace>" . sp-backward-kill-word)
         ([remap sp-backward-kill-word] . backward-kill-word)

         ("M-[" . sp-backward-unwrap-sexp)
         ("M-]" . sp-unwrap-sexp)

         ("C-x C-t" . sp-transpose-hybrid-sexp)

         ("C-c ("  . wrap-with-parens)
         ("C-c ["  . wrap-with-brackets)
         ("C-c {"  . wrap-with-braces)
         ("C-c '"  . wrap-with-single-quotes)
         ("C-c \"" . wrap-with-double-quotes)
         ("C-c _"  . wrap-with-underscores)
         ("C-c `"  . wrap-with-back-quotes))))

这是我对smartparens的配置,不知道为什么只有C-M-a生效,其他的快捷键按下去都没反应。通过C-h k来测试也只有C-M-a能看到绑定了相应地函数。通过M-x执行相应地函数能看到这些函数都有按键绑定,安装了emacs-which-key后按Esc键也能看到这些按键被绑定上了,但不知道是哪里出了问题

应该不会是其他应用程序把按键给拦截了,因为只留一个emacs运行也还是会出现这种情况。。。

使用 use-package 之前

(require 'use-package)

试试,印象中我好像遇到过。

试试把这段配置放到 (use-package smartparens) 里,把 (require 'smartparens-config) 放到 :config block 里就行了。

另外我用了 general, 不知道有没影响。

配置里这一段是有的,其他插件使用use-package:bind都正常,只有这个smartparens不起作用,不知道是什么原因。

不知道为什么,如果这样设置的话似乎不会加载smartparens了,必须还得在use-package前加一个(require 'smartparens)。。。

暂时用这个issue里的方法解决了,并且发现自己之前的按键貌似绑定的也不正确。

虽然通过emacs-which-keyC-h k显示C-M-a绑定的是sp-beginning-of-sexp,但实际上起作用的似乎是beginning-of-defun。。。不清楚究竟是哪里出了问题

这是因为你用了 :bind 之后,use-package 默认给你 Lazy Load smartparens 了。

This does two things: first, it creates an autoload for the ace-jump-mode command and defers loading of ace-jump-mode until you actually use it. Second, it binds the key C-. to that command.

也就是说当任何一个 :bind 里的 command 触发后才会 Load smartparens,但你的这些key都是定义在 smartparens-mode-map 里的,没 smartparens 就没有 smartparens-mode (没鸡就没蛋?:stuck_out_tongue_closed_eyes:

试试加个 :hook。 这是我的配置

2 个赞

我觉得应该是加载了smartparens吧,因为输入类似( " [一类的符号时都能配对,输入在里面的代码也会高亮,并且通过M-x执行smartparens的函数后快捷键也还是不起作用。。。

好像还真是这个原因,之前自己加的hook加到了prog-modemarkdown-mode上,对应的还是smartparens-strict-mode,难怪啊

:hook ((prog-mode markdown-mode) . smartparens-strict-mode) :joy:

感谢解惑 :smile:

不客气哈!互相学习 :grinning: