Ctags: gtags que no respetan el archivo .ctags

Creado en 8 dic. 2017  ·  25Comentarios  ·  Fuente: universal-ctags/ctags

He construido globales con universal-ctags. Pude verificar que al ejecutar ctags --version obtengo la versión universal-ctags y no ninguna otra.

He creado un archivo .ctags que contiene:

-exclude=foo

Al ejecutar gtags, no veo que respete el archivo .ctags. en su lugar, simplemente sigue adelante y extrae etiquetas para todo en el directorio de trabajo.

¿Qué estoy haciendo mal?

Todos 25 comentarios

Universal-ctags no lee .ctags. Consulte la sección ARCHIVOS de la página de manual de ctags.1.

¿Se refiere a esto?

/ctags.cnf (on MSDOS, MSWindows only)
/etc/ctags.conf
/usr/local/etc/ctags.conf
$HOME/.ctags
$HOME/ctags.cnf (on MSDOS, MSWindows only)
.ctags
ctags.cnf (on MSDOS, MSWindows only)

If any of these configuration files exist, each will be expected to contain a set of default options which are read in the order listed when ctags starts, but before the CTAGS environment variable is read or any command line options are read. This makes it possible to set up site-wide, personal or project-level defaults. It is possible to compile ctags to read an additional configuration file before any of those shown above, which will be indicated if the output produced by the --version option lists the "custom-conf" feature. Options appearing in the CTAGS environment variable or on the command line will override options specified in these files. Only options will be read from these files. Note that the option files are read in line-oriented mode in which spaces are significant (since shell quoting is not possible). Each line of the file is read as one command line parameter (as if it were quoted with single quotes). Therefore, use new lines to indicate separate command-line arguments.

¡Veo .ctags como una de las posibilidades!

Presumiblemente, se refería a la página de manual actual .

Gracias codebrainz por responder. Entonces creé este archivo:
/pathtorepo/ctags.d/.ctags

que incluye la -R - excluye lo que necesito.

Al ejecutar este comando desde el directorio repos:

ctags --verbose

Me dice que está esperando información.

Cuando lo hago

ctags --vertbose --options = ctags.d / .ctags

hace lo correcto y extrae etiquetas de todos los repositorios excepto las exclusiones en el archivo .ctags.

¿Qué estoy haciendo mal?

Necesito ctags para respetar ctags.d / .ctags (o cualquier archivo que requiera) cuando solo ejecuto "ctags".

La razón es que estoy usando ggtags dentro de emacs y ggtags requiere que ggtags trabaje junto con ctags.

Básicamente, quiero llegar a un estado en el que pueda hacer "gtags" en el símbolo del sistema y automáticamente:

  1. Utilice etiquetas universales
  2. respeta el archivo universal-ctags (ctags.d / .ctags)

¿Cómo puedo hacer eso?

¿Qué tal /pathtorepo/.ctags.d/exclude.ctags?
Vea el árbol de origen de universal-ctags. Puede encontrar el directorio .ctags.d en él.
https://github.com/universal-ctags/ctags/tree/master/.ctags.d

Perdón por actualizar mi comentario repetidamente.

u-ctags debe cargar /pathtorepo/.ctags.d/exclude.ctags cuando se ejecuta u-ctags en / pathtorepo.
No dude en volver a abrir esto si u-ctags no carga su exclude.ctags.

masatake, gracias por la respuesta. Parece que se está recogiendo el archivo de exclusión, pero tengo un par de preguntas:

  1. esto analiza los archivos no excluidos:
    ctags --verbose --options = .ctags
    pero esto no:
    ctags --verbose
    aunque dice que recogió el archivo de exclusión, pero recibo este mensaje:

ctags: No se han especificado archivos. Prueba "ctags --help".

¿Pero por qué? ¿No debería actuar como:
ctags --verbose --options = .ctags
y simplemente analizar todo en el directorio actual excepto las exclusiones?

  1. ¿Cómo hacer que gtags use universal-ctags y recoja su archivo de exclusión?
    Cuando ejecuto gtags, analiza todo e ignora el archivo exclude.ctags aunque global está construido --with-universal-ctags

Acerca de 1. Necesito la información sobre el medio ambiente para responder a la pregunta.

Soy malo en inglés. Espero que el siguiente resultado le diga todo lo que necesita.

Por favor, compruebe que realmente está usando u-ctags.

$ ./ctags --version | grep Universal
Universal Ctags 0.0.0(248cffc9), Copyright (C) 2015 Universal Ctags Team
Universal Ctags is derived from Exuberant Ctags.

u-ctags carga archivos que tienen .ctags como sufijo bajo ./.ctags.d.

$  ls -l .ctags.d
-rw-r--r--. 1 jet jet 104 Oct 14 02:46 exclusion.ctags

--verbose opción

$ ./ctags --verbose 2>&1 | grep 'Considering option file'
Considering option file .ctags.d/exclusion.ctags: reading...

