Emacs Ruby自动完成几乎工作

我一直在使用Rsense更新emacsconfiguration,以允许在input代码时出现自动完成下拉框。 这在大多数文件中都能正常工作,除非我在Ruby on Rails项目中编辑一些代码时,发现它不允许我从表中select一个答案。

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

我在Ubuntu 10.04下使用这个。

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

"test".up... 

就像我在上面显示的选项列表中input“p”字符一样,我可以用箭头键在列表中上下选中,然后用回车键select一个(例如:upcase)。

什么不工作是当我做完全相同的testing,但在一个铁路项目的基本目录。

更新:

发现问题出在(需要'rails'),所以它在emacs-rails插件中是自动完成不喜欢的东西。

更新:

它在emacs-rails – > rails-project.el中。 如果我评论这个macros,然后自动完成工作,否则它不:

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

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

这里有一个想法:macros一次绑定一个flet函数(rails-project:root)(rails-project:root)刚好在body执行之前的值。 (这就是它声称性能增加的原因:显然,外部(rails-project:root)是昂贵的,所以调用一次并caching值似乎是一个好主意。

不幸的是,如果在代码中有一个副作用意味着有意改变(rails-project:root)返回的值,那么这个代码将没有任何效果。 因为Emacs lisp具有flet名称的dynamic绑定, flet这个改变对于其他在body内调用的代码是不可见的。