O preenchimento automático do Emacs Ruby está quase funcionando

132

Estou atualizando minha configuração do emacs com o uso do Rsense para permitir que uma caixa suspensa de preenchimento automático apareça ao digitar o código. Isso funciona bem na maioria dos arquivos, exceto que eu descobri que não me permite selecionar uma resposta da tabela quando estou editando algum código no meu projeto ruby ​​on rails.

Aqui está a minha configuração: https://github.com/map7/simple_emacs

Estou usando isso no Ubuntu 10.04.

Para arquivos de script ruby ​​simples, funciona muito bem. Eu posso abrir um novo arquivo e tipo.

"test".up...

Assim que digito o caractere 'p', uma lista de opções aparece e eu posso subir e descer a lista com as setas e selecionar uma (por exemplo: maiúscula) com a tecla Enter.

O que não funciona é quando eu faço exatamente o mesmo teste, mas dentro do diretório base de um projeto rails.

Atualizar:

Constatou que o problema está em (require 'rails), então é algo no plug-in emacs-rails que o preenchimento automático não gosta.

Atualizar:

Está dentro do emacs-rails -> rails-project.el. Se eu comentar esta macro, o preenchimento automático funcionará, caso contrário, não:

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

Alguém pode explicar por que isso interrompe o preenchimento automático?

map7
fonte
1
A função de preenchimento automático é utilizado em rubi, C ++, lisp e tudo
map7
1
eu quis dizer, onde é usada a macro aqui?
Milkypostman 17/03/12
1
Eu uso principalmente a macro rails para alternar entre arquivos diferentes no MVC e iniciar o DB / server / console / etc.
Map #
1
Você pode extrair sua solução para responder e dar a ela a permissão "funciona"?
Przemo_li 08/04
2
przemo_li, eu faria se tivesse uma resposta para isso, mas o preenchimento automático ainda não funcionará quando o plug-in rails.el estiver instalado e você estiver tentando preenchê-lo automaticamente em um arquivo de código-fonte de modo secundário do Rails.
usar o seguinte

Respostas:

7

Aqui está um pensamento: A macro vincula uma fletfunção (rails-project:root)uma vez ao valor que (rails-project:root)possui pouco antes da bodyexecução. (É assim que alega um aumento de desempenho: aparentemente, o externo (rails-project:root)é caro, portanto, ligar uma vez e armazenar em cache o valor parece uma boa ideia.)

Infelizmente, se houver código dentro do bodyque tenha um efeito colateral intencionalmente alterado para alterar o valor (rails-project:root)retornado, ele não terá efeito. Essa alteração será invisível até para outro código chamado dentro do, bodyporque o Emacs lisp tem ligação dinâmica de fletnomes.

Gene
fonte