我可以在Emacs中搜索标签的ido-mode风格完成吗?

时间:2009-01-24 23:38:11

标签: emacs tags

是否可以使用ido-mode完成来查找TAGS文件中的定义?我怀疑ido-completed-read是答案的一部分。这是我的非工作代码,它显示了一个未填充的ido模式迷你缓冲区:

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

5 个答案:

答案 0 :(得分: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))))

答案 1 :(得分:1)

为了找到定义,我使用了CEDET的命令semantic-ia-fast-jump,它与来自GNU Global的gtags一起提供了适当且快速的源文件导航。

答案 2 :(得分:0)

当然有可能,这是EMACS。非工作代码告诉你什么不起作用?

我的第一个怀疑是,如果您使用tags-apropos(请参阅etags.el中的第1885行),可能会更好,因为etags-tags-apropos未定义且全部都是。

答案 3 :(得分:0)

答案 4 :(得分: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))))

这会将匹配标记的标记放在列表的开头。如果两个标签匹配,我猜你可以通过buffer-file-name进行二次排序,但这可能并不总是你想要的。对于真正巨大的标签表,使用https://github.com/magnars/s.el#s-ends-with-suffix-s-optional-ignore-case比使用字符串匹配更快。