2009-12-11 29 views
2

我设置的emacs作为我的Ruby开发环境。我通过执行M-x编译然后进行耙测试来运行测试。我已经设立适当的编译错误的正则表达式,ALIST使得得到的编译缓冲可以识别测试失败,并让他们点击,但我面对的麻烦编译找到文件使用正确的目录下找到从文件。 想我逛文件PROJ家用/测试/红宝石测试file.rb和命中M-X编译,然后使用“耙测试”的编译命令。生成的编译缓冲区将“proj-home/test /”设置为默认目录,而rake测试输出有错误user [./test/ruby-test-file.rb:nn]。所以当compile-find-file试图找到错误信息中指定的文件时,它会在“proj-home/test /./test/ruby-test-file.rb”中查找,这显然是错误的。的Emacs:导航编译错误

如何使编译找到文件在正确的地方看?我花了一段时间调试函数,并阅读compile.el中的函数定义,但没有喜悦。 有一点让我感到惊讶的是,从外壳cd'd到“proj-home/test”正确地运行耙测试运行测试(即使耙文件在“proj-home”中,而不是“proj-home”/test“),所以它看起来像耙有一些内置的智能,它允许它搜索目录树,并找到父目录中的Rakefile。

这种智能抽佣可能会造成混乱的Emacs,什么是当前目录下就应该使用。

emacs维基在这里:http://www.emacswiki.org/emacs/CompileCommand有一个代码片段,通过搜索父目录(位于“使用最近的Makefile运行Make”)来查找文件,但是我仍然没有弄清楚是否需要使用该文件代码片段。

回答

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) 

您可能需要使用更多的东西巧妙的设置正确的目录,并知道它是否应该被设置或否(也许使用你给出的代码片段之一),但是想法是使用这段代码来改变编译函数而不重新定义它。

+0

这肯定让我更接近的解决方案 - 关键是要设置默认目录中的编译命令。 我不清楚为什么你建议我使用一个建议,而不是修改编译命令来使用函数来找到正确的默认目录。建议是因为有建议,任何改变都会成为我的.emacs的一部分,所以不会被emacs升级吹走? – Rohith 2009-12-14 16:54:40

+0

嗯,我不喜欢重新定义一个预先存在的功能:这意味着大量的复制和粘贴,代码重复...... 当然,未来升级可能会有问题,但不仅仅是:函数可能会在它后面加载已经被告知,事情会以你的身份发生。但是如果你重新定义了它,并且在它重新定义之后被加载,那么将使用原始定义。 – 2009-12-16 19:39:19

0

我终于用下面的代码来设置编译命令的默认目录由雷米

(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))) 

使用此设置在编译命令的默认目录帮助我得到正确的行为的建议。