Se puede especificar un directorio o archivo con --options . Si se proporciona un directorio,
se cargan los archivos que tienen .ctags como sufijo bajo el directorio.
Sin embargo, el mismo archivo no se carga dos veces.

$ ./ctags --verbose --options=.ctags.d 2>&1 | grep 'Considering option file'
Considering option file .ctags.d/exclusion.ctags: reading...
Considering option file .ctags.d/exclusion.ctags: already considered

Un archivo sin el sufijo no se carga a menos que se especifique explícitamente el archivo con --options.

$ touch ./.ctags.d/please-load-me
$ ./ctags --verbose  2>&1 | grep 'Considering option file'
Considering option file .ctags.d/exclusion.ctags: reading...
$ mv ./.ctags.d/please-load-me ./.ctags.d/please-load-me.ctags
$ ./ctags --verbose  2>&1 | grep 'Considering option file'
Considering option file .ctags.d/exclusion.ctags: reading...
Considering option file .ctags.d/please-load-me.ctags: reading...

Eso es todo. Por favor, consulte la página del manual. Si la página de manual no está bien escrita, considere hacer una solicitud de extracción y muéstreme cómo podemos mejorarla.

Aproximadamente a las 2, lo siento, pero no sé bien sobre gtags.

Creo que recibiremos este tipo de preguntas repetidamente. ¿Qué puedo hacer antes de recibir la pregunta?

Si todavía carga $ HOME / .ctags, no obtendrá esta pregunta. La compatibilidad es excelente y no veo por qué dejas de cargar ese archivo. La confirmación ce0617a7be7a4d33a09ac60f21b8a9ce26690853 cambió esto sin decir el motivo.

Ahora tendré que mover mis archivos y actualizar mis grabaciones sobre archivos de configuración.

La confirmación es parte de # 1519, por lo que la razón se describe allí.

Romper la compatibilidad es una mala idea. Sin embargo, lo haré una vez, solo una vez (espero) cuando lance la versión inicial de u-ctags. Creo que el último es el formato de archivo de etiquetas. Lo más importante lo hace @ b4n. Lo que tengo que hacer es assigning version 3 tags file format y hacer un documento para ello.

Tengo el mismo problema que el póster original, usando ~/.ctags.d/*.ctags y (localmente) ./.ctags.d/*.ctags .
Estoy usando GNU Global 6.6.3, compilado con soporte Universal Ctags. GTAGSCONF apunta a la ruta de instalación predeterminada gtags.conf y GTAGSLABEL es new-ctags .

También miré el código fuente en /plugin-factory/exuberant-ctags.c Global (usado para llamar Universal Ctags; comenzando desde la línea 193) pero parecía que Universal Ctags se llamaba sin opción que deshabilitara la carga de .ctags.d/*.ctags .

Si prefiero informar esto a los desarrolladores globales, por favor dímelo y lo haré. :)

Reproducir:

git clone -b tests --single-branch https://github.com/janEbert/julia-ctags.git
cd julia-ctags
mkdir -p ~/.ctags.d
mkdir -p .ctags.d
ln -s $PWD/ctags ~/.ctags.d/julia.ctags  # or cp if you want to be safe
ln -s $PWD/ctags ./.ctags.d/julia.ctags
gtags
global greet  # returns nothing

¿Qué tal llamar a ctags directamente como:

$ new-ctags --version
$ new-ctags -o - JULIA-FILE

¿Obtienes el resultado esperado?

Sí, llamar a Universal Ctags ( uctags en mi máquina; GTAGSLABEL no es el nombre del binario) funciona directamente a la perfección, con o sin el archivo .ctags especificado a través de --options .
Entonces, Universal Ctags usa los archivos ~ / .ctags.d pero de alguna manera este comportamiento no se transfiere a Global.

Por favor, no use --options. uctags debe cargar ~ / .ctags.d / julia.ctags y ./.ctags.d/julia.ctags sin especificar --options.

Entonces, lo que me gustaría que corrieras es:

$ uctags --version
$ uctags -o - JULIA-FILE

Me gustaría ver la salida del comando.

Por cierto, ¿usas ctags en GNU / Linux?

Lo siento, no estaba claro. uctags usa el contenido de ~/.ctags.d como se desee, incluso si no doy la bandera --options . Sin embargo, si utilizo gtags con uctags como backend, ~/.ctags.d _no_ se utiliza.

Sí, lo estoy usando en GNU / Linux, específicamente en Ubuntu. El resultado es el siguiente:

$ uctags --version
Universal Ctags 0.0.0(1a94658c), Copyright (C) 2015 Universal Ctags Team
Universal Ctags is derived from Exuberant Ctags.
Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert
  Compiled: Jul 29 2019, 13:42:51
  URL: https://ctags.io/
  Optional compiled features: +wildcards, +regex, +iconv, +option-directory, +xpath, +packcc
$ uctags -o - testfile.jl
CtagsTest   testfile.jl /^module CtagsTest$/;"  f
ImmutablePoint  testfile.jl /^struct ImmutablePoint{T}$/;"  f
MutablePoint    testfile.jl /^mutable struct MutablePoint{T}$/;"    f
addcoment   testfile.jl /^addcoment(string::AbstractString, comment, spaces=1) = begin  # Maybe write without `begin`?$/;"  f
addone! testfile.jl /^function addone!(x::T) where {T <: Number}$/;"    f
deprecated_returnsquarepower    testfile.jl /^deprecated_returnsquarepower() = 2.0$/;"  f
multiply    testfile.jl /^multiply(x, y) = x * y$/;"    f
multiply    testfile.jl /^multiply(x, y...) = begin$/;" f
printgreeting   testfile.jl /^    function printgreeting(x)$/;" f
square  testfile.jl /^function square(x)$/;"    f

Editar: Versión más nueva compilada de Universal Ctags, la salida se mantuvo igual.

La salida no muestra la función greet que usé en el ejemplo para reproducir más arriba . Esto se debe a un analizador desactualizado en la rama a la que lo vinculé; simplemente sustituya global greet con global square y aún así no dará salida.

ok Como programa independiente, uctags funciona bien.

Estás usando GNU / Linux. ¡Bien! Te puedo ayudar mucho más.

Instale el paquete strace. No conozco bien Ubuntu, pero apt-get puede ser el comando para instalar strace.

Entonces corre

$ strace -s 4096 -f -e execve,execveat gtags

Me gustaría ver la salida.

ok Como programa independiente, uctags funciona bien.

¡Sí, funciona maravillosamente de forma independiente!

Estás usando GNU / Linux. ¡Bien! Te puedo ayudar mucho más.

Lo siento, no mencioné eso antes.

$ strace -s 4096 -f -e execve,execveat gtags
execve("/usr/local/bin/gtags", ["gtags"], 0x7ffe7e8d0fe8 /* 83 vars */) = 0
strace: Process 2210 attached
[pid  2210] execve("/usr/bin/sort", ["/usr/bin/sort", "-k", "1,1"], 0x562714c855b0 /* 84 vars */) = 0
strace: Process 2211 attached
[pid  2211] execve("/usr/bin/sort", ["/usr/bin/sort", "-k", "1,1"], 0x562714c97410 /* 84 vars */) = 0
[pid  2210] +++ exited with 0 +++
[pid  2209] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=2210, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
[pid  2211] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=2211, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
+++ exited with 0 +++

