web-dev-qa-db-fra.com

Emacs Ruby autoocomplète travaillant presque

J'ai mis à jour ma configuration EMACS avec l'utilisation de RSSE pour permettre une boîte de déroulement automatique pour apparaître pendant la saisie du code de frappe. Cela fonctionne bien dans la plupart des fichiers, sauf que j'ai trouvé cela ne me permet pas de sélectionner une réponse à partir de la table lorsque je modifie du code dans mon Ruby ON Rails projet.

Voici ma configuration: https://github.com/map7/simple_emacs

J'utilise cela sous Ubuntu 10.04.

Pour Simple Ruby fichiers de script, cela fonctionne bien. Je peux ouvrir un nouveau fichier et un nouveau fichier.

"test".up...

Tout comme je tapez le caractère "P" dans la liste des options apparaissent et je peux monter et descendre la liste avec des touches fléchées et sélectionnez une (par exemple: Uppcase) avec la touche ENTER.

Ce qui ne fonctionne pas, c'est quand je fais exactement le même test, mais dans un Rails Répertoire de base du projet.

Mise à jour:

J'ai constaté que le problème est avec (exiger 'rails), c'est donc quelque chose dans le plugin Emacs-Rails que l'auto-compplète n'aime pas.

Mise à jour:

C'est dans Emacs-Rails -> Rails-Project.el. Si je commente cette macro sortit, alors la tâche automatique fonctionne, sinon elle ne:

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

Quelqu'un peut-il expliquer pourquoi cela enfreint l'autocomplete?

132
map7

Voici une pensée: la macro lie une fonction flet _ fonction (Rails-project:root) Une fois à la valeur que (Rails-project:root) Il est juste avant que le body exécute. (C'est ainsi que cela revendique une augmentation de la performance: apparemment le (Rails-project:root) Est coûteux, alors appelez une fois et la mise en cache de la valeur semble être une bonne idée.)

Malheureusement, s'il y a du code à l'intérieur du code body qui a un effet secondaire signifiait intentionnellement de modifier la valeur que (Rails-project:root) Retourne, il n'aura aucun effet. Ce changement sera invisible même à un autre code appelé dans le body parce que EMACS LISP a une liaison dynamique de flet noms.

7
Gene