Я обновлял свою конфигурацию 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))))
Может кто-нибудь объяснить, почему это нарушает автозаполнение?
источник
Ответы:
Вот такая мысль: макрос связывает
flet
функцию(rails-project:root)
один раз со значением, которое(rails-project:root)
было непосредственно перед выполнениемbody
. (Вот как он заявляет об увеличении производительности: очевидно, внешний вид(rails-project:root)
стоит дорого, поэтому вызов один раз и кеширование значения кажется хорошей идеей.)К сожалению, если внутри есть код, у
body
которого есть побочный эффект, преднамеренно предназначенный для изменения(rails-project:root)
возвращаемого значения , он не будет иметь никакого эффекта. Это изменение будет невидимым даже для другого кода, вызываемого внутри,body
потому что Emacs lisp имеет динамическую привязкуflet
имен.источник