Ctags: gtags ne respectant pas le fichier .ctags

Créé le 8 déc. 2017  ·  25Commentaires  ·  Source: universal-ctags/ctags

J'ai construit des globals avec universal-ctags. J'ai pu vérifier que lors de l'exécution de ctags --version, j'obtiens la version universal-ctags et aucune autre.

J'ai créé un fichier .ctags qui contient :

-exclude=foo

Lors de l'exécution de gtags, je ne le vois pas respecter le fichier .ctags. au lieu de cela, il suffit d'aller de l'avant et d'extraire les balises pour tout ce qui se trouve dans le répertoire de travail.

Qu'est-ce que je fais mal?

Tous les 25 commentaires

Universal-ctags ne lit pas les .ctags. Voir la section FICHIERS de la page de manuel ctags.1.

Parlez-vous de cela?

/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.

Je vois les .ctags comme l'une des possibilités !

Vraisemblablement, il parlait de la page de manuel actuelle .

Merci codebrainz d'avoir répondu. J'ai donc créé ce fichier :
/pathtorepo/ctags.d/.ctags

qui inclut le -R --excludes dont j'ai besoin.

Lors de l'exécution de cette commande depuis le répertoire repos :

ctags --verbose

Il me dit qu'il attend une entrée.

Quand je fais

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

il fait ce qu'il faut et extrait les balises de tous les référentiels, à l'exception des exclusions du fichier .ctags.

Qu'est-ce que je fais mal?

J'ai besoin de ctags pour respecter ctags.d/.ctags (ou tout fichier dont il a besoin) lors de l'exécution uniquement de "ctags".

La raison en est que j'utilise des ggtags dans emacs et que les ggtags nécessitent que les ggtags fonctionnent côte à côte avec les ctags.

Donc, fondamentalement, je veux arriver à un état où je peux simplement faire des "gtags" sur l'invite de commande et cela automatiquement :

  1. Utiliser universal-ctags
  2. respecte le fichier universal-ctags (ctags.d/.ctags)

Comment puis je faire ça?

Qu'en est-il de /pathtorepo/.ctags.d/exclude.ctags ?
Voir l'arborescence des sources de universal-ctags elle-même. Vous pouvez y trouver le répertoire .ctags.d.
https://github.com/universal-ctags/ctags/tree/master/.ctags.d

Désolé d'avoir mis à jour mon commentaire à plusieurs reprises.

Les u-ctags doivent charger /pathtorepo/.ctags.d/exclude.ctags lors de l'exécution de u-ctags sur /pathtorepo.
N'hésitez pas à le rouvrir si u-ctags ne charge pas votre exclu.ctags.

masatake, merci pour la réponse. Il semble que le fichier d'exclusion soit récupéré, mais j'ai quelques questions :

  1. cela analyse les fichiers non exclus :
    ctags --verbose --options=.ctags
    mais ce n'est pas le cas :
    ctags --verbose
    bien qu'il dise qu'il a récupéré le fichier d'exclusion, mais j'obtiens ce message :

ctags : aucun fichier spécifié. Essayez "ctags --help".

Mais pourquoi? Ne devrait-il pas agir comme :
ctags --verbose --options=.ctags
et simplement tout analyser dans le répertoire actuel, sauf les exclus ?

  1. Comment obtenir des gtags en utilisant universal-ctags et récupérer son fichier d'exclusion ?
    Lorsque j'exécute gtags, il analyse tout et ignore le fichier exclude.ctags bien que global soit construit --with-universal-ctags

À propos de 1. J'ai besoin des informations sur l'environnement pour répondre à la question.

Je suis mauvais en anglais. J'espère que la sortie suivante vous dira tout ce dont vous avez besoin.

S'il vous plaît, vérifiez que vous utilisez vraiment des 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 charge les fichiers ayant .ctags comme suffixe sous ./.ctags.d.

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

--verbose option

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

Un répertoire ou un fichier peut être spécifié avec --options . Si un répertoire est donné,
les fichiers ayant .ctags comme suffixe sous le répertoire sont chargés.
Cependant, le même fichier n'est pas chargé deux fois.

$ ./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 fichier sans suffixe n'est pas chargé à moins de spécifier explicitement le fichier avec --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...

C'est tout. Veuillez consulter la page de manuel. Si la page de manuel n'est pas bien écrite, pensez à faire une pull request et montrez-moi comment nous pouvons l'améliorer.

Environ 2, je suis désolé mais je ne connais pas bien les gtags.

Je pense que nous aurons ce genre de question à plusieurs reprises. Que puis-je faire avant de poser la question ?

Si vous chargez toujours $HOME/.ctags, vous n'aurez pas cette question. La compatibilité est excellente et je ne vois pas pourquoi vous arrêtez de charger ce fichier. Le commit ce0617a7be7a4d33a09ac60f21b8a9ce26690853 a changé cela sans en dire la raison.

Maintenant, je vais devoir déplacer mes fichiers et mettre à jour mes enregistrements sur les fichiers de configuration.

Le commit fait partie de #1519, donc la raison y est décrite.

