1. ホーム
  2. ruby-on-rails-3

[解決済み] EmacsのRubyオートコンプリートがほぼ使えるようになった

2022-07-09 12:51:28

質問

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

以下は私の設定です。 https://github.com/map7/simple_emacs

Ubuntu 10.04で使用しています。

単純な ruby スクリプト ファイルでは、とてもうまくいきます。私は新しいファイルを開いて、タイプすることができます。

"test".up...

p' 文字を up に入力すると、オプションのリストが表示され、矢印キーでリストを上下に移動し、エンターキーで 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))))

なぜこれがオートコンプリートを壊してしまうのか、誰か説明してください。

どのように解決するのですか?

ここで思いつくことがあります。マクロは flet 関数 (rails-project:root) という値に一度だけ (rails-project:root) の直前にある body が実行される直前に、が実行されます。どうやら外側の (rails-project:root) は高価なので、一度呼び出して値をキャッシュするのは良いアイデアだと思われます)。

残念ながら、もし body の中にあるコードが、意図的に (rails-project:root) が返す値を変更するような副作用がある場合、それは何の影響も及ぼさないでしょう。 その変更は body の中で呼ばれる他のコードには見えないからです。 flet という名前のダイナミックバインディングがあるからです。