Emacs Ruby 自动完成几乎工作

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

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

我在 Ubuntu 10.04下使用这个。

对于简单的 Ruby 脚本文件,它工作的很好。我可以打开一个新的文件和类型。

"test".up...

正如我在上面的选项列表中键入“ p”字符,我可以用箭头键在列表中上下移动,然后用回车键选择一个(例如: 大写)。

但是,当我在 Rails 项目的基本目录中进行完全相同的测试时,这种方法就不起作用了。

更新:

发现这个问题是与(需要’轨道) ,所以它的东西在 emacs-ails 插件,自动补全不喜欢。

更新:

如果我注释掉这个宏,那么自动补全就可以工作了,否则它就不工作了:

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

有人能解释一下为什么自动补全会中断吗?

5376 次浏览

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

不幸的是,如果在 body中有一些代码产生了一些副作用,这些副作用意味着要改变 (rails-project:root)返回的值,那么这些副作用将不会产生。因为 Emacs lisp 具有 flet名称的动态绑定,所以即使对于 body中调用的其他代码,这种更改也是不可见的。