Emacs Rubyのオートコンプリートがほぼ動作する 質問する

Emacs Rubyのオートコンプリートがほぼ動作する 質問する

私は、Rsense を使用して emacs の設定を更新し、コードの入力中に自動補完ドロップダウン ボックスが表示されるようにしています。これはほとんどのファイルでうまく機能しますが、Ruby on Rails プロジェクトでコードを編集しているときに、テーブルから回答を選択できないことがわかりました。

私の設定は次のとおりです:https://github.com/map7/simple_emacs

私はこれをUbuntu 10.04で使用しています。

シンプルな Ruby スクリプト ファイルの場合はうまく機能します。新しいファイルを開いて入力できます。

"test".up...

「p」文字を入力するとオプションのリストが表示され、矢印キーでリストを上下に移動し、Enter キーで 1 つ (例: 大文字) を選択できます。

まったく同じテストを 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))))

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

ベストアンサー1

ここで考えてみましょう: マクロは、関数を、flet実行直前の(rails-project:root)値に 1 回バインドします。(これがパフォーマンスの向上を主張する方法です。どうやら外側はコストが高いので、1 回呼び出して値をキャッシュするのは良い考えのようです。)(rails-project:root)body(rails-project:root)

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

おすすめ記事