Rompre la compatibilité est une mauvaise idée. Cependant, je le ferai une seule fois (j'espère) lors de la sortie de la version initiale de u-ctags. Je pense que le dernier est le format de fichier de balises. La chose la plus importante est faite par @b4n. Ce que je dois faire, c'est assigning version 3 tags file format et créer un document pour cela.

J'ai le même problème que l'affiche originale, en utilisant à la fois ~/.ctags.d/*.ctags et (localement) ./.ctags.d/*.ctags .
J'utilise GNU Global 6.6.3, compilé avec le support Universal Ctags. GTAGSCONF pointe vers le chemin d'installation par défaut gtags.conf et GTAGSLABEL est new-ctags .

J'ai également parcouru le code source dans le /plugin-factory/exuberant-ctags.c Global (utilisé pour appeler Universal Ctags ; à partir de la ligne 193) mais il semblait que Universal Ctags était appelé sans option qui désactiverait le chargement de .ctags.d/*.ctags .

Si je préfère signaler cela au(x) développeur(s) mondial(s), veuillez me le dire et je le ferai. :)

Reproduire:

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

Que diriez-vous d'appeler directement des ctags comme :

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

Obtenez-vous le résultat attendu?

Oui, appeler Universal Ctags ( uctags sur ma machine ; GTAGSLABEL n'est pas le nom du binaire) fonctionne directement parfaitement, avec ou sans le fichier .ctags spécifié via --options .
Ainsi, Universal Ctags utilise les fichiers ~/.ctags.d mais ce comportement n'est pas transféré à Global.

S'il vous plaît, n'utilisez pas --options. uctags doit charger ~/.ctags.d/julia.ctags et ./.ctags.d/julia.ctags sans spécifier --options.

Donc ce que j'aimerais que vous exécutiez c'est :

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

Je voudrais voir la sortie de la commande.

BTW, utilisez-vous des ctags sur GNU/Linux ?

Désolé, je n'ai pas été clair. uctags utilise le contenu de ~/.ctags.d comme souhaité, même si je ne donne pas le drapeau --options . Cependant, si j'utilise gtags avec uctags comme backend, ~/.ctags.d n'est _pas_ utilisé.

Oui, je l'utilise sur GNU/Linux, en particulier Ubuntu. La sortie est la suivante :

$ 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

Edit : version plus récente compilée de Universal Ctags, la sortie est restée la même.

La sortie n'affiche pas la fonction greet que j'ai utilisée dans l'exemple pour reproduire plus loin . Cela est dû à un analyseur obsolète dans la branche à laquelle je vous ai lié – remplacez simplement global greet par global square et il ne donnera toujours aucune sortie.

ok En tant que programme autonome, uctags fonctionne bien.

Vous utilisez GNU/Linux. Bon! Je peux vous aider beaucoup plus.

S'il vous plaît, installez le paquet strace. Je ne connais pas bien Ubuntu mais apt-get peut être la commande pour installer strace.

Puis cours

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

J'aimerais voir le rendu.

ok En tant que programme autonome, uctags fonctionne bien.

Oui, cela fonctionne magnifiquement de manière autonome !

Vous utilisez GNU/Linux. Bon! Je peux vous aider beaucoup plus.

Désolé je ne l'ai pas mentionné plus tôt.

$ 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 sortie de strace indique que gtags n'a pas appelé uctags.

Merci beaucoup. Je suis désolé de déranger.
Alors écrivez au développeur de GLOBAL !
Merci encore! Les Ctags universels sont super. :)

Hé, j'ai essayé un peu. Je ne sais pas si je dois vous écrire ou Shigio.

GNU Global utilise les paramètres langmap dans le fichier GTAGSCONF pour filtrer les fichiers traités par gtags et transmet également ces paramètres à Universal Ctags.

À un moment donné, j'avais ajouté l'extension de fichier pour Julia (.jl) à la configuration globale, cependant, Universal Ctags s'est arrêté avec l'avertissement :
Langue inconnue "[liste des langmaps]"

Le problème survient car Universal Ctags analyse d'abord ses arguments, puis charge les options dans .ctags.d . J'ai modifié Global pour transmettre explicitement --options=[...].ctags _avant_ qu'il transmette l'option --langmap .
Après cela, tout a fonctionné à nouveau parfaitement et j'obtiens les tables globales.

Comme je l'ai dit, je ne sais pas si c'est quelque chose que vous voulez changer (afin que les fichiers .ctags.d soient traités avant les arguments à Universal Ctags) ou si je dois déposer un rapport à Global.

Le problème survient car Universal Ctags analyse d'abord ses arguments, puis charge les options dans .ctags.d.

Je ne l'ai pas mis en œuvre.
À quelques exceptions près, Universal-ctags charge .ctags.d/*.ctags puis analyse les options de la ligne de commande.
Comme je l'ai écrit dans la page de manuel ctags-optlib.7, vous pouvez utiliser l'option --_echo=MSG pour comprendre et déboguer comment u-ctags charge les fichiers de configuration.

 [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

Voir la page de manuel ctags.1. Je ne comprends pas pourquoi vous voulez passer --options à ctags.
Mettre julia.ctags dans ~/.ctags.d peut suffire à votre objectif. u-ctags charge julia.ctags automatiquement. Vous n'avez donc pas besoin de spécifier explicitement --options.

D'accord, je viens de tester à nouveau et je n'obtiens plus d'erreur non plus. Désolé encore une fois de vous déranger.

Cette page vous a été utile?
0 / 5 - 0 notes