非常奇怪的问题,是 spacemacs 的 bug 吗? 还是我配置错了?

我想要更改 org-agenda 的 evilify 的 keybinding,把 j 和 k 变成 'org-agenda-next-item 和 'org-agenda-previous-item

我用 h spc h 输入 org-agenda 找到了 init 的 function,然后发现里面有这么一段

:config
(evilified-state-evilify-map org-agenda-mode-map
  :mode org-agenda-mode
  :bindings
  "j" 'org-agenda-next-line
  "k" 'org-agenda-previous-line
  (kbd "M-j") 'org-agenda-next-item
  (kbd "M-k") 'org-agenda-previous-item
  (kbd "M-h") 'org-agenda-earlier
  (kbd "M-l") 'org-agenda-later
  (kbd "gd") 'org-agenda-toggle-time-grid
  (kbd "gr") 'org-agenda-redo
  (kbd "M-RET") 'org-agenda-show-and-scroll-up
  (kbd "M-SPC") 'spacemacs/org-agenda-transient-state/body
  (kbd "s-M-SPC") 'spacemacs/org-agenda-transient-state/body))

于是我就学着它在自己的 layer 里面想着把 j 和 k 改了

我是这么做的

首先先创建一个自己的 layer,这个很早以前就做过了,以后在里面配置了不少设置。然后我打开 packages.el 文件,在里面加入了 org-agenda 如图下

然后在如下图

em,这么设置的

然后奇怪的事情就来了,我如果用 spc q q 完全的退出 emacs,然后再进,上面的 ~set-leader-keys-for-major-mode~ 有效,但是 ~evilified-state-evilify-map~ 就跟没设置过一样,也没有 error warning 什么的,我判断可能是被 override 了。 但是 但是,无论何时 我只要用 spc f e R 刷新一下,这设置就一点问题都没有了!!!

这是为什么? 好奇怪,有没有修复的方法,我实在不想每次开 emacs 养成用 spc f e R 刷新一遍设置的习惯 :joy:

非常感谢大家的帮助

我把这段 code 从 evilified-state-evilify-map 开始移到了 init.el 下的 user-config() 最后,也还是一样的效果

那个键绑定是放在use-package的config里的,而它指定了defer选项。会在package加载之后才求值,而你的代码无论是放在post-init还是user-config中都会在spacemacs加载的时候(这时候package还没有加载)求值,因此默认的设置会覆盖你的。我在改设置的时候也遇到过这样的问题。可以把你的代码放到一个with-eval-after-load或者加到某个hook里面,不过有时候即使这样做了也不行,也不知道为什么。

我突然想起来spacemacs还有一个宏叫 spacemacs|use-package-add-hook ,可以把你的键绑定放到 :post-config 里面。参考: Loading in Spacemacs · GitHub 的最后一条。

我也要改一下自己的配置了_(:зゝ∠)_

2 个赞

哦,原来是这样的,学到了,现在问题解决了,真的非常感谢你的帮助

自己有layer的话就直接在myname/init-foo里面的use-package里面用:post-config更好吧?

貌似use-package新版里面取消post-config了

Also, because :init and :config now mean "before" and "after", the :pre-
and :post- keywords are gone, as they should no longer be necessary.

参见: GitHub - jwiegley/use-package: A use-package declaration for simplifying your .emacs


楼主说的是修改 spacemacs 里面引入的package设置,代码只能放到 post-init/pre-init 里面的

没完全懂。以前可以post-config来允许其他layer的配置并在我需要的地方覆盖它们,现在不行了?还是因为use-package没为spacemacs的layer考虑?

还有个问题,更新melpa的package我知道可以直接删了文件夹然后重启自动安装新的,有更优雅的办法么?

ps:你这个链接贴 GitHub - jwiegley/use-package: A use-package declaration for simplifying your .emacs 会更好一点点。

其实我之前没用过 post-config _(:зゝ∠)_,也不清楚这个应该怎么用。不过spacemacs的文档里面建议使用那个宏的。而且,两个包名相同的use-package会不会令一个覆盖另一个?

spacemacs可以用开始页面上的那个链接 update packages;其他的可以使用包管理器自带的功能

谢谢提醒(´・ω・`)

不清楚_(:зゝ∠)_ ,等别人来发表看法吧。我的packages.el一直处于烂尾状态,因为配置不多,在user-config里堆着也没什么感觉_(:зゝ∠)_ 。噫用这个表情真的会上瘾_(:зゝ∠)_。

刚刚改配置的时候发现 spacemacs|use-package-add-hook 有一个坑点啊。比如放进 :post-config 中的代码会在 use-package 的 :config 之后求值,但是如果 use-package 没有 :config 的话这段代码是不会运行的_(:зゝ∠)_


坑点2: :post-init:pre-init要放在layer-name/pre-init-package-name函数的spacemacs|use-package-add-hook里面,否则不会正常加载 _(:зゝ∠)_

define-key也有这种问题。 因为evilified和gnus冲突有点大,我直接把gnus的layer复制到private,用define-key在;config下设置自定键位的时候出现了差不多的情况。都是要reload配置文件才生效。 然后我就用了个add-hook,似乎就没有问题了。