2011-11-03 57 views
131

我一直在使用Rsense更新emacs配置,以允许在输入代码时出现自动完成下拉框。这在大多数文件中都能很好地工作,除非我发现它不允许我在ruby on rails项目中编辑一些代码时从表中选择答案。Emacs Ruby自动完成工作

这里是我的设置: https://github.com/map7/simple_emacs

我使用这个的Ubuntu 10.04之下。

对于简单的ruby脚本文件,它的效果很好。我可以打开一个新文件并输入。

"test".up... 

正如我在了选项列表中键入“P”字出现,我就可以去向上和向下箭头键列表,然后选择一个(例如:upcase)与回车键。

什么不行,当我做完全相同的测试,但在一个rails项目的基本目录。

更新:

发现问题是(需要“轨),所以它的东西在Emacs的-Rails插件的自动完成不喜欢。

更新:

这是emacs的护栏内 - >轨-project.el。如果我评论此宏然后进行自动完成工作,否则它不会:

(defmacro* rails-project:with-root ((root) &body body) 
    "If you use `rails-project:root' or functions related on it 
several times in a block of code, you can optimize your code by 
using this macro. Also, blocks of code will be executed only if 
rails-root exist. 
(rails-project:with-root (root) 
    (foo root) 
    (bar (rails-core:file \"some/path\"))) 
" 
`(let ((,root (rails-project:root))) 
    (when ,root 
     (flet ((rails-project:root() ,root)) 
     ,@body)))) 

有人可以解释为什么这打破自动完成?

+1

它在哪里使用? – milkypostman

+1

自动完成功能用于红宝石,C++,lisp和一切 – map7

+1

我的意思是,这里使用的宏在哪里? – milkypostman

回答

6

这里有一个想法:该宏将flet函数(rails-project:root)一次绑定到(rails-project:root)就在执行body之前的值。 (这就是它声称的性能提升。显然,外(rails-project:root)是昂贵的,因此调用一次,并缓存值似乎是一个好主意)

不幸的是,如果存在有故意意味着副作用body内码要更改(rails-project:root)返回的值,它将不起作用。即使在body中调用的其他代码也无法看到该更改,因为Emacs lisp具有flet名称的动态绑定。