2015-12-02 30 views
3

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

我想蛮力解决方案是安装我想支持的每个Emacs版本,并测试每个版本的包。所以我问是否有更好的方法。

+2

我认为这个问题的通常解决方案是用最古老的Emacs你想支持,并看看警告。 OTOH让您的用户为您完成这项工作的优势在于,它还会为您提供有关您应该关心哪些Emacs版本的反馈。 – Stefan

回答

2

NEWS.[12]*文件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这种东西。)

+0

听起来像你的建议是最好的,没有安装和测试每个emacs版本可以做。 –