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?
fuente
Respuestas:
He aquí un pensamiento: la macro vincula una
flet
función(rails-project:root)
una vez al valor que(rails-project:root)
tiene justo antes debody
ejecutarse. (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
body
que 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 debody
porque Emacs lisp tiene enlaces dinámicos deflet
nombres.fuente