在使用el-get安装最后一个cedet时,我在windows上遇到了expand-file-name函数的奇怪行为.该问题与自动加载的生成有关.
最后一个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))))
Run Code Online (Sandbox Code Playgroud)
在我的例子中,generated-autoload文件是:
"/home/ngulyamov/.emacs.d/el-get/cedet/lisp/cedet/srecode/loaddefs.el"
Run Code Online (Sandbox Code Playgroud)
因为我有$ HOME $环境变量指向C:/ home/ngulyamov.在这种情况下,上面的函数返回
"d:/home/ngulyamov/.emacs.d/el-get/cedet/lisp/cedet/srecode/loaddefs.el"
Run Code Online (Sandbox Code Playgroud)
由于源目录包含:
"d:/devel/emacs/emacs-bzr/trunk_jenkins/".
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它将驱动器号从C:更改为D:.同时在emacs 23.3上,此函数返回半正确值,因为source-directory包含值:
"c:/Users/Sean/Downloads/emacs-23.3/".
Run Code Online (Sandbox Code Playgroud)
根据expand-file-name函数说明:
(expand-file-name NAME&optional DEFAULT-DIRECTORY)
将文件名NAME转换为绝对值,并将其规范化.如果NAME是相对的(不以斜线或波浪线开头),则第二个arg DEFAULT-DIRECTORY是要开始的目录 ; 如果DEFAULT-DIRECTORY为零或缺失,则使用当前缓冲区的"default-directory"值.
Windows上的路径永远不会从斜线或波浪线开始.
现在我的问题:1.在Windows上,expand-file-name函数行为是否正确?2.为什么source-directory包含开发人员路径的值?
我们可以将expand-file-name视为Windows上的bug吗?或者它在autoload.el中被错误地使用了?
先感谢您.
终于我明白了原因。该问题来自 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
Run Code Online (Sandbox Code Playgroud)
所以肮脏的修复是在 autoload.el 本身中指定源目录,例如:
(setq-default source-directory "C:/home/ngulyamov/.emacs.d/")
Run Code Online (Sandbox Code Playgroud)
无论如何,为什么源目录指向开发人员的计算机路径仍然保持开放。