2010-08-04 30 views
8

Khá thường xuyên tôi xác định một biểu tượng ruby ​​(ví dụ: :some_value), sau đó tôi muốn tạo một phương thức có cùng tên def some_value.Emacs ruby ​​biểu tượng từ hoàn thành

Thật không may, tự động hoàn thành (M + /) cho lần xuất hiện thứ hai của chuỗi some_value không hoạt động, hơi khác (:some_value so với some_value).

Tôi làm cách nào để thiết lập các emacs để xử lý các sự kiện như vậy?

+1

Chính xác thì M-/ánh xạ cho bạn là gì? Nếu nó mở rộng dabbrev, giá trị của bạn cho dabbrev-abbrev-char-regexp là gì? –

+1

Giống như 0x4b nói, chúng tôi cần thêm thông tin. Bạn đang sử dụng chế độ ruby ​​nào? RubyMode? MuMaMo-Mode? FWIW, dabbrev hoàn thành cho tôi chỉ tốt khi sự xuất hiện duy nhất của chuỗi là ': some_value'. –

+0

Tôi đang sử dụng chế độ ruby ​​cơ bản. Tôi đã không thay đổi những gì M -/không. Tuy nhiên chế độ tôi đang sử dụng là khá không thích hợp. Nó không hoạt động trong bộ đệm 'xước' không có chế độ. – vise

Trả lời

7

Giả sử rằng M-/bị ràng buộc để mở rộng dabbrev, bạn có thể định cấu hình chế độ dabbrev để bỏ qua các tiền tố nhất định khi mở rộng chuỗi. Để thực hiện một tràng duy nhất một tiền tố để được bỏ qua, gõ

M-x customize-group 

và sau đó

dabbrev 

này sẽ đưa bạn đến trang tùy chỉnh cho dabbrev-mode. Chuyển đến điểm Chữ viết tắt Dabbrev Bỏ qua hàng đầu Regexp và nhấp vào Value menu. Từ trình đơn, chọn "Regexp".

Bây giờ bạn thấy một trường văn bản có nhãn "Regexp:" bên cạnh menu giá trị mà bạn nhập một dấu hai chấm đơn.

: 

Sau đó nhấp vào nút State trong dòng tiếp theo và chọn giá trị "Lưu cho phiên tương lai".

+0

Cảm ơn bạn, đây chính xác là những gì tôi đang tìm kiếm! – vise

+0

Mẹo tuyệt vời! Tôi mở rộng nó để chỉ cho phép điều này trong Ruby và Clojure chế độ: https://gist.github.com/shepmaster/10877484 – Shepmaster

1

Không phải là câu trả lời trực tiếp cho câu hỏi của bạn, nhưng bạn sẽ nhận được tự động hoàn thành thông minh hơn bằng cách sử dụng auto complete mode được ghép nối với rsense.

+0

Cảm ơn, tôi đã không được cài đặt nhưng rsense trông khá ngọt ngào. – vise

2

Đầu tiên, kết quả của tôi! Tôi đã nhập :some_crazy_symbol vào mô hình của mình. Trên một dòng mới, tôi gõ def so, nhấn M-/ hai lần, và kết thúc với

def some_crazy_symbol 
end 

(Rinari cung cấp các end.)

Tôi có này để làm việc khá tốt bằng cách sử dụng hippie-expand. Nếu bạn muốn kiểm tra nó ra, ràng buộc hippie-expand-M-/ như vậy:

(global-set-key (kbd "M-/") 'hippie-expand) 

Heres' các documentation. Hippie mở rộng hoạt động bằng cách thử một số mở rộng khác nhau về điểm hiện tại. Các mở rộng này được lưu trữ trong biến số hippie-expand-try-functions-list. Trên hệ thống của tôi (và được mặc định), biến này được thiết lập để:

(try-complete-file-name-partially try-complete-file-name try-expand-all-abbrevs try-expand-list try-expand-line try-expand-dabbrev try-expand-dabbrev-all-buffers try-expand-dabbrev-from-kill try-complete-lisp-symbol-partially try-complete-lisp-symbol)

Các readout minibuffer cho thấy việc mở rộng đặc biệt này được thực hiện bằng cách sử dụng chức năng try-expand-dabbrev.

1

Nếu Dabbrev Viết tắt Skip Leading biểu thức chính quyhippie-expand không thực hiện chính xác những gì bạn muốn và bạn đã có một số kỹ năng elisp, bạn có thể tạo một hàm tùy chỉnh cho hippie-expand.

Xem phần về "substring expansion" trên trang hippie-expand trên emacs-wiki. Có một chức năng mà bạn có thể sử dụng đó bạn có thể chỉnh sửa tùy biến ..

Substring Expansion

Khi làm lisp tiêu chuẩn lập trình dabbrev là ít hữu ích, bởi vì Emacs không có không gian tên, vì vậy trong một gói những biểu tượng bắt đầu với cùng một tiền tố, do đó cùng một tiền tố phải được gõ lại và nếu một người muốn hoàn thành các biểu tượng từ gói. Như với IswitchBuffers, nó có hiệu quả hơn nhiều nếu một chuỗi con duy nhất có thể được gõ để có được biểu tượng mong muốn.

Dabbrev không cung cấp gì về vấn đề này, vì vậy tôi đã chuyển sang Hippie Expand mà tôi chưa bao giờ sử dụng trước đây.

Dưới đây là một chức năng dựa trên hippie mở rộng dabbrev mở rộng, thực hiện substring mở rộng:

(defun try-my-dabbrev-substring (old) 
    (let ((old-fun (symbol-function 'he-dabbrev-search))) 
    (fset 'he-dabbrev-search (symbol-function 'my-dabbrev-substring-search)) 
    (unwind-protect 
     (try-expand-dabbrev old) 
     (fset 'he-dabbrev-search old-fun)))) 


(defun my-dabbrev-substring-search (pattern &optional reverse limit) 
    (let ((result()) 
    (regpat (cond ((not hippie-expand-dabbrev-as-symbol) 
       (concat (regexp-quote pattern) "\\sw+")) 
       ((eq (char-syntax (aref pattern 0)) ?_) 
       (concat (regexp-quote pattern) "\\(\\sw\\|\\s_\\)+")) 
       (t 
       (concat (regexp-quote pattern) 
        "\\(\\sw\\|\\s_\\)+"))))) 
    (while (and (not result) 
     (if reverse 
      (re-search-backward regpat limit t) 
      (re-search-forward regpat limit t))) 
     (setq result (buffer-substring-no-properties (save-excursion 
                (goto-char (match-beginning 0)) 
                (skip-syntax-backward "w_") 
                (point)) 
          (match-end 0))) 
     (if (he-string-member result he-tried-table t) 
     (setq result nil)))  ; ignore if bad prefix or already in table 
    result)) 
1

tôi figured tôi muốn chia sẻ solution I came up with that works for hippie-expand.

Để tóm tắt:

(defun hippie-expand-ruby-symbols (orig-fun &rest args) 
    (if (eq major-mode 'ruby-mode) 
     (let ((table (make-syntax-table ruby-mode-syntax-table))) 
     (modify-syntax-entry ?: "." table) 
     (with-syntax-table table (apply orig-fun args))) 
    (apply orig-fun args))) 

(advice-add 'hippie-expand :around #'hippie-expand-ruby-symbols) 

hippie-expand sẽ mở rộng các biểu tượng trong ruby-mode khi : được coi là một nhân vật dấu chấm câu, vì vậy lời khuyên này sẽ tạo ra một bảng cú pháp tạm thời nơi : là một nhân vật dấu chấm câu và gọi hippie-expand với nó.

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