Emacs Ruby autocompletado casi funciona

132

He estado actualizando mi configuración de emacs con el uso de Rsense para permitir que aparezca un cuadro desplegable de autocompletar mientras escribo código. Esto funciona bien en la mayoría de los archivos, excepto que he descubierto que no me permite seleccionar una respuesta de la tabla cuando estoy editando algún código en mi proyecto ruby ​​on rails.

Aquí está mi configuración: https://github.com/map7/simple_emacs

Estoy usando esto en Ubuntu 10.04.

Para archivos de script ruby ​​simples, funciona muy bien. Puedo abrir un nuevo archivo y escribir.

"test".up...

Justo cuando escribo el carácter 'p' en la parte superior, aparece una lista de opciones y puedo subir y bajar la lista con las teclas de flecha y seleccionar una (por ejemplo: mayúscula) con la tecla Intro.

Lo que no funciona es cuando hago exactamente la misma prueba pero dentro del directorio base de un proyecto rails.

Actualizar:

Descubrí que el problema es con (require 'rails), por lo que es algo en el complemento emacs-rails que no le gusta al autocompletado.

Actualizar:

Está dentro de emacs-rails -> rails-project.el. Si comento esta macro, el autocompletado funciona; de lo contrario, no funciona:

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

¿Alguien puede explicar por qué esto rompe el autocompletado?

mapa7
fuente
1
La función de autocompletar se usa en ruby, C ++, lisp y todo
map7
1
Quiero decir, ¿dónde se usa la macro aquí?
milkypostman
1
Principalmente uso la macro de rieles para saltar entre diferentes archivos en el MVC e iniciar el DB / servidor / consola / etc.
mapa7
1
¿Puedes extraer tu solución para responder y darle un ticket de "obras"?
przemo_li
2
przemo_li, lo haría si tuviera una respuesta a esto, pero el autocompletado aún no funciona cuando tienes instalado el complemento rails.el y estás intentando autocompletar dentro de un archivo de código fuente en modo menor de rails.
mapa7

Respuestas:

7

He aquí un pensamiento: la macro vincula una fletfunción (rails-project:root)una vez al valor que (rails-project:root)tiene justo antes de bodyejecutarse. (Así es como se afirma un aumento en el rendimiento: al parecer, el exterior (rails-project:root)es caro, por lo que llamar una vez y almacenar en caché el valor parece una buena idea).

Desafortunadamente, si hay un código dentro bodyque tiene un efecto secundario intencionalmente para cambiar el valor que (rails-project:root)retorna, no tendrá ningún efecto. Ese cambio será invisible incluso para otro código llamado dentro de bodyporque Emacs lisp tiene enlaces dinámicos de fletnombres.

Gene
fuente