Emacs Ruby Autocomplete funktioniert fast

132

Ich habe meine Emacs-Konfiguration mithilfe von Rsense aktualisiert, damit beim Eingeben von Code ein Dropdown-Feld für die automatische Vervollständigung angezeigt wird. Dies funktioniert in den meisten Dateien gut, außer ich habe festgestellt, dass ich keine Antwort aus der Tabelle auswählen kann, wenn ich Code in meinem Ruby on Rails-Projekt bearbeite.

Hier ist mein Setup: https://github.com/map7/simple_emacs

Ich benutze dies unter Ubuntu 10.04.

Für einfache Ruby-Skriptdateien funktioniert es hervorragend. Ich kann eine neue Datei öffnen und eingeben.

"test".up...

Gerade als ich das 'p'-Zeichen eintippe, erscheint eine Liste mit Optionen, und ich kann die Liste mit den Pfeiltasten auf und ab gehen und mit der Eingabetaste eine auswählen (z. B. Groß- / Kleinschreibung).

Was nicht funktioniert, ist, wenn ich genau den gleichen Test mache, aber im Basisverzeichnis eines Rails-Projekts.

Aktualisieren:

Es wurde festgestellt, dass das Problem bei (erfordert 'Schienen) liegt, daher ist es etwas im Emacs-Rails-Plugin, das der Autovervollständigung nicht gefällt.

Aktualisieren:

Es ist in emacs-Rails -> Rails-Projekt.el. Wenn ich dieses Makro auskommentiere, funktioniert die automatische Vervollständigung, andernfalls nicht:

(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))))

Kann jemand erklären, warum dies die automatische Vervollständigung unterbricht?

map7
quelle
1
Die Autocomplete-Funktion wird in Ruby, C ++, Lisp und allem verwendet
map7
1
Ich meinte, wo wird das Makro hier verwendet?
Milkypostman
1
Ich benutze hauptsächlich das Rails-Makro, um zwischen verschiedenen Dateien in der MVC zu springen und die DB / server / console / etc. Zu starten.
map7
1
Können Sie Ihre Antwortlösung extrahieren und ihr ein "Works" -Ticket geben?
przemo_li
2
przemo_li, ich würde, wenn ich eine Antwort darauf hätte, aber die automatische Vervollständigung funktioniert immer noch nicht, wenn Sie das Rails.el-Plugin installiert haben und versuchen, die Vervollständigung innerhalb einer Quellcodedatei im Rails-Minor-Modus durchzuführen.
map7

Antworten:

7

Hier ein Gedanke: Das Makro bindet eine fletFunktion (rails-project:root)einmal an den Wert, (rails-project:root)der unmittelbar vor der bodyAusführung liegt. (So ​​wird eine Leistungssteigerung behauptet: Anscheinend ist das Äußere (rails-project:root)teuer, daher scheint es eine gute Idee zu sein, einmal anzurufen und den Wert zwischenzuspeichern.)

Wenn sich im Code Code befindet body, der einen Nebeneffekt hat, der absichtlich den zurückgegebenen Wert ändern soll, hat dies leider (rails-project:root)keine Auswirkungen. Diese Änderung ist selbst für anderen Code, der innerhalb von bodyEmacs lisp aufgerufen wird, unsichtbar, da Emacs lisp eine dynamische Bindung von fletNamen aufweist.

Gen
quelle