Автозаполнение Emacs Ruby почти работает

Я обновляю конфигурацию emacs с помощью Rsense, чтобы отображать раскрывающийся список автозаполнения, пока вы вводите код. Это хорошо работает в большинстве файлов, за исключением того, что я обнаружил, что он не позволяет мне выбрать ответ из таблицы, когда я редактирую код в моем проекте ruby ​​on rails.

Вот моя настройка: https://github.com/map7/simple_emacs

Я использую это под Ubuntu 10.04.

Для простых рубиновых файлов script он отлично работает. Я могу открыть новый файл и ввести его.

"test".up...

Так же, как я набираю символ "p", появляется список параметров, и я могу перейти вверх и вниз по списку со стрелками и выбрать один (например: верхний регистр) с помощью клавиши ввода.

Что не работает, когда я выполняю тот же самый тест, но в базовом каталоге проекта rails.

Update:

Обнаружено, что проблема связана с (требует "рельсов" ), поэтому это что-то в плагине 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) один раз с значением, которое (rails-project:root) имеет перед тем, как выполняется body. (Как он утверждает, что увеличение производительности: по-видимому, внешний (rails-project:root) дорог, поэтому вызов один раз и кеширование значения кажется хорошей идеей.)

К сожалению, если внутри body есть код, имеющий побочный эффект, означающий намеренно изменить значение, возвращаемое (rails-project:root), оно не будет иметь никакого эффекта. Это изменение будет невидимым даже для другого кода, вызываемого в body, потому что Emacs lisp имеет динамическое связывание имен flet.