Exuberant Ctags#
Program ctags#
Domyślne zachowanie#
Program ctags został tak zaprojektowany, aby jego wywołanie nie wymagało podawania wielu argumentów. Domyślnie przyjmowane są takie ustawienia, które są najpopularniejsze wśród jego użytkowników. Do zindeksowania bieżącego folderu roboczego wystarczy użyć jedno z poniższych wywołań:
ctags * :: tagfile ma postać "test\plik.js"
ctags .\* :: tagfile ma postać ".\test\plik.js"
ctags -R :: tagfile ma postać ".\test\plik.js"
ctags -R * :: tagfile ma postać "test\plik.js"
ctags -R .\* :: tagfile ma postać ".\test\plik.js"
Pierwsze i drugie polecenie tworzy indeks dla wszystkich plików znajdujących się w bieżącym folderze roboczym (ale pomija jego podfoldery), a pozostałe polecenia biorą pod uwagę także wszystkie podfoldery w bieżącym folderze roboczym. Użycie "*"
zamiast ".\*"
powoduje, że ścieżki tagfile
w tagach nie zawierają początkowych znaków ".\"
, przykładowo "test\plik.js"
zamiast ".\test\plik.js"
.
Oto lista z najważniejszymi domyślnymi zachowaniami programu ctags po przekazaniu jedynego argumentu *
lub -R
, o których warto pamiętać:
- Domyślnym trybem działania programu ctags jest tryb ctags #, gdzie formatem dla generowanych tagów jest rozszerzony format Exuberant Ctags (kompatybilny z oryginalnym formatem Ctags). Można to zmieniać argumentami
--format
i-e
. - Domyślną postać tagu (tj. większość jego pól) można zmieniać następującymi argumentami:
--format
,--fields
,--extra
,--excmd
,-B
,-F
,--tag−relative
i-x
. - Domyślny kształt pliku indeksu (zawierającego poszczególne tagi) można zmieniać następującymi argumentami:
--sort
,-u
,--append
,-a
,--regex-<lang>
i<lang>-kinds
. - Domyślnie program ctags będzie próbował ustalić wstępną konfigurację analizując domyślne pliki konfiguracyjne lub zmienne środowiskowe. Trzeba na to uważać, bo obecność ustawień w tych miejscach będzie miała wpływ na bieżące wywołanie programu ctags.
- Domyślnie po wygenerowaniu tagów zostają one posortowane (z ewentualnym usunięciem wszystkich duplikatów) w trybie ctags lub nieposortowane w trybie etags. Można to zmieniać argumentami
--sort
i-u
- Domyślnie po wygenerowaniu tagów zostają one zapisane do pliku indeksu w bieżącym folderze roboczym. W trybie ctags nazwą pliku indeksu jest
tags
, a w trybie etags nazwą jestTAGS
. - Domyślnie program ctags zawiera kilkanaście wewnętrznych wzorców wykluczających #, które dla bieżącego wywołania programu pomijają następujące foldery:
{arch}
,.arch-ids
,.arch-inventory
,autom4te.cache
,BitKeeper
,.bzr
,.bzrignore
,CVS
,.cvsignore
,_darcs
,.deps
,EIFGEN
,.git
,.hg
,PENDING
,RCS
,RESYNC
,SCCS
i.svn
. Aktualną listę wewnętrznych wzorców wykluczających można pobrać z informacji o wewnętrznym stanie programu zwracanych przez argumenty--verbose
lub-V
(użytych jako inicjujący argument) lub zmieniać argumentem--exclude
. - Domyślnie program ctags zawiera kilkanaście wewnętrznych rozszerzeń wskazujących na pliki includes/headers #, którymi są
h, H, hh, hpp, hxx, h++, inc, def
. Aktualną listę wewnętrznych rozszerzeń wskazujących na pliki includes/headers można pobrać z informacji o wewnętrznym stanie programu zwracanych przez argumenty--verbose
lub-V
(użytych jako inicjujący argument) lub zmieniać argumentem-h
. Domyślnie program ctags stara się określić język # użyty w przetwarzanym pliku stosując kolejno trzy testy:
- Sprawdzając rozszerzenie pliku, czy nie zostało ono zmapowane dla konkretnego języka. Aktualne mapowania dla wszystkich języków można wyświetlić używając argumentu
−−list−maps
. - Sprawdzając nazwę pliku, czy nie pasuje ona do wzorca powłoki zmapowanej dla konkretnego języka.
- W przypadku pliku wykonywalnego sprawdzając w jego pierwszej linii obecności ciągu
"#!"
, który wskazuje na ścieżkę do jego interpretera, np."#!/bin/sh"
czy"#!/usr/bin/python"
. Jest to ogólnie przyjęty format w Uniksach i określa się go terminem shebang (WikiEN, WikiPL).
Jeśli sprawdzany plik nie przechodzi powyższych testów to jest on ignorowany. Dzięki temu można bardzo łatwo zeskanować tylko te pliki, które faktycznie stanowią źródło w naszym projekcie. Przy użyciu argumentów
−−language−force
lub−−langmap
możemy wpływać na domyślny mechanizm rozpoznawania plików.- Sprawdzając rozszerzenie pliku, czy nie zostało ono zmapowane dla konkretnego języka. Aktualne mapowania dla wszystkich języków można wyświetlić używając argumentu
Przy generowaniu tagów program ctags określa ścieżki # w polu
tagfile
w oparciu o następujące kryteria:- Jeśli w argumencie
path
lub-L
użyto ścieżki bezwzględnej to w polutagfile
zawsze użyta zostanie ścieżka bezwzględna. Jeśli w argumencie
path
lub-L
użyto ścieżki względnej to:W przypadku trybu ctags:
- Jeśli użyto bądź pominięto argument
−−tag−relative=no
(co jest domyślnym zachowaniem) to odniesieniem dla ścieżek względnych w tagach jest bieżący folder roboczy (podobnie jak w plikach wskazywanych ścieżkami względnymi), dlatego w polutagfile
(na jego początku) zawsze użyta zostanie ta sama postać ścieżki względnej. - Jeśli użyto argument
−−tag−relative=yes
to w polutagfile
ścieżki względne będą tworzone w odniesieniu do folderu zawierającego domyślny plik indeksu (czyli bieżącego folderu roboczego) lub folderu zawierającego własny plik indeksu wskazanego argumentem-f
lub-o
. W tym przypadku postać ścieżki względnej z argumentupath
lub-L
nie ma żadnego wpływu na postać ścieżki względnej w polutagfile
(czasami ich początki mogą wyglądać tak samo, ale wciąż jedno nie wynika z drugiego).
- Jeśli użyto bądź pominięto argument
W przypadku trybu etags:
- Jeśli użyto bądź pominięto argument
−−tag−relative=yes
(co jest domyślnym zachowaniem) to w polutagfile
ścieżki względne będą tworzone w odniesieniu do folderu zawierającego domyślny plik indeksu (czyli bieżącego folderu roboczego) lub folderu zawierającego własny plik indeksu wskazanego argumentem-f
lub-o
. W tym przypadku postać ścieżki względnej z argumentupath
lub-L
nie ma żadnego wpływu na postać ścieżki względnej w polutagfile
(czasami ich początki mogą wyglądać tak samo, ale wciąż jedno nie wynika z drugiego). - Jeśli użyto argument
−−tag−relative=no
to odniesieniem dla ścieżek względnych w tagach jest bieżący folder roboczy (podobnie jak w plikach wskazywanych ścieżkami względnymi), dlatego w polutagfile
(na jego początku) zawsze użyta zostanie ta sama postać ścieżki względnej.
- Jeśli użyto bądź pominięto argument
- Jeśli w argumencie
Zależnie od miejsca umieszczenia argumentów # mogą wystąpić pewne różnice w sposobie ich prawidłowego użycia lub dodatkowe ograniczenia w ich zachowaniu:
- Znaki wieloznaczności
*
i?
w argumentach wskazujących na ścieżki są obsługiwane tylko wtedy, kiedy ścieżka została podana po znaku/znakach spacji. Jest to zawsze spełnione dla argumentupath
, wszystkich krótszych argumentów z wartościami poprzedzonymi spacją (np.-f
,-o
czy-L
, z jednym małym wyjątkiem w-I
), ale nigdy dla argumentu--options
czy--exclude
. - Ścieżki zawierające spacje należy otaczać podwójnymi cudzysłowami.
- Znaki wieloznaczności
Dla różnych plików konfiguracyjnych:
- Nie wolno używać argumentu
path
, ale jego w pewnym sensie zastępują ścieżki z dodatkowego pliku wskazanego argumentem-L
. - Nie wolno otaczać podwójnymi cudzysłowami żadnych wartości argumentów (zarówno w argumentach dłuższych, jak i skróconych).
- W skróconych argumentach ich wartości (jeśli występują) muszą pojawić się od razu za ich nazwą (bez dodatkowej spacji).
- W dłuższych argumentach z wartościami logicznymi nie wolno używać uproszonego zapisu dla logicznej prawdy.
- W przypadku ostatniej oficjalnej wersji programu ctags dla systemu Windows znaki wieloznaczności
*
i?
w ścieżkach (np. wskazywanych różnymi argumentami lub pochodzących z dodatkowego pliku od argumentu-L
) oraz we wzorcach wykluczających z dodatkowego pliku od argumentu--exclude
nie są obsługiwane. Zadecydował o tym brak funkcji+wildcards
ustawianej w czasie kompilacji, co można sprawdzić np. argumentem--version
. Działa za to rekursywne analizowanie zawartości folderów kontrolowane przez argument--recurse
lub-R
. W razie potrzeby przy wywołaniu programu ctags zawsze możemy przekazać dodatkowe argumentypath
, dla których znaki wieloznaczności działają.
- Nie wolno używać argumentu
Dla informacji pobieranych ze standardowego wejścia po użyciu argumentu
-L -
lub--filter
:- Nie działają argumenty
-L
,-f
,-o
,--totals
,--append
,-a
. - Argumenty
--recurse
i-R
nigdy nie zostaną potraktowane jak odroczone argumenty. - Po przejściu do standardowego wejścia poprzez argument
--filter
ponowne użycie argumentu--filter=no
, po którym nastąpi przekazanie jakiej ścieżki wygeneruje crash programu ctags.
- Nie działają argumenty