【问题标题】:Emacs elisp expand-file-name behaviour on windowsWindows 上的 Emacs elisp 扩展文件名行为
【发布时间】:2012-05-19 02:46:46
【问题描述】:

在使用 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 转换为绝对文件名,并将其规范化。 如果 NAME 是相对的,第二个参数 DEFAULT-DIRECTORY 是开始的目录 (不以斜线或波浪号开头);如果 DEFAULT-DIRECTORY 为 nil 或缺失, 使用当前缓冲区的“默认目录”值。

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

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

我们可以认为扩展文件名在 Windows 上是错误的吗?还是只是在 autoload.el 中使用错误?

提前谢谢你。

【问题讨论】:

  • 第一条路径应该以c: 开头吗?
  • @phils 嗨,不,它不是以 C 开头的:但一切都很好:C:\home\ngulyamov>set HOME HOME=C:\home\ngulyamov C:\home\ngulyamov>env | grep HOME HOME=/home/ngulyamov C:\home\ngulyamov>ls /home/ngulyamov ... file list ....
  • 这显然是某种我以前从未见过的 Windows shell,如果它使用正斜杠,并接受ls 作为命令。 (那是 Windows 7 吗?)
  • @phils 不,它只是一个普通的 cmd.exe,我已经安装了 cygwin 并且它的 bin 目录在我的 PATH 中。它是 Windows XP。
  • Emacs 是否配置为与 Cygwin 集成?如果是这样,那可能是一个相关点。

标签: emacs elisp


【解决方案1】:

终于找到原因了。问题来自 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 指向开发者的计算机路径仍然是打开的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    相关资源
    最近更新 更多