La saisie semi-automatique d'Emacs Ruby fonctionne presque

132

J'ai mis à jour ma configuration emacs avec l'utilisation de Rsense pour permettre à une liste déroulante de saisie semi-automatique d'apparaître lors de la saisie du code. Cela fonctionne bien dans la plupart des fichiers, sauf que j'ai trouvé que cela ne me permet pas de sélectionner une réponse dans le tableau lorsque j'édite du code dans mon projet ruby ​​on rails.

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

J'utilise ceci sous Ubuntu 10.04.

Pour les fichiers de script ruby ​​simples, cela fonctionne très bien. Je peux ouvrir un nouveau fichier et taper.

"test".up...

Tout comme je tape le caractère «p» dans le haut, une liste d'options apparaît et je peux monter et descendre la liste avec les touches fléchées et en sélectionner une (par exemple: vers le haut) avec la touche Entrée.

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

Mettre à jour:

J'ai trouvé que le problème venait de (require 'rails), donc c'est quelque chose dans le plugin emacs-rails que la saisie semi-automatique n'aime pas.

Mettre à jour:

C'est dans emacs-rails -> rails-project.el. Si je commente cette macro, la saisie semi-automatique fonctionne, sinon ce n'est pas le cas:

(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 interrompt la saisie semi-automatique?

map7
la source
1
La fonction de saisie semi-automatique est utilisée dans ruby, C ++, lisp et tout
map7
1
je voulais dire, où est la macro utilisée ici?
Milkypostman
1
J'utilise principalement la macro rails pour sauter entre différents fichiers dans le MVC et démarrer la base de données / serveur / console / etc.
carte7
1
Pouvez-vous extraire votre solution pour y répondre, et lui donner un ticket "fonctionne"?
przemo_li
2
przemo_li, je le ferais si j'avais une réponse à cela mais la saisie semi-automatique ne fonctionne toujours pas lorsque le plugin rails.el est installé et que vous essayez de compléter automatiquement dans un fichier de code source en mode mineur rails.
map7

Réponses:

7

Voici une pensée: la macro lie une fois une fletfonction (rails-project:root)à la valeur qui se (rails-project:root)trouve juste avant l' bodyexécution. (C'est ainsi qu'il revendique une augmentation des performances: apparemment, l'extérieur (rails-project:root)est cher, donc appeler une fois et mettre en cache la valeur semble être une bonne idée.)

Malheureusement, s'il y a du code à l'intérieur de bodyqui a un effet secondaire destiné à changer intentionnellement la valeur (rails-project:root)renvoyée, cela n'aura aucun effet. Ce changement sera invisible même pour tout autre code appelé dans le bodycar Emacs lisp a une liaison dynamique des fletnoms.

Gène
la source