2015-12-02 57 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版本可以做。 –