1

我开始开发自己的 Emacs 环境,我有一个自定义的 init.el(如下所示),它从我的用户目录加载库并忽略已安装的目录。我没有在 User 目录中放置任何 Amusement 或 Mail lisp 库,但它们仍然出现在自动完成列表中。这是因为它们被定义为自动加载功能。如何防止创建这些自动加载功能?我不想单独删除每个不需要的功能,因为这既麻烦又浪费。

关于不需要的功能的帮助信息;

5x5 is an interactive autoloaded Lisp function.

It is bound to <menu-bar> <tools> <games> <5x5>.

我的 init.el;

(setq inhibit-defaul-init 1)

(setq load-path (list 
     (expand-file-name "~/.emacs.d/")
     (expand-file-name "~/.emacs.d/lisp/")
     (expand-file-name "~/.emacs.d/lisp/emacs-lisp/")
     (expand-file-name "~/.emacs.d/lisp/eshell/")
     (expand-file-name "~/.emacs.d/lisp/net/")
     (expand-file-name "~/.emacs.d/lisp/nxml")
     (expand-file-name "~/.emacs.d/lisp/org")        
     (expand-file-name "~/.emacs.d/lisp/term")
     (expand-file-name "~/.emacs.d/lisp/textmodes")
     (expand-file-name "~/.emacs.d/lisp/usrl")
     (expand-file-name "~/.emacs.d/lisp/")
    )
)
4

2 回答 2

3

您可以像取消绑定普通函数一样取消绑定自动加载的函数,这样您就可以有效地5x5从正在运行的系统中删除和其他不需要的自动加载函数,如下所示:

(mapc
 (lambda (func) (fmakunbound func))
 '(5x5 5x5-crack-randomly 5x5-crack-mutating-current 5x5-crack-mutating-best 5x5-crack-xor-mutate 5x5-crack))

对于自动加载的变量,您可以使用makunbound而不是fmakunbound.

要获取可能的嫌疑人列表,您可以使用

  • M-x find-library RET loaddefs RET
  • M-x occur RET ^(autoload RET

图书馆loadhist也可能很有趣。

编辑:

实际上,检查自动加载文件似乎是确定您是否要消除某些东西的一种相当安全的方法。但是,我相信这仅可用于功能;据我所知,其他类型的自动加载对象只是由 loaddefs 立即定义的。您可以根据符号名称做出假设,但我不推荐它(但我不会这样做,所以 YMMV)。

(defvar my-unwanted-libraries
  '("5x5" "snake" "hanoi" "tetris")
  "Unbind all autoloaded functions for these libraries.")

(defun my-unbind-unwanted-autoload-functions ()
  "Unbind all unwanted autoloaded functions."
  (interactive)
  (do-symbols (symbol)
    (let* ((function (and (fboundp symbol)
                          (symbol-function symbol)))
           (file (and function
                      (consp function)
                      (eq (car function) 'autoload)
                      (cadr function))))
      (when (and file (member file my-unwanted-libraries))
        (fmakunbound symbol)))))
于 2012-06-09T02:17:30.480 回答
2

由于大部分 Emacs 是用 Emacs Lisp 编写的,并且尽可能多地是自动加载的,因此您不能轻易删除为自动加载设置的函数。例如,c++-mode是一个自动加载的函数,因此删除所有自动加载的函数会阻止您使用c++-mode(除非您添加了自己的副本)。

完成您所要求的事情的最佳方法可能是构建您自己的 Emacs 可执行文件,并限制放入 Emacs 可执行文件本身的内容。这在此处记录。您可以简单地删除您不想要的目录/库,然后重建。新生成的自动加载文件将不包含对这些库中函数的引用,并且您已经准备就绪。

注意:您可能无意中删除了 Emacs 使用的您没有意识到的库。例如,M-x report-emacs-bug使用电子邮件...

您是否有特殊原因要删除这些自动加载的功能?如果您觉得它们使补全变得混乱,那么您可以使用许多补全库来自定义您所看到的内容。

于 2012-06-08T23:08:44.853 回答