2009-07-17 36 views
7

Tôi đang làm việc về triển khai tự động hoàn thành trong các emacs cho ngôn ngữ lập trình haxe.Làm thế nào để hiển thị các lựa chọn tự động hoàn thành trong các emacs?

Tôi đã tìm ra cách lấy danh sách các tự động hoàn thành mà tôi muốn trình bày. Danh sách này là ở định dạng:

'((name1 type1 desc1) 
    (name2 type2 desc2) ... 

Tôi muốn hiển thị danh sách người dùng chứa văn bản ở định dạng "name1 type1" sau khi vị trí con trỏ (như trong autocomplete-mode) và desc cho mặt hàng đang được chọn trong minibuffer. Người dùng có thể chọn hoàn thành hoặc bỏ cuộc như ở chế độ tự động hoàn thành.

Khi người dùng chọn thứ gì đó, tên1 sẽ được chèn vào vị trí con trỏ.

Cách tốt nhất/dễ nhất để thực hiện việc này là gì? Có một số cách emacs tiêu chuẩn để làm điều này, hoặc tôi nên mã một cái gì đó của riêng tôi?

EDIT: Tôi có các chức năng để nhận danh sách các ứng viên tự động điền dựa trên bộ đệm. Bây giờ tôi đang đấu tranh làm thế nào để tích hợp vào chế độ tự động hoàn thành. Vì get-completes là hoạt động nặng, tôi chỉ muốn kích hoạt nó khi con trỏ đang bật "." tính cách.

Đây là mã tôi có.

(defun get-completes-from-haxe (hxml-file file pos) 
    (let* ((completion-buffer (get-buffer-create "*haxe-completions*")) 
     (cmd (concat "cd " (file-name-directory hxml-file) "; haxe " hxml-file " --display " file "@" (number-to-string pos)))) 
    (ignore-errors 
     (shell-command cmd completion-buffer) 
     (let ((clist (xml-parse-region 1 (buffer-size completion-buffer) completion-buffer)) 
      (completes nil)) 
     (dolist (s (cddar clist)) 
      (when (listp s) 
      (let* ((item (cdr s)) 
        (name (cdaar item)) 
        (type (car (cddadr item))) 
        (desc (cdddr item))) 
       (setf completes (cons name completes))))) 
     completes)))) 

(defun file-find-upwards (buffer file-name) 
    ;; Chase links in the source file and search in the dir where it points. 
    (setq dir-name (or (and (buffer-file-name buffer) 
          (file-name-directory (file-chase-links 
               (buffer-file-name buffer)))) 
        default-directory)) 
    ;; Chase links before visiting the file. This makes it easier to 
    ;; use a single file for several related directories. 
    (setq dir-name (file-chase-links dir-name)) 
    (setq dir-name (expand-file-name dir-name)) 
    ;; Move up in the dir hierarchy till we find a change log file. 
    (let ((file1 (concat dir-name file-name)) 
     parent-dir) 
    (while (and (not (file-exists-p file1)) 
       (progn (setq parent-dir 
          (file-name-directory 
           (directory-file-name 
           (file-name-directory file1)))) 
         ;; Give up if we are already at the root dir. 
         (not (string= (file-name-directory file1) 
            parent-dir)))) 
     ;; Move up to the parent dir and try again. 
     (setq file1 (expand-file-name file-name parent-dir))) 
    ;; If we found the file in a parent dir, use that. Otherwise, 
    ;; return nil 
    (if (or (get-file-buffer file1) (file-exists-p file1)) 
     file1 
     nil))) 


(defun get-candidate-list (buffer pos) 
    (get-completes-from-haxe 
    (file-find-upwards buffer "compile.hxml") 
    (buffer-file-name buffer) 
    pos)) 

Trả lời

7

tôi muốn đề nghị gói AutoComplete xuất sắc: http://www.emacswiki.org/emacs/AutoComplete

Bạn có thể xác định nguồn tùy chỉnh cho autocomplete và có vẻ như khá thẳng về phía trước.

+0

Tôi đã thấy điều đó, nhưng không thể tìm ra cách hiển thị chú giải công cụ và tài liệu với nó. Tất cả nó cung cấp là vim như tự động hoàn thành, mà không phải là những gì tôi muốn. – Marko

+1

Hình như ở chế độ tự động, chức năng ac-select-ứng cử viên được sử dụng để hiển thị lựa chọn hiện tại của ứng cử viên, bạn có thể xác định lời khuyên cho chức năng đó để hiển thị desc trong minibuffer – user49117

1

Ido-complete-read từ ido.el là một cách khác để thực hiện điều đó.

Một tính năng hữu ích của nó là bạn có thể sử dụng cụm từ thông dụng để lọc ra các ứng cử viên và bạn có thể bật và tắt tính năng này khi đang di chuyển. Xem ido.el để biết thêm chi tiết.

1

gói ido có chức năng hoàn thành thuận tiện được gọi là 'ido-completed-read'. Ví dụ, đây là một tinh chỉnh đơn giản để làm cho nó hiển thị danh sách trong một line-by-line cơ sở:

(defun x-ido-completing-read 
    (prompt choices &optional predicate require-match initial-input hist def) 
    (let* ((indent (concat "\n" (make-string (length prompt) ?))) 
     (ido-decorations 
     `("" "" ,indent ,(concat indent "...") 
      "[" "]" " [No match]" " [Matched]" " [Not readable]" " [Too big]"))) 
    (ido-completing-read prompt choices predicate require-match initial-input hist def))) 
1

Bên trong mã yasnippet, có sẵn từ google mã, họ sử dụng 'thả xuống-list.el' bởi Jaeyoun Chung để hiển thị các đoạn mã có thể được sử dụng tại điểm. Thao tác này sẽ hiển thị menu bật lên (công cụ giống như chú giải công cụ) ở vị trí con trỏ mà bạn có thể chọn bằng các phím mũi tên và nhập hoặc bạn có thể chọn theo số.

http://www.emacswiki.org/emacs/dropdown-list.el

+0

Tuyệt vời, nếu chỉ có thể loại bỏ selid ở phía bên phải :) – Marko

3

Tại sao tiếp tục phát minh lại bánh xe? chế độ công ty có hỗ trợ cho một vài ngôn ngữ

+0

Đây là con đường để đi. Tôi không biết tại sao tôi bỏ lỡ chế độ công ty và lãng phí thời gian với chế độ tự động hoàn thành kém hơn. Có lẽ tên xấu xí;) – Marko

+1

Vấn đề duy nhất là tài liệu cho chế độ công ty. Nó xa rõ ràng làm thế nào để sử dụng nó và tôi đã nhận được nhiều email từ những người yêu cầu cho công ty của tôi-thiết lập.Nó có thể được nhìn thấy trong các tập tin cấu hình liên kết đến đây: http://richardriley.net/projects/emacs/dotemacs – RichieHH

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