是否有方法检查何时将Emacs Lisp函数添加到Emacs?

是否有方法检查何时将Emacs Lisp函数添加到Emacs?,emacs,elisp,version,backwards-compatibility,Emacs,Elisp,Version,Backwards Compatibility,我是Emacs软件包的作者,有时在处理我的软件包时,我会遇到一个有用的函数,并在代码中使用它。然后,在我发布后不久,使用较旧Emacs版本(但仍然是我想要支持的版本)的人会报告该函数未定义,我意识到该函数最近才添加到最新版本的Emacs中,并且被迫恢复更改()。那么,是否有任何方法可以检查Emacs的版本,其中首先添加了特定的函数?或者更好的方法是,读取我的整个elisp文件并报告它需要的Emacs的最低版本,以及为什么 我想蛮力解决方案是安装我想要支持的每个版本的Emacs,并用它们来测试和编

我是Emacs软件包的作者,有时在处理我的软件包时,我会遇到一个有用的函数,并在代码中使用它。然后,在我发布后不久,使用较旧Emacs版本(但仍然是我想要支持的版本)的人会报告该函数未定义,我意识到该函数最近才添加到最新版本的Emacs中,并且被迫恢复更改()。那么,是否有任何方法可以检查Emacs的版本,其中首先添加了特定的函数?或者更好的方法是,读取我的整个elisp文件并报告它需要的Emacs的最低版本,以及为什么

我想蛮力解决方案是安装我想要支持的每个版本的Emacs,并用它们来测试和编译我的包。所以我想知道是否有更好的方法。

旧版本的文件及其同级
新闻。[12]*
包含自新石器时代以来每个Emacs版本的非常详细的更改历史。(最古老的——也许可以预见——有些不太详细。)

不幸的是,这些信息不是机器可读的形式;但是你仍然可以用一些不太精确的信息四处搜索

这是我拼凑的一个又快又脏的Awk脚本

#!/bin/sh

# Path to your emacs etc directory
emacs_etc=$HOME/git/emacs-snapshot/etc

# Reverse the order of the wildcard matches so we search newest to oldest
printf '%s\n' $emacs_etc/NEWS.[12]* $emacs_etc/NEWS |
tac |

xargs awk -v fn="$1" 'BEGIN { regex="^[*]+ New .*" fn }
    /^\*[^*]/ { version=$NF }
    $0~regex { print version ":" $0; exit 0 }
    END { exit 1 }'
这有点不准确,因为它要求条目以
New
开头(这在较新的条目中似乎有些一致,但在较旧的条目中则不太一致),并且它会找到搜索字符串的前缀,而不一定是完全匹配的

但是,您正在查找的更改与此预期格式不匹配。只是没有提到它引入了一个新的变量


为了真正找到它,我在源代码树(
src/eval.c
)中找到了它,并在包含直接指向相关提交的定义的行上找到了一个简单的
git dull
。(在一般情况下,您可能需要分层剥离提交;幸运的是,Git在这方面做得很好。)

如果您想知道引入特定函数时Emacs的版本,对于相对较新的Emacs版本(版本18及更高版本),那么您可以搜索位于etc目录中的新闻文件

从克隆最新的Emacs版本git repo

然后,您可以grep搜索emacs/etc目录中的函数名,其中包含新闻文件:

NEWS       NEWS.18    NEWS.20    NEWS.22    NEWS.24    NEWS.26
NEWS.1-17  NEWS.19    NEWS.21    NEWS.23    NEWS.25    NEWS.27
这将取决于你在寻找什么,但如果你要寻找的名字足够清晰,你应该在里面找到一些东西

使用优秀的ripgrep工具,我一直在寻找与函数字符串to syntax和宏defvar local相关的信息,这就是我得到的:

> rg string-to-syntax
NEWS.21
3031:** The new function `string-to-syntax' can be used to translate syntax
3038:  (string-to-syntax "()")
> 
> rg defvar-local
NEWS.24
2189:** New macros `setq-local' and `defvar-local'.
> 

我认为解决这个问题的通常方法是使用您想要支持的最旧的Emacs对您的文件进行字节编译,并查看警告。OTOH,让你的用户为你做这项工作有一个好处,那就是它还可以为你提供反馈,告诉你你还应该关心哪些版本的Emacs。听起来你的建议是最好的,而不需要在每个Emacs版本上安装和测试。