Autouzupełnianie Emacsa Rubiego prawie działa

132

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?

mapa7
źródło
1
Funkcja autouzupełniania jest używana w Ruby, C ++, Lisp i wszystkim
map7
1
miałem na myśli, gdzie jest tutaj używane makro?
Milkypostman
1
Głównie używam makra rails do przeskakiwania między różnymi plikami w MVC i uruchamiania DB / server / console / etc.
mapa 7
1
Czy możesz wyodrębnić swoje rozwiązanie, aby odpowiedzieć i dać mu bilet „działa”?
przemo_li
2
przemo_li, chciałbym, gdybym miał odpowiedź na to pytanie, ale autouzupełnianie nadal nie działa, gdy masz zainstalowaną wtyczkę rails.el i próbujesz autouzupełnianie w pliku kodu źródłowego w trybie railsowym.
mapa 7

Odpowiedzi:

7

Oto myśl: makro wiąże fletfunkcję (rails-project:root)jeden raz z wartością, która (rails-project:root)ma tuż przed bodywykonaniem. (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, bodyktó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, bodyponieważ Emacs lisp ma dynamiczne wiązanie fletnazw.

Gen
źródło