Emacs Ruby自动完成功能几乎可以正常工作


132

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

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

我在Ubuntu 10.04下使用它。

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

"test".up...

就像我在向上键入“ p”字符时,会出现一个选项列表,并且我可以使用箭头键在列表中上移和下移,然后使用Enter键选择一个(例如,大写)。

什么时候不行,是当我在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
自动完成功能在红宝石,C ++,Lisp和一切使用
map7

1
我的意思是,这里的宏在哪里使用?
milkypostman 2012年

1
我主要使用rails宏在MVC中的不同文件之间跳转,并启动DB / server / console / etc。
map7 2012年

1
您可以提取解决方案来回答问题并给它“工作”票吗?
przemo_li 2012年

2
przemo_li,如果我对此有一个答复,我会这样做,但是当您安装了rails.el插件并且试图在Rails次要模式源代码文件中自动完成时,自动完成仍然无法正常工作。
map7 '10 -4-10

Answers:


7

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

不幸的是,如果里面的代码body有副作用,意味着有意更改(rails-project:root)返回的值,那么它将没有效果。即使bodyEmacs lisp具有动态绑定的flet名称,该更改甚至对于内部调用的其他代码也将是看不见的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.