6

在使用 el-get 安装最后一个 cedet 期间,我在 Windows 上遇到了扩展文件名函数的奇怪行为。该问题与自动加载的生成有关。

最后一个 emacs 24.1.50 上的 autoload.el 包含以下功能:

(defun autoload-generated-file ()
  (expand-file-name generated-autoload-file
                ;; File-local settings of generated-autoload-file should
                ;; be interpreted relative to the file's location,
                ;; of course.
                (if (not (local-variable-p 'generated-autoload-file))
                    (expand-file-name "lisp" source-directory))))

在我的情况下,生成的自动加载文件是:

"/home/ngulyamov/.emacs.d/el-get/cedet/lisp/cedet/srecode/loaddefs.el" 

因为我有指向 C:/home/ngulyamov 的 $HOME$ 环境变量。在这种情况下,上面的函数返回:

"d:/home/ngulyamov/.emacs.d/el-get/cedet/lisp/cedet/srecode/loaddefs.el" 

由于源目录包含:

"d:/devel/emacs/emacs-bzr/trunk_jenkins/".

如您所见,它将驱动器号从 C: 更改为 D:。同时在 emacs 23.3 上,此函数返回半正确值,因为源目录包含值:

"c:/Users/Sean/Downloads/emacs-23.3/".

根据expand-file-name函数描述:

(expand-file-name NAME &optional DEFAULT-DIRECTORY)

将文件名 NAME 转换为绝对文件名,并将其规范化。第二个参数 DEFAULT-DIRECTORY 是目录,如果 NAME 是相对的 (不以斜杠或波浪号开头);如果 DEFAULT-DIRECTORY 为 nil 或缺失,则使用当前缓冲区的 `default-directory' 值。

Windows 上的路径从不以斜杠或波浪线开头。

现在我的问题是: 1. expand-file-name 函数的行为在 Windows 上是否正确?2. 为什么 source-directory 包含开发者路径的值?

我们可以将扩展文件名视为 Windows 上的错误吗?或者它只是在 autoload.el 中被错误地使用了?

先感谢您。

4

1 回答 1

2

最后我找到了原因。问题来自 cedet 的 Makefile,它使用了 make 3.8 的 $(abspath) 功能。在这种情况下,cygwin 版本的 make 返回 UNIX 路径方式,即 /home/ngulyamov/... 然后在自动加载中由源目录根目录替换为 d:/home/ngulyamov/...。 GnuWin32 版本的 make工作正常但奇怪的原因我有以下问题:

C:\home\ngulyamov\.emacs.d\el-get\cedet>\gnuwin32\bin\make all
Removing loaddefs.el files from subprojects.
Generating autoloads.
make[1]: Entering directory `C:/home/ngulyamov/.emacs.d/el-get/cedet/lisp/cedet'
    > autoloads
Wrote C:/home/ngulyamov/.emacs.d/el-get/cedet/lisp/cedet/loaddefs.el
Loading vc-bzr...
Generating autoloads for C:/home/ngulyamov/.emacs.d/el-get/cedet/lisp/cedet/cedet-android.el...
Memory exhausted--use C-x s then exit and restart Emacs
make[1]: *** [autoloads] Error 127

所以肮脏的修复是在 autoload.el 本身中指定源目录,例如:

(setq-default source-directory "C:/home/ngulyamov/.emacs.d/")

无论如何,为什么 source-directory 指向开发人员的计算机路径仍然是开放的。

于 2012-05-14T13:05:55.367 回答