我一直在使用Rsense更新我的emacs配置,以便在输入代码时显示自动完成下拉框。这在大多数文件中运行良好,除了我发现当我在我的ruby on rails项目中编辑一些代码时,它不允许我从表中选择答案。
这是我的设置: https://github.com/map7/simple_emacs
我在Ubuntu 10.04下使用它。
对于简单的ruby脚本文件,它工作得很好。我可以打开一个新文件并输入。
"test".up...
正如我输入选项列表中的'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))))
有人可以解释为什么会破坏自动完成功能吗?
答案 0 :(得分:7)
以下是一个想法:宏将flet
函数(rails-project:root)
绑定到(rails-project:root)
执行body
之前的值。 (这就是它声称性能提升的方式:显然外部(rails-project:root)
是昂贵的,所以调用一次并缓存该值似乎是一个好主意。)
不幸的是,如果body
中的代码有副作用意味着故意改变(rails-project:root)
返回的值,那么它将无效。即使对于body
内调用的其他代码,该更改也是不可见的,因为Emacs lisp具有flet
名称的动态绑定。