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

132

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

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

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

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

"test".up...

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

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

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

map7
источник
1
Функция автозаполнения используется в Ruby, C ++, Lisp и во всем остальном
map7
1
Я имел в виду, где здесь используется макрос?
milkypostman
1
В основном я использую макрос rails для перехода между разными файлами в MVC и запуска DB / server / console / и т. Д.
map7
1
Можете ли вы извлечь свое решение для ответа и дать ему «рабочий» билет?
przemo_li
2
przemo_li, я бы стал, если бы у меня был ответ на этот вопрос, но автозаполнение по-прежнему не работает, если у вас установлен плагин rails.el и вы пытаетесь выполнить автозаполнение в файле исходного кода второстепенного режима rails.
map7

Ответы:

7

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

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

Ген
источник