我正在设置emacs作为我的ruby开发环境。我通过执行M-x编译然后进行rake测试来运行测试。我已经适当地设置了compile-error-regexp-alist,以便生成的编译缓冲区可以识别测试失败并使它们可以点击,但是我遇到了使编译查找文件使用正确的目录从中找到文件的问题。 。 假设我正在访问文件proj-home / test / ruby-test-file.rb并点击M-x编译,然后使用“rake test”进行编译命令。生成的编译缓冲区将“proj-home / test /”设置为default-directory,而rake测试输出具有错误user [./test/ruby-test-file.rb:nn]。因此,当compile-find-file尝试查找错误消息中指定的文件时,它会查找“proj-home / test /./ test / ruby-test-file.rb”,这显然是错误的。
如何让compile-find-file在正确的位置查找?我花了很多时间调试函数并通读compile.el中的函数定义,但还没有快乐。 让我感到惊讶的一件事是,从shell内部运行rake测试cd'd到“proj-home / test”正确运行测试(即使'Rakefile在“proj-home”而不是“proj-home /”测试“),所以看起来rake内置了一些智能,它允许它搜索目录树并在父目录中找到Rakefile。
rake中的这种情报可能会使emacs混淆它应该使用的当前目录是什么。
这里的emacs wiki:http://www.emacswiki.org/emacs/CompileCommand有一个代码片段,可以通过搜索父目录找到一个文件(在“使用最接近的Makefile运行Make”下),但我还是没有想出我是否需要/何处需要使用该代码段。
答案 0 :(得分:2)
您可以尝试定义有关编译的建议以设置正确的默认目录:
(defadvice compile (around set-rail-test-dir (command &optional comint))
"set the correct directory"
(if (and (string-match "rake test" command)
(string-match "\(.*\)/test/$" default-directory))
(let ((default-directory (match-string 1 default-directory)))
ad-do-it)
ad-do-it))
(ad-activate 'compile)
您可能希望使用更聪明的东西来设置正确的目录,并知道它是否应该设置或不使用(可能使用您提供的代码片段之一),但想法是使用此代码更改编译函数而不重新定义它。
答案 1 :(得分:0)
我最终使用以下代码在Remi
建议的compile命令中设置default-directory (defun ancestor-directory-with (file-name &optional directory)
(let ((dir (or directory default-directory))
(root (expand-file-name "/"))) ;the win32 builds should translate this correctly
(if (directory-has-file-p dir file-name)
dir
(if (equal (directory-file-name dir) (directory-file-name root))
default-directory
(ancestor-directory-with file-name (expand-file-name ".." dir))))))
(defun directory-has-file-p (directory file-name)
(file-exists-p (expand-file-name file-name directory)))
使用它在编译命令中设置default-directory帮助我获得了正确的行为。