La salida de strace le dice a gtags que no llamó a uctags.

Muchísimas gracias. Lamento molestarme.
¡Entonces escriba al desarrollador de GLOBAL!
¡gracias de nuevo! Los Ctags universales son geniales. :)

Oye, lo intenté un poco. No estoy seguro de si debería escribirte a ti oa Shigio.

GNU Global usa la configuración langmap en el archivo GTAGSCONF para filtrar los archivos gtags procesos y también pasa esa configuración a Universal Ctags.

En un momento, agregué la extensión de archivo para Julia (.jl) a la configuración global, sin embargo, Universal Ctags se detuvo con la advertencia:
Idioma desconocido "[lista de mapas de idioma]"

El problema surge porque Universal Ctags primero analiza sus argumentos y luego carga las opciones en .ctags.d . Modifiqué Global para pasar explícitamente --options=[...].ctags _antes_ de que pase la opción --langmap .
Después de eso, todo funcionó perfectamente una vez más y obtengo las tablas globales.

Como dije, no estoy seguro de si esto es algo que desea cambiar (para que los archivos .ctags.d se procesen antes que los argumentos de Universal Ctags) o si debo presentar un informe a Global.

El problema surge porque Universal Ctags primero analiza sus argumentos y luego carga las opciones en .ctags.d.

No lo implementé.
Solo unas pocas excepciones, Universal-ctags carga .ctags.d / *. Ctags y luego analiza las opciones de cmdline.
Como escribí en la página de manual ctags-optlib.7, puede usar la opción --_ echo = MSG para comprender y depurar cómo u-ctags carga los archivos de configuración.

 [yamato@slave]~% ls ~/.ctags.d 
config.ctags
[yamato@slave]~% cat ~/.ctags.d/config.ctags
--_echo=hello from dot-ctags


[yamato@slave]~% u-ctags --_echo="hello from cmdline" --_force-quit
u-ctags: Notice: hello from dot-ctags
u-ctags: Notice: hello from cmdline

Consulte la página de manual de ctags.1. No entiendo por qué quiere pasar --options to ctags.
Poner julia.ctags en ~ / .ctags.d puede ser suficiente para su propósito. u-ctags carga julia.ctags automáticamente. Por lo tanto, no tiene que especificar --options explícitamente.

Bien, acabo de probar de nuevo y ya no recibo ningún error. Perdón una vez más por molestarte.

¿Fue útil esta página
0 / 5 - 0 calificaciones