Emacs Ruby自动完成几乎正常工作

map*_*ap7 132 ide emacs elisp ruby-on-rails-3

我一直在使用Rsense更新我的emacs配置,以允许在键入代码时出现自动完成下拉框.这在大多数文件中运行良好,除了我发现当我在ruby on rails项目中编辑一些代码时,它不允许我从表中选择答案.

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

我在Ubuntu 10.04下使用它.

对于简单的ruby脚本文件,它工作得很好.我可以打开一个新文件并输入.

"test".up...
Run Code Online (Sandbox Code Playgroud)

就像我输入'p'字符一样,出现了一个选项列表,我可以用箭头键在列表中上下移动,然后用回车键选择一个(例如:upcase).

什么不起作用是当我做一个完全相同的测试,但在rails项目的基本目录中.

更新:

发现问题在于(需要'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))))
Run Code Online (Sandbox Code Playgroud)

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

Gen*_*ene 7

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

不幸的是,如果里面的代码body有副作用意味着故意改变(rails-project:root)返回的值,那么它将没有任何效果.即使对于在其中调用的其他代码,该更改也是不可见的,body因为Emacs lisp具有flet名称的动态绑定.