Ctags: gtags não respeitando o arquivo .ctags

Criado em 8 dez. 2017  ·  25Comentários  ·  Fonte: universal-ctags/ctags

Eu construí globais com ctags universais. Pude verificar que ao executar ctags --version recebo a versão universal-ctags e não qualquer outra.

Criei um arquivo .ctags que contém:

-exclude=foo

Ao executar gtags, não vejo respeito ao arquivo .ctags. em vez disso, basta ir em frente e extrair as tags de tudo no diretório de trabalho.

O que estou fazendo de errado?

Todos 25 comentários

Universal-ctags não lê .ctags. Consulte a seção ARQUIVOS da página do manual ctags.1.

Você está se referindo a isso?

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

Eu vejo .ctags como uma das possibilidades!

Presumivelmente, ele se referia à página de manual atual .

Obrigado codebrainz por responder. Então, criei este arquivo:
/pathtorepo/ctags.d/.ctags

que inclui o -R --exclui o que eu preciso.

Ao executar este comando a partir do diretório repos:

ctags --verbose

Ele me diz que está esperando uma entrada.

Quando eu faço

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

ele faz a coisa certa e extrai as tags de todo o repo, exceto as exclusões no arquivo .ctags.

O que estou fazendo de errado?

Eu preciso de ctags para respeitar ctags.d / .ctags (ou qualquer arquivo que ele requeira) ao executar apenas "ctags".

A razão é que estou usando ggtags dentro do emacs e ggtags exige que os ggtags trabalhem lado a lado com os ctags.

Então, basicamente, eu quero chegar a um estado em que posso apenas fazer "gtags" no prompt de comando e automaticamente:

  1. Use universal-ctags
  2. respeita o arquivo universal-ctags (ctags.d / .ctags)

Como eu posso fazer isso?

Que tal /pathtorepo/.ctags.d/exclude.ctags?
Veja a árvore de origem do próprio universal-ctags. Você pode encontrar o diretório .ctags.d nele.
https://github.com/universal-ctags/ctags/tree/master/.ctags.d

Desculpe por atualizar meu comentário repetidamente.

u-ctags deve carregar /pathtorepo/.ctags.d/exclude.ctags ao executar u-ctags em / pathtorepo.
Sinta-se à vontade para reabrir se u-ctags não carregar seu exclude.ctags.

masatake, obrigado pela resposta. Parece que o arquivo de exclusão está sendo selecionado, mas tenho algumas perguntas:

  1. isso analisa os arquivos não excluídos:
    ctags --verbose --options = .ctags
    mas isso não:
    ctags --verbose
    embora diga que pegou o arquivo de exclusão, mas recebo esta mensagem:

ctags: Nenhum arquivo especificado. Experimente "ctags --help".

Mas por que? Não deveria agir como:
ctags --verbose --options = .ctags
e apenas analisar tudo no diretório atual, exceto o excludes?

  1. Como obter gtags use universal-ctags e pegar seu arquivo de exclusão?
    Quando executo gtags, ele analisa tudo e ignora o arquivo exclude.ctags, embora o global seja compilado --with-universal-ctags

Sobre 1. Preciso das informações sobre o ambiente para responder a pergunta.

Eu sou ruim em inglês. Espero que o resultado a seguir possa lhe dizer tudo o que você precisa.

Por favor, verifique se você 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 carrega arquivos tendo .ctags como sufixo sob ./.ctags.d.

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

--verbose informa quais arquivos são carregados.

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

Um diretório ou arquivo pode ser especificado com --options . Se um diretório for fornecido,
arquivos tendo .ctags como sufixo no diretório são carregados.
No entanto, o mesmo arquivo não é carregado duas vezes.

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

Um arquivo sem o sufixo não é carregado a menos que seja especificado o arquivo com --options explicitamente.

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

Isso é tudo. Por favor, veja a página de manual. Se a página do manual não estiver bem escrita, por favor, considere fazer uma solicitação de pull e me mostre como podemos melhorá-la.

Por volta das 2, sinto muito, mas não sei bem sobre gtags.

Acho que receberemos esse tipo de pergunta repetidamente. O que posso fazer antes de receber a pergunta?

Se você ainda carregar $ HOME / .ctags, não receberá esta pergunta. A compatibilidade é ótima, e não vejo por que você para de carregar esse arquivo. O commit ce0617a7be7a4d33a09ac60f21b8a9ce26690853 mudou isso sem dizer o motivo.

Agora terei que mover meus arquivos e atualizar minhas gravações sobre os arquivos de configuração.

O commit faz parte do # 1519, então o motivo está descrito lá.

Romper a compatibilidade é uma má ideia. No entanto, farei isso uma vez, apenas uma vez (espero) quando lançar a versão inicial do u-ctags. Acho que o último é o formato do arquivo de tags. A coisa mais importante é feita por @ b4n. O que tenho que fazer é assigning version 3 tags file format e criar um documento para ele.

