Saya telah memperbarui konfigurasi emacs saya dengan menggunakan Rsense untuk memungkinkan drop down box autocomplete muncul saat mengetik kode. Ini berfungsi dengan baik di sebagian besar file kecuali saya telah menemukan itu tidak memungkinkan saya untuk memilih jawaban dari tabel ketika saya mengedit beberapa kode di ruby on rails project saya.
Ini adalah pengaturan saya: https://github.com/map7/simple_emacs
Saya menggunakan ini di bawah Ubuntu 10.04.
Untuk file skrip ruby sederhana ini berfungsi dengan baik. Saya dapat membuka file dan tipe baru.
"test".up...
Sama seperti saya mengetik karakter 'p' di atas daftar pilihan muncul dan saya bisa naik dan turun daftar dengan tombol panah dan pilih satu (misalnya: huruf besar) dengan tombol enter.
Apa yang tidak berfungsi adalah ketika saya melakukan tes yang sama persis tetapi dalam direktori dasar proyek rel.
Memperbarui:
Menemukan bahwa masalahnya adalah dengan (membutuhkan 'rel), jadi itu adalah sesuatu di plugin emacs-rails yang tidak disukai autocomplete.
Memperbarui:
Ada dalam emacs-rails -> rails-project.el. Jika saya berkomentar makro ini keluar maka autocomplete berfungsi, jika tidak maka makro tidak akan:
(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))))
Adakah yang bisa menjelaskan mengapa ini merusak autocomplete?
sumber
Jawaban:
Berikut ini sebuah pemikiran: Makro mengikat
flet
fungsi(rails-project:root)
satu kali dengan nilai yang(rails-project:root)
baru sajabody
dijalankan. (Begitulah klaim peningkatan kinerja: Rupanya luar(rails-project:root)
itu mahal, jadi menelepon sekali dan caching nilai sepertinya ide yang bagus.)Sayangnya, jika ada kode di dalamnya
body
yang memiliki efek samping yang dimaksudkan untuk mengubah nilai yang(rails-project:root)
dikembalikan, itu tidak akan berpengaruh. Perubahan itu tidak akan terlihat bahkan oleh kode lain yang disebut di dalambody
karena Emacs lisp memiliki pengikatanflet
nama yang dinamis .sumber