我一直在使用 Rsense 更新我的 emacs 配置,以允许在输入代码时出现自动完成下拉框。这在大多数文件中都很有效,除了我发现当我在我的 ruby on rails 项目中编辑一些代码时,它不允许我从表中选择答案。
这是我的设置:https://github.com/map7/simple_emacs
我在 Ubuntu 10.04 下使用它。
对于简单的 ruby 脚本文件,它工作得很好。我可以打开一个新文件并输入。
"test".up...
就像我在 up 中键入“p”字符时会出现一个选项列表,我可以使用箭头键在列表中上下移动,然后使用 enter 键选择一个(例如:大写)。
当我在 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))))
有人可以解释为什么这会破坏自动完成功能吗?
这里有一个想法:宏将一个 flet
函数 (rails-project:root)
绑定到 (rails-project:root)
在 body
执行之前的值。 (这就是它声称性能提升的方式:显然外部 (rails-project:root)
很昂贵,因此调用一次并缓存该值似乎是个好主意。)
不幸的是,如果 body
中的代码具有有意更改 (rails-project:root)
返回值的副作用,则它不会产生任何影响。即使在 body
中调用的其他代码也看不到该更改,因为 Emacs lisp 具有 flet
名称的动态绑定。
不定期副业成功案例分享