Emacs Ruby自动补全功能几乎可以正常使用。

131
我一直在更新我的emacs配置,使用Rsense实现了代码自动补全下拉框。在大多数文件中,这个功能运行良好,但是我发现在编辑我的ruby on rails项目中的一些代码时,它不能让我从表格中选择答案。
这是我的设置: https://github.com/map7/simple_emacs 我在Ubuntu 10.04下使用这个设置。
对于简单的Ruby脚本文件,它效果很好。我可以打开一个新文件并输入代码。
"test".up...

当我输入 'p' 字符时,出现了一个选项列表,我可以使用箭头键上下移动列表并用回车键选择其中一个选项(例如:大写)。但当我在 Rails 项目的基础目录中进行完全相同的测试时,它不起作用。

更新:

发现问题出在 (require 'rails) 上,所以是 emacs-rails 插件中自动补全不喜欢的东西。

更新:

它在 emacs-rails -> rails-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
自动完成(Autocomplete)功能在Ruby、C++、Lisp以及其它编程语言中都有应用。 - map7
1
我的意思是,这里使用了宏吗? - milkypostman
1
我主要使用Rails宏在MVC中跳转不同的文件并启动DB/server/console等。 - map7
1
你能将你的解决方案提取出来作为答案,并给它一个“可行”标记吗? - przemo_li
2
przemo_li,如果我有答案的话,我会给你的。但是当你安装了rails.el插件并且正在尝试在Rails次要模式源代码文件中自动完成时,自动完成仍然无法工作。 - map7
你能确保在调用宏时,root存在于其作用域中吗? - fdsaas
1个回答

7
这里有个想法:宏将一个flet函数(rails-project:root)绑定一次到body执行前(rails-project:root)的值。(这样声称可以提高性能:显然外部的(rails-project:root)很昂贵,因此调用一次并缓存该值似乎是个好主意。)
不幸的是,如果body内部有代码故意产生副作用以更改(rails-project:root)返回的值,那么它将没有效果。即使在body中调用其他代码,这种更改对其他代码也是不可见的,因为Emacs Lisp具有动态绑定flet名称的特性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接