web-dev-qa-db-ja.com

Emacs Rubyオートコンプリートがほぼ機能しています

コードの入力中にオートコンプリートドロップダウンボックスが表示されるように、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))))

これがオートコンプリートを壊す理由を誰かが説明できますか?

132
map7

ここに考えがあります:マクロはflet関数を(Rails-project:root)bodyを実行する直前に(Rails-project:root)が持つ値に一度バインドします。 (それがパフォーマンスの向上を主張する方法です:どうやら外側の(Rails-project:root)は高価であるため、一度呼び出して値をキャッシュするのは良い考えのようです。)

残念ながら、body内に、(Rails-project:root)が返す値を意図的に変更することを意図した副作用があるコードがある場合、そのコードは効果がありません。 Emacs LISPにはbody名の動的バインディングがあるため、その変更はflet内で呼び出された他のコードからも見えません。

7
Gene