请问如何防止 built-in 模块加载?

我在使用 projectile 的时候,经常受到 project.el 的干扰。具体表现在 M-x 出来输入 proj 的时候提示的大多数函数是 project.el 的。 由于我不打算使用 project.el,请问大家能否防止 project.el 在启动的时候自动加载?

我尝试使用 unload-feature 把 project.el 去掉,但是发现 xref 依赖了 project.el :joy:

(provide 'project)

这样 Emacs 就会觉得你已经加载过 project.el

1 个赞

我正在删除 projectile :grinning_face_with_smiling_eyes:,打算都用 project.el。

似乎不太管用?我都已经放在 early-init.el 里面了,重启之后还是会加载 project-XXX 的函数


我想起来了,当多个同名包的时候,似乎有个加载顺序可以调整,我再看看


UPDATE2: 我自己写了个 project.el 文件,在里面 (provide 'project) ,然后使用 use-package 加载。加载后使用 locate-library 'project 确实是我这个文件的路径,但是,依然有这些 autoload 的 proejct-XXX 函数出现在 M-x 里面。

也许有个workaround,用defalias全部映射到projectile?

我比较想知道怎么 override 内置包,例如我想单独升级下 org-mode 之类 。。

单独升级org是没有问题的,会先加载版本高的包。

Emacs 28 有个新特性,给 symbol put 某个 property 以后就不会出现在 M-x 里了。

2 个赞

autoload的函数?

是的,这些都是 autoload 的函数

大概昨天我也有这个心思,不过现在感觉要和这问题杠上了,凭啥我一定要用内置的 project.el ,我偏不 哈哈哈哈 :rofl:

project.el 现在功能上大部分已经接近projectile了,现在大佬们都倾向于发展内置的project.el,更方便和其他配置包配合(比如xref)。

最近有人给project.el提供了一个补丁,更方便基于当前光标下的symbol 进行项目范围内的替换, 但还没合并。[Patch] Add project.el command to replace symbol at point throughout pro

不过要求高的话还是用 projectile 功能更丰富。

既然都知道有别的包依赖它,为什么还要去掉,这不是闲得蛋疼吗。

试试最原始的办法:执行一遍所有projectile命令提高权重。

alias 那些命令一劳永逸

;; Emacs 28+
(dolist (sym '(project-search
               project-other-window-command
               project-vc-dir
               project-display-buffer
               project-dired
               project-execute-extended-command
               project-switch-to-buffer
               project-query-replace-regexp
               project-find-file
               project-kill-buffers
               project-forget-project
               project-eshell
               project-or-external-find-regexp
               project-other-frame-command
               project-other-tab-command
               project-shell
               project-find-dir
               project-async-shell-command
               project-compile
               project-switch-project
               project-shell-command
               project-forget-zombie-projects
               project-remember-projects-under
               project-forget-projects-under
               project-display-buffer-other-frame
               project-or-external-find-file
               project-find-regexp))
  (put sym 'completion-predicate #'ignore))

这样就不会在 M-x 时显示 project.el 相关的命令了,也不会影响那些依赖 project.el 的包。

2 个赞

可能这就是折腾的本质 :rofl:

我还是希望能直接去掉 project-xxx

十分感谢!我使用的 counsel/ivy,所以直接使用你这份代码没起到作用。但是顺着你的思路,我找到了 counsel--M-x-make-predicate 函数,发现其中有检查 no-counsel-M-x 这个 property。于是我在你代码基础上,改成下面这句就成功在 counsel/ivy 里面把 project-xxx 隐藏掉了。谢谢!

(put sym 'no-counsel-M-x #'ignore)
2 个赞