2009-01-24 53 views
6

是否有可能使用ido模式完成來找到TAGS文件中的定義?我懷疑讀者是否完成閱讀是答案的一部分。這是我的非工作代碼,它顯示了一個無人填充的ido模式迷你緩衝器:我可以在Emacs中使用ido-mode-style完成搜索標籤嗎?

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

回答

3

類,但如何:

(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

謝謝,斯科特。一個錯誤:當標籤包含句點時,它會在其前面插入反斜線,從而阻止emacs找到標籤。 – 2009-01-25 04:12:57

+0

用「(find-tag(replace-regexp-in-string)\\\\」「」 \t(ido-completion-read「Tag:」tag-names)))))「替換最後一行」似乎是工作。 – 2009-01-25 04:18:49

0

當然,這是可能的,這是EMACS。非工作代碼是否會告訴你它不工作?

我的第一個懷疑是,如果您使用tags-apropos(請參閱etags.el中的第1885行),看起來etags-tags-apropos未定義和全部,它可能會更好。低效

1

要與GNU全球gtags找到我使用CEDET的命令語義-IA-快跳的定義,它們共同提供了通過源文件正確和快速導航。

0

scottfrazer的解決方案的擴展:

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

這使標籤匹配的標籤,以點在列表的頭部。我想如果兩個標籤匹配,你可以通過緩衝文件名進行二次排序,但這可能並不總是你想要的。使用https://github.com/magnars/s.el#s-ends-with-suffix-s-optional-ignore-case可能會比使用字符串匹配真正巨大的標籤表更快。

相關問題