2009-01-24 13 views

Respuesta

3

tipo de ineficiente, pero ¿qué tal:

(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

Gracias, Scott. Un error: cuando una etiqueta contiene un punto, inserta una barra invertida delante de ella, impidiendo que emacs encuentre la etiqueta. –

+0

Reemplazar la última línea con "(find-tag (replace-regexp-in-string" \\\\ "" " \t (ido-completing-read" Etiqueta: "nombres-etiqueta)))))" parece trabajo. –

+0

Buena captura. prin1-to-string también puede tomar un segundo argumento opcional que no escapa a los caracteres, por lo que tal vez (prin1-to-string x t) lo arreglaría también. – scottfrazer

0

Por supuesto que es posible, esto es Emacs. ¿Qué hace el código no funcional que le dice que no está funcionando?

Mi primera sospecha es que podría funcionar mejor si usaste tags-apropos (mira sobre la línea 1885 en etags.el), ya que etags-tags-apropos no está definido y todo.

1

encontrar definiciones que uso de comandos de CEDET semántico-ia-rápido-salto, que, junto con generar GTAGS de GNU Mundial da la navegación adecuada y rápida a través de archivos de origen.

+0

De hecho, pero la terminación 'ídolo-modo' para' semántico-salto completo' y 'semántico-completo-salto-local' también sería útil. – Jed

0

Una expansión de la solución de 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)))) 

Esto pone el tag tag-a-punto en la cabeza de la lista. Supongo que podría ordenar de forma secundaria por buffer-file-name si dos etiquetas coinciden, pero eso no siempre es lo que desea. Puede ser más rápido usar https://github.com/magnars/s.el#s-ends-with-suffix-s-optional-ignore-case que cadena de coincidencias para tablas de etiquetas realmente grandes.

Cuestiones relacionadas