如何解决Emacs自动加载时出现的`file missing`错误?
问题:
loaddefs-generate生成的autoload文件路径错误导致加载失败 我在使用loaddefs-generate函数生成并加载autoload.el文件时遇到问题:生成的文件中使用了相对路径(如../../autoload/package),导致Emacs启动时报错找不到对应文件。手动修改为绝对路径可解决问题,但这不是长期可行的方案。
实现代码(core-autoload.el)
;;; core-autoload.el -*- lexical-binding: t; -*- (defvar generated-autoload-file nil "This is neccessary, otherwise raise error. `Defining as dynamic an already lexical var`.") (defvar chidori-autoload-file (expand-file-name "autoload.el" chidori-cache-dir) "Autoload file.") (defun chidori-autoload/generate-define (loaddef &rest DIRS) "LOADDEF DIRS." (let ((generated-autoload-file loaddef)) (when (or (not (file-exists-p generated-autoload-file)) noninteractive) (loaddefs-generate DIRS chidori-autoload-file)))) (defun chidori-autoload/reload () "Generate autoload file from `core/autoload'." (interactive) (when (file-exists-p chidori-autoload-file) (delete-file chidori-autoload-file t) (message "delete old autoload file: %s" chidori-autoload-file)) (chidori-autoload/generate-define chidori-autoload-file chidori-autoload-dir) (load chidori-autoload-file nil 'nomessage) (message "generate autoload file: %s done." chidori-autoload-file)) (unless (file-exists-p chidori-autoload-file) (chidori-autoload/reload)) (load chidori-autoload-file nil 'nomessage) (provide 'core-autoload) ;; core-autoload.el ends here
生成的autoload.el部分内容
;;; autoload.el --- automatically extracted autoloads (do not edit) -*- lexical-binding: t -*- ;; Generated by the `loaddefs-generate' function. ;; This file is part of GNU Emacs. ;;; Code: ;;; Generated autoloads from ../../autoload/package.el (autoload 'package! "../../autoload/package") ;;; and many other autoloads
错误信息
启动Emacs时出现以下错误:
(file-missing "Cannot open load file" "No such file or directory" "../../autoload/package")
系统信息
- OS: macOS 12.6
- Emacs版本: emacs-plus@29
- 终端: Wezterm
- Shell: fish
解决方案
原因分析
生成的相对路径是相对于autoload.el所在的缓存目录,但Emacs加载autoload.el时,会以启动时的工作目录为基准查找文件,而非autoload.el的目录,因此无法找到目标文件。
解决步骤
将项目根目录加入load-path
假设你的项目根目录变量为chidori-project-dir,在加载core-autoload.el前添加:(add-to-list 'load-path chidori-project-dir)修改
loaddefs-generate调用,传入前缀参数
修改chidori-autoload/generate-define函数,调用loaddefs-generate时传入项目根目录作为前缀,这样生成的路径会自动去掉根目录前缀,变成load-path可识别的相对路径:(defun chidori-autoload/generate-define (loaddef &rest DIRS) "LOADDEF DIRS." (let ((generated-autoload-file loaddef)) (when (or (not (file-exists-p generated-autoload-file)) noninteractive) ;; 传入项目根目录作为第三个参数(前缀) (loaddefs-generate DIRS chidori-autoload-file chidori-project-dir))))确保目录参数为绝对路径
检查chidori-autoload-dir是否为绝对路径,如果不是,定义时用expand-file-name转换:(defvar chidori-autoload-dir (expand-file-name "autoload" chidori-project-dir) "Directory containing autoload source files.")
完成以上修改后,生成的autoload.el中会出现类似(autoload 'package! "autoload/package")的路径,Emacs可通过load-path直接找到对应文件,无需手动修改路径。
内容的提问来源于stack exchange,提问作者babygau
相关产品推荐
相关产品推荐

