Exuberant Ctags#
Program ctags#
Przetwarzanie argumentów#
W programie ctags dostępnych jest aż 48 argumentów, które sterują jego zachowaniem. Większość z nich można podawać wielokrotnie w dowolnym wariancie konfiguracyjnym, co sprawia, że w trakcie przetwarzania kolejnego argumentu zachowanie programu ctags może ulec zmianie. Z tego też względu wyróżniamy kilka rodzajów argumentów #:
- inicjujące argumenty (
--verbose
,-V
lub--options=NONE
) - standardowe argumenty (wszystkie nieprzekazane jako inicjujący argument)
- odroczone argumenty (
--append
,-a
,--recurse
,-R
,--sort
,-u
,--totals
,-L
,-f
,-o
lub−−etags−include
) - przerywające argumenty (
--help
,--version
,--license
,--list−languages
,--list−maps
lub--list−kinds
)
- odroczone argumenty (
Dla lepszego zrozumienia tematu przeanalizujmy dokładniej sposób, w jaki program ctags przetwarza swoje argumenty. Załóżmy, że mamy następujące teoretyczne wywołanie programu ctags:
ctags initArg1 initArg2 standardArg1 standardArg2
Działanie programu ctags można opisać następująco:
Najpierw analizowane są początkowe argumenty (u nas
initArg1
iinitArg2
) aż do wystąpienia pierwszego standardowego argumentu (u nasstandardArg1
). Jeśli wśród tych początkowych argumentów pojawią się inicjujące argumenty to program ctags wykona pewne specyficzne zadania, które są przewidziane dla tych argumentów.Standardowy argument # to każdy argument, który nie jest inicjującym argumentem. Niektóre standardowe argumenty zalicza się jeszcze do odroczonych argumentów lub przerywających argumentów.
Inicjujący argument # to taki argument, który musi być jednym z początkowych argumentów przekazanych przy wywołaniu programu ctags. Przekazanie go w ten sposób powoduje, że jego działanie ma specjalne znaczenie dla programu ctags. Kolejność między inicjującymi argumentami nie jest istotna, ale wszystkie one muszą pojawić się jeszcze przed pierwszym standardowym argumentem. Do inicjujących argumentów zaliczamy:
--options=NONE
,--verbose
czy-V
. Prosty przykład:ctags -V :: `-V` jest argumentem inicjującym ctags -V --options=NONE :: `-V` i `--options` są argumentami inicjującymi ctags --options=NONE -V :: `-V` i `--options` są argumentami inicjującymi ctags * -V :: `-V` nie jest argumentem inicjującym ctags -R -V :: `-V` nie jest argumentem inicjującym ctags test.js -V :: `-V` nie jest argumentem inicjującym ctags -V test.js --options=NONE test.html :: tylko `-V` jest argumentem inicjującym
Następnie, jeśli program ctags został uruchomiony bez inicjującego argumentu w postaci
--options=NONE
, to spróbuje on ustalić wstępną konfigurację w oparciu o domyślne pliki konfiguracyjne i zmienne środowiskowe. Jeśli oba te warianty wskazują na jakieś dodatkowe pliki konfiguracyjne to one również zostaną przeanalizowane.Jeśli w powyższych miejscach jakiś argument wystąpi wielokrotnie to finalnie użyta zostanie wartość tego ostatniego. Jeśli jakiś argument nie został podany wprost to przyjęte zostanie jego domyślne zachowanie.
Następnie program ctags wraca do przetwarzania pozostałych standardowych argumentów, które przekazano przy jego wywołaniu. Robi to w sposób cykliczny, tj. argument po argumencie (z uwzględnieniem jego ewentualnej wartość występującej za nim). To powoduje, że każdy kolejny standardowy argument może zmienić bieżące ustawienia programu ctags, i będą one miały zastosowanie przy dalszym przetwarzaniu argumentów (np. dla plików/folderów wskazywanych przez argument
path
). Niektóre argumenty są odroczonymi argumentami i wpływają na wykonanie lub pominięcie kilku końcowych akcji.Takie wyrywkowe zmieniane zachowania programu ctags w trakcie przetwarzania standardowych argumentów, choć możliwe, powinno być stosowane sporadycznie. W przeciwnym razie dla różnych plików/folderów możemy wygenerować tagi o odmiennych formatach, a umieszczenie ich w jednym pliku indeksu nie ma większego sensu. Prosty przykład:
ctags plik1.js --format=1 plik2.js -e plik3.js
Jeśli użytkujemy program ctags poprzez argumenty przekazywane wprost przy jego wywołaniu to najlepiej zawsze podawać najpierw te argumenty, które odpowiadają za jego konfigurację, a dopiero potem te, które wskazują na konkretne pliki/foldery. Dzięki temu otrzymamy spójną konfigurację dla wszystkich analizowanych plików. Jeśli naprawdę zależy nam na innych ustawieniach dla poszczególnych plików/folderów to wystarczy jeszcze raz wywołać dla nich program ctags, ale z innymi ustawieniami.
Po przetworzeniu wszystkich standardowych argumentów, które przekazano przy wywołaniu programu ctags, przystępuje on do wykonania kilku końcowych akcji. Niektóre z tych akcji są kontrolowane przez odroczone argumenty.
Odroczony argument # to jeden ze standardowych argumentów, który wpływa na wykonanie lub pominięcie przypisanych do niego akcji dopiero na samym końcu działania programu ctags, po przetworzeniu wszystkich innych standardowych argumentów, które przekazano przy wywołaniu programu. Przykładami odroczonych argumentów mogą być:
--append
,-a
,--recurse
,-R
,--sort
,-u
,--totals
,-L
czy−−etags−include
.Ostatnią akcją podjętą przez program ctags będzie zapisanie odnalezionych tagów do pliku indeksu (domyślnego lub wskazanego argumentem
-f
lub-o
) lub wyświetlenie ich do standardowego wyjścia (ponowie poprzez argument-f-
lub-o-
), i w końcu zamknięcie samego programu ctags.W ramach uzupełnienia warto jeszcze wspomnieć o przerywającym argumencie #, który jest jednym ze standardowych argumentów. Wystąpienie takiego argumentu w dowolnym miejscu jednego z wariantów konfiguracyjnych powoduje przerwanie przetwarzania dalszych argumentów oraz anulowanie wszystkich końcowych akcji kontrolowanych przez odroczone argumenty. Zadziała natomiast zapisanie domyślnego lub konkretnego pliku indeksu (jeśli do chwili wystąpienia tego argumentu wygenerowano jakieś tagi), ale nie zadziała wyświetlenie tych tagów do standardowego wyjścia poprzez argument
-f-
lub-o-
. Do przerywających argumentów zaliczamy:--help
,--version
,--license
,--list−languages
,--list−maps
czy--list−kinds
. Prosty przykład:ctags --help ctags --version ctags --license ctags -V --help :: zadziałają oba argumenty ctags --help -V :: zadziała tylko '--help' ctags --help --version -- license :: zadziała tylko '--help' ctags -V plik.js --help :: utworzy domyślny plik indeksu (ale bez posortowania tagów) ctags -V plik.js --totals --help :: jak wyżej, ale nie zadziała `totals` ctags -V -fidx plik.js --help :: utworzy plik indeksu `idx` (ale bez posortowania tagów)` ctags -V -f- plik.js --help :: nie zwróci tagów ani do standardowego wyjścia ani do domyślnego pliku indeksu
Ogólnie rzecz biorąc to przerywające argumenty służą tylko do wyświetlenia pewnych podstawowych informacji o programie ctags i nie powinny być łączone z innymi argumentami.