Tenho o mesmo problema do autor da postagem original, usando ~/.ctags.d/*.ctags e (localmente) ./.ctags.d/*.ctags .
Estou usando o GNU Global 6.6.3, compilado com suporte Universal Ctags. GTAGSCONF aponta para o caminho de instalação padrão gtags.conf e GTAGSLABEL é new-ctags .

Eu também olhei o código-fonte no /plugin-factory/exuberant-ctags.c da Global (usado para chamar Universal Ctags; a partir da linha 193), mas parecia que Universal Ctags é chamado sem nenhuma opção que desabilitaria o carregamento de .ctags.d/*.ctags .

Se eu preferir relatar isso ao (s) desenvolvedor (es) global (is), diga-me e eu o farei. :)

Reproduzir:

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 tal chamar ctags diretamente como:

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

Você consegue o resultado esperado?

Sim, chamar Universal Ctags ( uctags em minha máquina; GTAGSLABEL não é o nome do binário) funciona diretamente perfeitamente, com ou sem o arquivo .ctags especificado por --options .
Portanto, o Universal Ctags usa os arquivos ~ / .ctags.d, mas de alguma forma esse comportamento não é transferido para o Global.

Por favor, não use --options. uctags deve carregar ~ / .ctags.d / julia.ctags e ./.ctags.d/julia.ctags sem especificar --options.

Então, o que eu gostaria que você executasse é:

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

Eu gostaria de ver a saída do comando.

BTW, você usa ctags no GNU / Linux?

Desculpe, não fui claro. uctags usa o conteúdo de ~/.ctags.d conforme desejado, mesmo que eu não forneça o sinalizador --options . No entanto, se eu usar gtags com uctags como backend, ~/.ctags.d _não_ é usado.

Sim, estou usando no GNU / Linux, especificamente no Ubuntu. O resultado é o seguinte:

$ 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: Compilado a versão mais recente do Universal Ctags, a saída permaneceu a mesma.

A saída não mostra a função greet que usei no exemplo para reproduzir mais acima . Isso se deve a um analisador desatualizado no branch ao qual vinculei você - apenas substitua global greet por global square e ainda não dará saída.

ok Como um programa independente, o uctags funciona bem.

Você está usando GNU / Linux. Boa! Eu posso te ajudar muito mais.

Por favor, instale o pacote strace. Não conheço bem o Ubuntu, mas apt-get pode ser o comando para instalar o strace.

Então corra

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

Eu gostaria de ver a saída.

ok Como um programa independente, o uctags funciona bem.

Sim, funciona perfeitamente autônomo!

Você está usando GNU / Linux. Boa! Eu posso te ajudar muito mais.

Desculpe, não mencionei isso 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 +++

A saída de strace diz que gtags não chamaram uctags.

Muito obrigado. Desculpe incomodar.
Em seguida, escreva para o desenvolvedor do GLOBAL!
obrigado novamente! Ctags universais são ótimos. :)

Ei, eu tentei um pouco. Não tenho certeza se devo escrever para você ou para Shigio.

GNU Global usa langmap settings no arquivo GTAGSCONF para filtrar os arquivos gtags processos e também passa essas configurações para Universal Ctags.

A certa altura, adicionei a extensão de arquivo de Julia (.jl) à configuração Global, no entanto, o Universal Ctags parou com o aviso:
Idioma desconhecido "[lista de mapas de idiomas]"

O problema surge porque o Universal Ctags primeiro analisa seus argumentos e, em seguida, carrega as opções em .ctags.d . Modifiquei Global para passar explicitamente --options=[...].ctags _before_ que passa a opção --langmap .
Depois disso, tudo funcionou perfeitamente mais uma vez e recebo as tabelas globais.

Como eu disse, não tenho certeza se isso é algo que você deseja alterar (para que os arquivos .ctags.d sejam processados ​​antes dos argumentos para Ctags Universal) ou se devo enviar um relatório para a Global.

O problema surge porque o Universal Ctags primeiro analisa seus argumentos e, em seguida, carrega as opções em .ctags.d.

Eu não implementei isso.
Apenas algumas exceções, Universal-ctags carrega .ctags.d / *. Ctags e analisa as opções de cmdline.
Como escrevi na página do manual ctags-optlib.7, você pode usar a opção --_ echo = MSG para entender e depurar como o u-ctags carrega arquivos de configuração.

 [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 a página do manual ctags.1. Não entendo por que você deseja passar --opções para ctags.
Colocar julia.ctags em ~ / .ctags.d pode ser o suficiente para seu propósito. u-ctags carrega julia.ctags automaticamente. Portanto, você não precisa especificar --options explicitamente.

Ok, acabei de testar novamente e também não recebo mais um erro. Mais uma vez, desculpe por incomodar você.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

jagjordi picture jagjordi  ·  9Comentários

cweagans picture cweagans  ·  13Comentários

masatake picture masatake  ·  18Comentários

EvanCarroll picture EvanCarroll  ·  14Comentários

softinio picture softinio  ·  6Comentários