我是Emacs软件包的作者,偶尔在处理我的软件包时,我会遇到一个看起来很有用的函数并在我的代码中使用它。然后,在我发布后不久,有人使用较旧的Emacs版本(但仍然是我想支持的版本)将报告该函数未定义,并且我意识到此函数最近才被添加到最新版本的Emacs中,我被迫恢复变化(example)。那么,有没有办法检查首次添加特定功能的Emacs版本?或者更好的方法是,阅读我的整个elisp文件并报告它需要的最低版本的Emacs以及为什么?
我认为蛮力解决方案是安装我想要支持的每个版本的Emacs,并对每个版本进行测试编译。所以我问是否有更好的方法。
答案 0 :(得分:2)
文件etc/NEWS
及其旧版本NEWS.[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
开头(这似乎在较新的条目中有些一致,但在较旧的条目中则较少)并且它将找到搜索的前缀字符串,不一定是完全匹配。
但是,您要查找的更改与此预期格式不匹配。 The commit which added set-default-toplevel-value
只是added a free-form notice to NEWS
,但没有提到它引入了一个新变量。
要实际找到它,我将它放在源树(src/eval.c
)中,并在行上直接git blame
,其中包含直接指向相关提交的定义。 (在一般情况下,您可能需要在层中剥离提交;幸运的是,Git对此类事件有fairly good support。)
答案 1 :(得分:0)
如果您想了解引入特定功能时的Emacs版本,对于Emacs的相对较新版本(版本18和更高版本),则可以搜索etc目录中的NEWS文件。
从https://git.savannah.gnu.org/cgit/emacs.git克隆最新的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工具,我正在寻找与函数字符串转换语法和宏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'.
>