有没有办法检查Emacs Lisp函数何时添加到Emacs?

时间:2015-12-02 02:34:59

标签: emacs elisp version backwards-compatibility

我是Emacs软件包的作者,偶尔​​在处理我的软件包时,我会遇到一个看起来很有用的函数并在我的代码中使用它。然后,在我发布后不久,有人使用较旧的Emacs版本(但仍然是我想支持的版本)将报告该函数未定义,并且我意识到此函数最近才被添加到最新版本的Emacs中,我被迫恢复变化(example)。那么,有没有办法检查首次添加特定功能的Emacs版本?或者更好的方法是,阅读我的整个elisp文件并报告它需要的最低版本的Emacs以及为什么?

我认为蛮力解决方案是安装我想要支持的每个版本的Emacs,并对每个版本进行测试编译。所以我问是否有更好的方法。

2 个答案:

答案 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'.
>