Quiero indexar archivos clojure, usando etags para poder usar la funcionalidad de etiqueta de Emacs. Pero etags no reconoce las funciones de clojure. ¿Es posible ampliar etags para incluir definiciones de clojure?Clojure Emacs etags
Respuesta
Basado en http://nakkaya.com/2009/12/13/getting-etags-to-index-clojure-files/
el comando siguiente es todo en una línea
find . \! -name '.*' -name '*.clj' | xargs etags --regex='/[ \t\(]*def[a-z]* \([a-z-!]+\)/\1/' --regex='/[ \t\(]*ns \([a-z.]+\)/\1/'
Mirando la fuente, parece que solo tendrías que ejecutar etags
usando la bandera --language=lisp
, ya que el reconocedor Lisp busca la cadena 'def'.
Si eso no funciona, tendrá que modificar etags
para que pueda reconocer Clojure y producir un archivo de etiquetas para él. Here is the source of etags
in htmlized form. No parece que sería un trabajo tan difícil o largo de hacer. Estas son las reglas para el reconocimiento de Python como un ejemplo:
/*
* Python support
* Look for /^[\t]*def[ \t\n]+[^ \t\n(:]+/ or /^class[ \t\n]+[^ \t\n(:]+/
* Idea by Eric S. Raymond <[email protected]> (1997)
* More ideas by seb bacon <[email protected]> (2002)
*/
static void
Python_functions (inf)
FILE *inf;
{
register char *cp;
LOOP_ON_INPUT_LINES (inf, lb, cp)
{
cp = skip_spaces (cp);
if (LOOKING_AT (cp, "def") || LOOKING_AT (cp, "class"))
{
char *name = cp;
while (!notinname (*cp) && *cp != ':')
cp++;
make_tag (name, cp - name, TRUE,
lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
}
}
}
El soporte Lisp es un poco más complicado:
/*
* Lisp tag functions
* look for (def or (DEF, quote or QUOTE
*/
static void L_getit __P((void));
static void
L_getit()
{
if (*dbp == '\'') /* Skip prefix quote */
dbp++;
else if (*dbp == '(')
{
dbp++;
/* Try to skip "(quote " */
if (!LOOKING_AT (dbp, "quote") && !LOOKING_AT (dbp, "QUOTE"))
/* Ok, then skip "(" before name in (defstruct (foo)) */
dbp = skip_spaces (dbp);
}
get_tag (dbp, NULL);
}
static void
Lisp_functions (inf)
FILE *inf;
{
LOOP_ON_INPUT_LINES (inf, lb, dbp)
{
if (dbp[0] != '(')
continue;
if (strneq (dbp+1, "def", 3) || strneq (dbp+1, "DEF", 3))
{
dbp = skip_non_spaces (dbp);
dbp = skip_spaces (dbp);
L_getit();
}
else
{
/* Check for (foo::defmumble name-defined ... */
do
dbp++;
while (!notinname (*dbp) && *dbp != ':');
if (*dbp == ':')
{
do
dbp++;
while (*dbp == ':');
if (strneq (dbp, "def", 3) || strneq (dbp, "DEF", 3))
{
dbp = skip_non_spaces (dbp);
dbp = skip_spaces (dbp);
L_getit();
}
}
}
}
}
Para mejorar la respuesta de miner49:
tengo esto en mi .emacs (nota ligero cambio en la expresión regular, ctags estaba gritando acerca tener "-" en el medio de la expresión regular cuando no se utiliza para especificar un rango)
; Recursively generate tags for all *.clj files,
; creating tags for def* and namespaces
(defun create-clj-tags (dir-name)
"Create tags file."
(interactive "Directory: ")
(shell-command
(format "%s --langdef=Clojure --langmap=Clojure:.clj --regex-Clojure='/[ \t\(]*def[a-z]* \([a-z!-]+\)/\1/' --regex-Clojure='/[ \t\(]*ns \([a-z.]+\)/\1/' -f %s/TAGS -e -R %s" path-to-ctags dir-name (directory-file-name dir-name)))
)
Otro obstáculo fue que en mi baba de caja anula M-. usar su propia función de búsqueda en lugar de find-tag, y esa función no funcionó correctamente. Es su propia función de búsqueda en lugar de find-tag, y esa función no funcionó correctamente. puede invocar la etiqueta find-tag Seperatley para encontrar las etiquetas del archivo TAG, pero la función incorporada salta al origen de las funciones integradas cuando se conecta a un servidor slime/swank, que es bastante limpio. mis habilidades de elisp no pudieron consolidar las dos. limo espera encontrar en etiquetas para volver a cero si no que no parece suceder, por lo que el siguiente
(add-hook 'slime-edit-definition-hooks 'find-tag)
trae de vuelta TAGS búsquedas basadas, sino que destruye búsquedas Swank-servidor.
@ la respuesta de miller49r es realmente agradable. Lo modifiqué un poco para reconocer los metadatos y algunos caracteres de símbolo de clojure más aceptables:
find . \! -name '.*' -name '*.clj' \
| xargs etags \
--regex='/[ \t\(]*def[a-zA-Z!$%&*+\-.\/:<=>[email protected]^_~]*[ \n\t]+\(\^{[^}]*}[ \n\t]+\|\)\([a-zA-Z!$%&*+\-.\/:<=>[email protected]^_~]+\)/\2/s' \
--regex='/[ \t\(]*ns \([a-z.]+\)/\1/'
- 1. emacs, etags y usando emacs como IDE
- 2. Ayuda escribiendo emacs lisp para emacs etags search
- 3. Clojure funciones para Emacs?
- 4. Recargar archivos Clojure en emacs
- 5. Documentación de Clojure en Emacs
- 6. ¿Cómo usar magia de concha para crear un etags recursivo usando GNU etags?
- 7. Obtener ETags correctamente
- 8. Clojure emacs slime + swank directory question
- 9. (Débil) ETags y Last-Modified
- 10. ¿Por qué HttpCacheability.Private suprime ETags?
- 11. cómo iis 7 genera etags
- 12. ¿Es posible hacer que Python etags sea un poco más inteligente con emacs?
- 13. En una instalación de Emacs + Slime + Clojure + Windows, falla al cargar clojure-auto
- 14. ¿Cómo conecto un archivo fuente de clojure a un clojure repl en ejecución en Emacs?
- 15. ¿Cómo vuelvo a indentificar inteligentemente Clojure en Emacs?
- 16. Emacs Clojure modo tab-indentation enorme en algunos casos
- 17. ¿Cómo soporto ETags en ASP.NET MVC?
- 18. Compatibilidad con el navegador para eTags
- 19. Cómo deshabilito programáticamente Etags en iis 6
- 20. navegación por código, refactorización, autocompletado en Emacs
- 21. Excepciones personalizadas en Clojure?
- 22. ¿Deberían los HTTP ETags distinguir entre mayúsculas y minúsculas?
- 23. ETags, IIS7, Política de caché del kernel (enableKernelCache)
- 24. Cuál usar: Caducar encabezado, último encabezado modificado o ETags
- 25. ¿Por qué diferentes etags para diferentes representaciones del mismo recurso?
- 26. Clojure import versus import
- 27. Ir a la definición de función en Emacs + Slime/leiningen-Swank + Clojure
- 28. En Lisp (Clojure, Emacs Lisp), ¿cuál es la diferencia entre la lista y la cita?
- 29. ¿Cómo configuro el classpath de Clojure en Emacs después de instalar con ELPA?
- 30. Clojure: Conversión de archivo Clojure a YAML