2011-11-03 25 views
131

He estado actualizando la configuración de mi emacs con el uso de Rsense para permitir que aparezca un cuadro desplegable de autocompletar mientras escribo el 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.Emacs Ruby autocompletar casi funcionando

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

estoy usando este bajo Ubuntu 10.04.

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

"test".up... 

Del mismo modo que escribe el carácter 'p' en una lista de opciones aparecen y que pueden subir y bajar la lista con las teclas de flecha y seleccione uno (por ejemplo: upcase) con la tecla enter.

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

Actualización:

encontró que el problema está en los carriles (require '), por lo que algo en el emacs-carriles plugin que la función de autocompletar no le gusta.

Actualización:

Es dentro de emacs-carriles -> carriles-project.el. Si comento esta macro a cabo trabajos de autocompletar a continuación, de lo contrario no lo hace:

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

Puede alguien explicar por qué esto rompe autocompletar?

+1

¿Dónde se usa? – milkypostman

+1

La función de autocompletar se usa en ruby, C++, lisp y todo – map7

+1

quiero decir, ¿dónde se usa aquí la macro? – milkypostman

Respuesta

6

Aquí es un pensamiento: La macro se une a una función flet(rails-project:root) una vez al valor que tiene (rails-project:root) justo antes de las body ejecuta. (Eso es lo que reclama un aumento de rendimiento:. Al parecer el exterior (rails-project:root) es caro, así que llamar una vez y almacenamiento en caché el valor parece una buena idea)

Desafortunadamente, si hay código dentro del body que tiene un efecto secundario de forma intencionada para cambiar el valor que devuelve (rails-project:root), no tendrá ningún efecto. Ese cambio será invisible incluso para otros códigos llamados dentro del body porque Emacs lisp tiene un enlace dinámico de flet nombres.

Cuestiones relacionadas