Emacs Ruby с автозаполнением почти работает - PullRequest
131 голосов
/ 03 ноября 2011

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

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

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

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

"test".up...

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

Что не работает, так это когда я делаю тот же тест, но в базовой директории проекта 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))))

Может кто-нибудь объяснить, почему это прерывает автозаполнение?

1 Ответ

7 голосов
/ 19 июня 2012

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

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

...