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


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

вот моя установка: https://github.com/map7/simple_emacs

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

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

"test".up...

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

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

обновление:

обнаружил, что проблема с (require 'rails), так что это что-то в плагине emacs-rails что автозаполнение не нравится.

обновление:

это в рамках emacs-rails - > rails-project.Эль. Если я комментирую этот макрос, то автозаполнение работает, иначе это не так:

(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 131

1 ответ:

вот мысль: макрос связывает a flet функции (rails-project:root) один раз в стоимость, что (rails-project:root) только до body выполняет. (Вот как он утверждает увеличение производительности: по-видимому, внешний (rails-project:root) дорого, поэтому вызов один раз и кэширование значения кажется хорошей идеей.)

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