2011-11-03 35 views
131

Tôi đã cập nhật cấu hình emacs của mình bằng cách sử dụng Rsense để cho phép hộp thả xuống tự động hoàn tất xuất hiện khi nhập mã. Điều này làm việc tốt trong hầu hết các tập tin ngoại trừ tôi đã tìm thấy nó không cho phép tôi chọn một câu trả lời từ bảng khi tôi đang chỉnh sửa một số mã trong ruby ​​của tôi trên dự án đường ray.Emacs Ruby tự động hoàn thành hầu như làm việc

Đây là thiết lập của tôi: https://github.com/map7/simple_emacs

Tôi đang sử dụng này theo Ubuntu 10.04.

Đối với các tệp tập lệnh ruby ​​đơn giản, nó hoạt động tuyệt vời. Tôi có thể mở một tập tin và loại mới.

"test".up... 

Cũng như tôi gõ chữ 'p' trong một danh sách các tùy chọn xuất hiện và tôi có thể đi lên và xuống danh sách với các phím mũi tên và chọn một (ví dụ: upcase) với phím Enter.

Điều gì không có tác dụng khi tôi làm thử nghiệm chính xác giống nhau nhưng trong thư mục cơ sở của dự án đường ray.

Cập nhật:

Tìm thấy rằng vấn đề là với (require 'đường ray), vì vậy nó là một cái gì đó trong emacs-ray cắm rằng autocomplete không thích.

Cập nhật:

Đó là trong emacs-ray -> ray-project.el. Nếu tôi nhận xét macro này ra thì tự động hoàn thành hoạt động, nếu không nó sẽ không hoạt động, nếu không nó sẽ không:

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

Ai đó có thể giải thích tại sao điều này tự động hoàn thành?

+1

nó được sử dụng ở đâu? – milkypostman

+1

Chức năng tự động hoàn tất được sử dụng trong ruby, C++, lisp và mọi thứ – map7

+1

ý tôi là, macro ở đây được sử dụng ở đâu? – milkypostman

Trả lời

6

Đây là suy nghĩ: Macro liên kết một hàm flet(rails-project:root) một lần với giá trị (rails-project:root) có trước khi thực hiện body. (Đó là cách nó tuyên bố tăng hiệu suất: Rõ ràng là bên ngoài (rails-project:root) là tốn kém, do đó, gọi một lần và bộ nhớ đệm giá trị có vẻ như một ý tưởng tốt.)

Thật không may, nếu có mã bên trong body có tác dụng phụ có ý nghĩa cố ý để thay đổi giá trị (rails-project:root) trả về, nó sẽ không có hiệu lực. Thay đổi đó sẽ vô hình ngay cả với mã khác được gọi trong số body vì Emacs lisp có liên kết động của tên flet.

Các vấn đề liên quan