User Lisp Directory

https://cgit.git.savannah.gnu.org/cgit/emacs.git/commit/?id=1b931fbe42bdad1507768872dfe034caa236adab

1 个赞

人肉chatgpt proxy来了


概览

  • Emacs 新增了一个 “用户 Lisp 目录(User Lisp Directory)” 机制,在启动时自动处理某个目录里的 Lisp 文件。
  • 新增了若干用户选项和一个命令,用来控制这个目录如何被扫描、编译以及加入 load-path

用户 Lisp 目录

  • 默认路径

    • ~/.config/emacs/user-lisp/
    • ~/.emacs.d/user-lisp/
  • 启动时的行为(如果该目录存在):

    • 扫描文件中的 autoload 标记(cookies),让这些文件里的命令等可以在不手动 load 的情况下使用。
    • 对所有 Lisp 文件进行 字节编译,如果系统支持,还会进行 原生编译
    • 调整 load-path,使这些文件可以被正常 load 或 autoload。
  • 该目录在 加载普通 init 文件之前 就会被处理,因此相关设置需要在 early-init.el 中完成。


新增用户选项

  • user-lisp-directory

    • 指定一个目录,其中的 Lisp 文件会:

      • 被字节编译;
      • 被扫描 autoload;
      • 被加入 load-path
    • 编译和 autoload 扫描是懒执行的,只在文件时间戳发生变化时才重新进行。

    • 必须在 early-init 中设置;如果通过 Customize 设置,需要把该设置保存到 early-init-file

  • user-lisp-auto-scrape(默认:t

    • t 时:启动时自动处理 user-lisp-directory
    • nil 时:启动不做自动处理,需要你手动调用 prepare-user-lisp
    • 同样必须在 early-init 中设置。
  • user-lisp-ignored-directories

    • 一个目录名列表(如 .gitCVS 等),prepare-user-lisp 在递归时不会进入这些目录。
    • 用来排除不含 Lisp 文件的管理目录或无关目录。

新命令:prepare-user-lisp

  • 用途:准备 user-lisp-directory 中的文件:

    • 字节编译;
    • 扫描 autoload;
    • 让这些 Lisp 文件在当前会话中可用。
  • 参数(核心行为)

    • JUST-ACTIVATE(可选):

      • 非 nil 时,跳过字节编译和 autoload 扫描,仅激活已有的 autoload 信息。
    • AUTOLOAD-FILE(可选):

      • 指定写入 autoload 数据的文件;如果为 nil,则写在该目录旁边的一个文件中。
    • FORCE(可选 / 前缀参数):

      • 非 nil 或交互式调用时使用前缀参数,则无条件重建 autoload 文件并重新编译所有文件
  • 启动时,command-line 会在以下条件满足时自动调用:

    • user-lisp-directory 存在,且
    • user-lisp-auto-scrape 没有被关闭。

与包系统的关系

  • 用户 Lisp 目录比包管理系统更 简单

    • 没有自动依赖解析;
    • 没有自动升级;
    • 没有自动生成和注册文档的功能。
  • 更适用于:

    • 只给自己用的个人代码
  • 也可以用于:

    • 第三方包或你自己维护的包,只是不会享受包管理器的那些高级功能。

NEWS 中的要点

  • 从 Emacs 31 开始,如果你的配置目录里有 user-lisp 目录:

    • 其中所有子目录里的 Lisp 文件会被递归地字节编译、扫描 autoload,并加入 load-path
  • 你可以:

    • user-lisp-auto-scrape 关闭自动处理;
    • user-lisp-directory 指向系统中任意其他目录;
    • 在任何时候手动运行 prepare-user-lisp(推荐在升级 Emacs 后带前缀参数运行,以强制重建所有生成文件)。
8 个赞

感觉是把 borg 的一小部分代码抽取出来做的功能 lol。

ps2: 每次启动时都递归判断文件是否要重新扫描 autoload 和重新 byte-compile,感觉还挺影响启动速度的。至少 straight 是用时间戳来判断要不要重新编译的,我安装了大约 80 个包,启动速度的影响有 0.6s 左右。我是因此把 straight-check-for-modifications 给关掉了。如果感觉对启动速度的影响明显,可以考虑关掉 user-lisp-auto-scrape。

这个是作者的一些缘由

user-lisp-directory刚出的还有一些小bug,好像最近两天才修好,这个东西作为site-lisp平替挺合适的