【问题标题】:Emacs Ruby autocomplete almost workingEmacs Ruby 自动完成功能几乎可以正常工作
【发布时间】:2011-12-20 19:19:27
【问题描述】:

我一直在使用 Rsense 更新我的 emacs 配置,以允许在键入代码时出现自动完成下拉框。这在大多数文件中都很有效,除了我发现当我在我的 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))))

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

【问题讨论】:

  • 自动补全功能用在ruby、C++、lisp等各种语言中
  • 我的意思是,这里使用的宏在哪里?
  • 我主要使用rails宏在MVC中不同文件之间跳转,启动DB/server/console/etc。
  • 你能提取你的解决方案来回答,并给它“有效”的票吗?
  • przemo_li,如果我对此有答案,我会的,但是当您安装 rails.el 插件并且您尝试在 rails 次要模式源代码文件中自动完成时,自动完成仍然不起作用.

标签: ruby-on-rails-3 emacs ide elisp


【解决方案1】:

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

不幸的是,如果 body 中的代码具有副作用,意在故意更改 (rails-project:root) 返回的值,则它不会产生任何影响。即使在 body 中调用的其他代码也不会看到该更改,因为 Emacs lisp 具有 flet 名称的动态绑定。

【讨论】:

    猜你喜欢
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多