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?
quelle
Antworten:
Hier ein Gedanke: Das Makro bindet eine
flet
Funktion(rails-project:root)
einmal an den Wert,(rails-project:root)
der unmittelbar vor derbody
Ausfü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 vonbody
Emacs lisp aufgerufen wird, unsichtbar, da Emacs lisp eine dynamische Bindung vonflet
Namen aufweist.quelle