with-eval-after-load
可以使被包裹在其中的配置在特定的mode启动后再被调用,那么是否有一个与之相反的函数可以让我的配置在某个特定的mode下不被调用呢?
比如我使用了lsp-bridge作为我的补全插件,我的doom-modeline会在补全窗口下显示modeline :
所以我想在此模式下不使用doom-modeline插件,甚至在特定的buffer下不这么做,请问这可以做到吗?
with-eval-after-load
可以使被包裹在其中的配置在特定的mode启动后再被调用,那么是否有一个与之相反的函数可以让我的配置在某个特定的mode下不被调用呢?
比如我使用了lsp-bridge作为我的补全插件,我的doom-modeline会在补全窗口下显示modeline :
所以我想在此模式下不使用doom-modeline插件,甚至在特定的buffer下不这么做,请问这可以做到吗?
我刚发现有一个叫做remove-hook
的函数可以做到在特定主模式下不加载配置的功能,如:
(remove-hook 'fundamental-mode
(use-package doom-modeline
;; :init
;; (setq doom-modeline-minor-modes nil)
:ensure t
:defer 1
:config
(doom-modeline-mode 1)
(use-package all-the-icons
:ensure t
:defer t)))
这做到了在fundamental-mode下不使用包裹在其中的配置,但我还是感觉有些不完美,是否可以做到在一个特定名称的buffer下不使用上述配置呢
问题解决了,buffer下不加载配置的方法还没找到,但是在acm-mode和fundamental-mode下使用remove-hook都可以做到使doom-modeline不干涉lsp-bridge的补全
(remove-hook 'acm-mode ... )
由于acm-mode范围小点,所以用下面这个了, 应该不会影响到其他不相干的buffer
acm frame 默认是设置 mode-line-format 为 nil 的, 所以默认应该不会显示 modeline.
应该是 doom 有一些配置过多的去干扰别的插件。
{with-,}eval-after-load
里的代码,只在包 load 的时候执行一次。细节请看 eval-after-load
实现。
与之相对应的操作是 unload,需要执行的代码放置在 FEATURE-unload-hook
或 FEATURE-unload-function
中:
(add-hook 'foobar-unload-hook
(lambda () (message "==> foobar-unload-hook")))
(defun foobar-unload-function ()
(message "==> foobar-unload-function"))
后者优先级高于前者,如果后者定义了,前者不执行。细节请看 unload-feature
实现。
然而绝大多数时候用户都不会需要 unload,因为 unload 之后,这个包就不能用了,在任何地方都不能用了。
所以你真正的需求是:如何「可以让我的配置在某个特定的mode下不被调用呢?」(建议以这个为帖子标题)
你实际上是问了一个 x-y 问题。即你没有去问怎么解决 x,而是觉得 y 是解决 x 的方法,所以去问了 y。
再说下你自己的解决方案,我是完全看不懂。
首先,use-package
的返回值是什么?我从未见过你这样的写法。(当然我不太熟悉 use-package
,所以关注比较少,懂的朋友请告诉)
其次,(remove-hook 'fundamental-mode …)
可以这样写吗?难道不是 (remove-hook 'fundamental-mode-mode …)
?
(with-emacs
(add-hook 'fundamental-mode-hook 'test-function)
(remove-hook 'fundamental-mode 'test-function)
fundamental-mode-hook)
;; => (test-function) <----- 并没有移除掉 hook
所以,我很怀疑你的代码是否有效。
再者,fundamental-mode
是所有 mode 的根,在它上面增加/删除 hook 需谨慎。
很感谢你耐心的回答我的问题,其实我并没有学过elisp,功能我基本是靠猜,但是可以确定的是我的代码是有效的
这个我也不太清楚,按照您写的我感觉我确实是写错了,但是代码却是可行的。之前我看过一个帖子,一段代码后面多了两个右括号,但是却只影响了这个代码块,并没有报前面的代码出错,可能是elisp的特殊?
有可能,但我对doom-modeline就是直接用(use-package doom-modeline)加载了这个包,唯一的设置是(doom-modeline-mode 1)
。
即使我不设置这条,手动输入 M-x doom-modeline-mode
开启doom-modeline 也还是有 modeline 在lsp-bridge补全窗口显示
可能是来自doom-modeline外的其他插件的干扰吧。
PS:
有意思的是,我刚才又试了一下,首先我的doom-modeline是延迟加载的 :defer 1
,当lsp-bridge在补全时,如果doom-modeline 正好加载完毕,那么以后的补全窗口都会有 modeline 显示,但是如果在doom-modeline加载完成后,lsp-bridge才开始进行补全,那么就不会显示 mode-line
看了半天,原来你没有使用Doomemacs,而是直接使用doom modeline的呀?那你去看一下doomemacsmodeline是咋配置的,抄一下好了?我使用doomemacs,doommodeline和lspbridge不会冲突。我lspbridge不是开局加载的,而是加了python-mode-hook之类的编程语言的hook里,进入这些主模式以后自动加载lsp-bridge