Aktualizowałem konfigurację emacsa przy użyciu Rsense, aby podczas wpisywania kodu pojawiało się rozwijane okno autouzupełniania. Działa to dobrze w większości plików, z wyjątkiem stwierdzenia, że nie pozwala mi wybrać odpowiedzi z tabeli, gdy edytuję kod w moim projekcie Ruby on rails.
Oto moja konfiguracja: https://github.com/map7/simple_emacs
Używam tego pod Ubuntu 10.04.
W przypadku prostych plików skryptów ruby działa świetnie. Mogę otworzyć nowy plik i wpisać.
"test".up...
Gdy wpisuję znak „p” w górę, pojawia się lista opcji i mogę poruszać się w górę iw dół listy za pomocą klawiszy strzałek i wybrać jedną (np. Wielkie litery) klawiszem Enter.
Co nie działa, kiedy wykonuję dokładnie ten sam test, ale w katalogu podstawowym projektu rails.
Aktualizacja:
Okazało się, że problem dotyczy (wymagają 'railsów), więc jest to coś we wtyczce emacs-rails, czego autouzupełnianie nie lubi.
Aktualizacja:
Znajduje się w emacs-rails -> rails-project.el. Jeśli skomentuję to makro, autouzupełnianie działa, w przeciwnym razie nie:
(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))))
Czy ktoś może wyjaśnić, dlaczego to psuje autouzupełnianie?
źródło
Odpowiedzi:
Oto myśl: makro wiąże
flet
funkcję(rails-project:root)
jeden raz z wartością, która(rails-project:root)
ma tuż przedbody
wykonaniem. (W ten sposób twierdzi, że wzrost wydajności: najwyraźniej zewnętrzna(rails-project:root)
jest droga, więc dzwonienie raz i buforowanie wartości wydaje się dobrym pomysłem.)Niestety, jeśli wewnątrz znajduje się kod,
body
który ma efekt uboczny, który ma na celu celową zmianę(rails-project:root)
zwracanej wartości , nie odniesie on żadnego skutku. Ta zmiana będzie niewidoczna nawet dla innego kodu wywoływanego w ramach,body
ponieważ Emacs lisp ma dynamiczne wiązanieflet
nazw.źródło