You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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的目录,因此无法找到目标文件。

解决步骤

  1. 将项目根目录加入load-path
    假设你的项目根目录变量为chidori-project-dir,在加载core-autoload.el前添加:

    (add-to-list 'load-path chidori-project-dir)
    
  2. 修改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))))
    
  3. 确保目录参数为绝对路径
    检查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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 20:15:29