コードの入力中にオートコンプリートドロップダウンボックスが表示されるように、Rsenseを使用してemacs構成を更新しています。これは、Ruby on Railsプロジェクト。
これが私の設定です: https://github.com/map7/simple_emacs
私はこれをUbuntu 10.04で使用しています。
単純なRubyスクリプトファイルの場合、それはうまく機能します。新しいファイルを開いて入力できます。
"test".up...
上に「p」文字を入力するのと同じように、オプションのリストが表示され、矢印キーでリストを上下に移動して、Enterキーで1つ(例:大文字)を選択できます。
まったく機能しないのは、同じテストを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)
がbody
を実行する直前に(Rails-project:root)
が持つ値に一度バインドします。 (それがパフォーマンスの向上を主張する方法です:どうやら外側の(Rails-project:root)
は高価であるため、一度呼び出して値をキャッシュするのは良い考えのようです。)
残念ながら、body
内に、(Rails-project:root)
が返す値を意図的に変更することを意図した副作用があるコードがある場合、そのコードは効果がありません。 Emacs LISPにはbody
名の動的バインディングがあるため、その変更はflet
内で呼び出された他のコードからも見えません。