Emacs:导航到编译错误

时间:2009-12-11 05:33:32

标签: ruby emacs compilation rake

我正在设置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”下),但我还是没有想出我是否需要/何处需要使用该代码段。

2 个答案:

答案 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帮助我获得了正确的行为。