防止来自Emacs的不需要的命令被加载到完成和帮助缓冲区

时间:2012-06-08 22:10:41

标签: emacs

我开始开发自己的Emacs环境,我有一个自定义init.el(如下所示),它从我的用户目录加载库并忽略已安装的目录。我没有在用户目录中放置任何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/")
    )
)

2 个答案:

答案 0 :(得分: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库可能也很有用。

修改

实际上,检查自动加载文件似乎是相当安全的方法,用于确定是否要消除某些内容。我相信这只适用于功能;据我所知,其他种类的自动加载对象只是由loaddef立即定义。你可以根据符号名做出假设,但我不推荐它(但是我不会做任何这个,所以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)))))

答案 1 :(得分:2)

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

可能最好的方法就是建立自己的Emacs可执行文件,并限制放入Emacs可执行文件本身的内容。记录在案here。您可以简单地删除您不想要的目录/库,然后重建。新生成的自动加载文件不包含对这些库中的函数的引用,您将全部设置。

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

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