如何可以让我的配置在某个特定的mode下不被调用呢?

with-eval-after-load 可以使被包裹在其中的配置在特定的mode启动后再被调用,那么是否有一个与之相反的函数可以让我的配置在某个特定的mode下不被调用呢?

比如我使用了lsp-bridge作为我的补全插件,我的doom-modeline会在补全窗口下显示modeline :

2022-09-30-172006_619x263_scrot

所以我想在此模式下不使用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

1 个赞

acm frame 默认是设置 mode-line-format 为 nil 的, 所以默认应该不会显示 modeline.

应该是 doom 有一些配置过多的去干扰别的插件。

1 个赞

标题与诉求不符

{with-,}eval-after-load 里的代码,只在包 load 的时候执行一次。细节请看 eval-after-load 实现。

与之相对应的操作是 unload,需要执行的代码放置在 FEATURE-unload-hookFEATURE-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的特殊?

我的doommodeline是正常的,和lspbridge的补全窗口不会打架,感觉会不会是你的配置问题?

有可能,但我对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