2009-01-24 26 views
6

Có thể sử dụng chế độ hoàn thành chế độ ido để tìm định nghĩa trong tệp TAGS không? Tôi nghi ngờ rằng ido-complete-read là một phần của câu trả lời. Đây là mã không hoạt động của tôi, mã này hiển thị một minibuffer ido-mode không có dân số:Tôi có thể hoàn thành chế độ kiểu ido để tìm kiếm thẻ trong Emacs không?

(defun ido-choose-from-tags() 
    "Use ido to select tags " 
    (interactive) 
    (etags-tags-apropos 
    (ido-completing-read "Tags: " nil t))) 

Trả lời

3

Loại không hiệu quả, nhưng làm thế nào về:

(defun my-ido-find-tag() 
    "Find a tag using ido" 
    (interactive) 
    (tags-completion-table) 
    (let (tag-names) 
    (mapc (lambda (x) 
      (unless (integerp x) 
       (push (prin1-to-string x t) tag-names))) 
      tags-completion-table) 
    (find-tag (ido-completing-read "Tag: " tag-names)))) 
+0

Cảm ơn, Scott. Một lỗi: khi thẻ có dấu chấm, nó chèn dấu gạch chéo ngược ở phía trước nó, ngăn không cho các emacs tìm thấy thẻ. –

+0

Thay thế dòng cuối cùng bằng "(tìm thẻ (thay thế-regexp-in-string" \\\\ "" " \t (ido-hoàn thành đọc" Tag: "tên thẻ)))))" dường như công việc. –

+0

Bắt tốt. prin1-to-string cũng có thể lấy một đối số thứ 2 tùy chọn không thoát khỏi ký tự, vì vậy có thể (prin1-to-string x t) cũng sẽ sửa nó. – scottfrazer

0

Tất nhiên có thể, đây là EMACS. Mã không hoạt động làm gì cho bạn biết nó không hoạt động?

Nghi ngờ đầu tiên của tôi là nó có thể hoạt động tốt hơn nếu bạn sử dụng tags-apropos (xem dòng 1885 trong etags.el), xem như etags-tags-apropos không được xác định và tất cả.

1

Để tìm định nghĩa tôi sử dụng lệnh Cedet của ngữ nghĩa-ia-nhanh-nhảy, mà cùng với gtags từ GNU toàn cầu cho chuyển hướng đúng đắn và nhanh chóng thông qua các tập tin nguồn.

+0

Thật vậy, nhưng 'hoàn thành chế độ 'ido cho' ngữ nghĩa-đầy đủ-nhảy' và 'ngữ nghĩa-hoàn-nhảy-cục bộ' cũng sẽ có ích. – Jed

0

Việc mở rộng của giải pháp scottfrazer của:

(defun my-ido-find-tag() 
    "Find a tag using ido" 
    (interactive) 
    (tags-completion-table) 
    (let* ((initial-input 
      (funcall (or find-tag-default-function 
         (get major-mode 'find-tag-default-function) 
         'find-tag-default))) 
     (initial-input-regex (concat "\\(^\\|::\\)" initial-input "$"))) 
    (find-tag (ido-completing-read 
       "Tag: " 
       (sort 
       (remove nil 
         (mapcar (lambda (tag) (unless (integerp tag) 
               (prin1-to-string tag 'noescape))) 
           tags-completion-table)) 
       ;; put those matching initial-input first: 
       (lambda (a b) (string-match initial-input-regex a))) 
       nil 
       'require-match 
       initial-input)))) 

này đặt thẻ khớp với tag-at-point ở phần đầu của danh sách. Tôi đoán bạn có thể sắp xếp thứ hai theo tên đệm-tệp nếu hai thẻ khớp nhau, nhưng điều đó có thể không phải lúc nào cũng là thứ bạn muốn. Có thể nhanh hơn để sử dụng https://github.com/magnars/s.el#s-ends-with-suffix-s-optional-ignore-case hơn so khớp chuỗi đối với các bảng thẻ thực sự rất lớn.

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