2011-11-03 16 views
131

Ho aggiornato la configurazione di emacs con l'utilizzo di Rsense per consentire la visualizzazione di una casella di riepilogo a discesa automatica durante la digitazione del codice. Funziona bene nella maggior parte dei file tranne che ho trovato che non mi permette di selezionare una risposta dal tavolo quando sto modificando del codice nel mio progetto ruby ​​on rails.Autocompilazione di Emacs Ruby quasi funzionante

Qui è la mia messa a punto: https://github.com/map7/simple_emacs

sto usando questo sotto Ubuntu 10.04.

Per semplici file di script ruby ​​funziona benissimo. Posso aprire un nuovo file e digitare.

"test".up... 

Proprio mentre sto scrivendo il carattere 'p' in un elenco di opzioni appaiono e posso andare su e giù l'elenco con i tasti freccia e selezionare uno (ad esempio: upcase) con il tasto Invio.

Ciò che non funziona è quando eseguo lo stesso test ma all'interno della directory di base di un progetto di rotaie.

Aggiornamento:

hanno scoperto che il problema è con (require 'rotaie), quindi è qualcosa nei emacs-rails plugin che il completamento automatico non piace.

Aggiornamento:

E 'all'interno di emacs-rails -> binari-project.el. Se io commento questa macro di lavori di completamento automatico, allora, in caso contrario non è così:

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

Qualcuno può spiegare perché questo rompe completamento automatico?

+1

dove viene utilizzato? – milkypostman

+1

La funzione di completamento automatico viene utilizzata in ruby, C++, lisp e tutto ciò che intendiamo – map7

+1

, dove viene utilizzata la macro qui? – milkypostman

risposta

6

Ecco un pensiero: La macro lega una flet funzione (rails-project:root) una volta per il valore che ha (rails-project:root) poco prima delle body esegue. (Ecco come sostiene un incremento di prestazioni:. A quanto pare l'esterno (rails-project:root) è costoso, quindi chiamare una sola volta e la memorizzazione nella cache il valore sembra una buona idea)

Purtroppo, se non v'è il codice all'interno del body che ha un effetto collaterale significato intenzionalmente per modificare il valore restituito da (rails-project:root), non avrà alcun effetto. Tale modifica sarà invisibile anche ad altri codici chiamati all'interno dello body poiché il lisp di Emacs ha un binding dinamico dei nomi flet.