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?
fonte
Respostas:
Aqui está um pensamento: A macro vincula uma
flet
função(rails-project:root)
uma vez ao valor que(rails-project:root)
possui pouco antes dabody
execuçã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
body
que 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,body
porque o Emacs lisp tem ligação dinâmica deflet
nomes.fonte