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?
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:
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:
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?
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ê.