Il completamento automatico di Emacs Ruby è quasi funzionante


132

Ho aggiornato la mia configurazione di emacs con l'uso di Rsense per consentire la visualizzazione di una casella a discesa di completamento automatico durante la digitazione del codice. Funziona bene nella maggior parte dei file, tranne che ho scoperto che non mi permette di selezionare una risposta dalla tabella quando sto modificando del codice nel mio progetto Ruby on Rails.

Ecco la mia configurazione: https://github.com/map7/simple_emacs

Sto usando questo sotto Ubuntu 10.04.

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

"test".up...

Proprio mentre digito il carattere 'p' in alto appare un elenco di opzioni e posso andare su e giù nell'elenco con i tasti freccia e selezionarne uno (es. Upcase) con il tasto invio.

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

Aggiornare:

Abbiamo scoperto che il problema è (richiedi 'rails), quindi è qualcosa nel plugin emacs-rails che il completamento automatico non piace.

Aggiornare:

È all'interno di emacs-rails -> rails-project.el. Se commento questa macro, il completamento automatico funziona, altrimenti no:

(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 si rompe il completamento automatico?


1
La funzione di completamento automatico è usata in ruby, C ++, lisp e tutto il resto
map7

1
volevo dire, dove viene utilizzata la macro qui?
milkypostman

1
Uso principalmente la macro delle rotaie per saltare tra diversi file nell'MVC e avviare il DB / server / console / ecc.
map7,

1
Puoi estrarre la tua soluzione per rispondere e dargli il biglietto "funziona"?
przemo_li

2
przemo_li, lo farei se avessi una risposta a questo, ma il completamento automatico non funziona ancora quando hai installato il plugin rails.el e stai provando a completare automaticamente un file di codice sorgente in modalità minore di rails.
map7,

Risposte:


7

Ecco un pensiero: la macro associa una fletfunzione (rails-project:root)una volta al valore che (rails-project:root)ha poco prima bodydell'esecuzione. (È così che afferma un aumento delle prestazioni: apparentemente l'esterno (rails-project:root)è costoso, quindi chiamare una volta e memorizzare nella cache il valore sembra una buona idea.)

Sfortunatamente, se all'interno del codice bodyè presente un effetto collaterale che ha lo scopo di modificare intenzionalmente il valore (rails-project:root)restituito, non avrà alcun effetto. Quella modifica sarà invisibile anche ad altri codici chiamati all'interno del bodyperché Emacs lisp ha un'associazione dinamica di fletnomi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.