Exuberant Ctags#
Program ctags#
-h#
Argument -h
dla bieżącego wywołania programu ctags kontroluje stanem wewnętrznych rozszerzeń wskazujących na pliki includes/headers, gdzie w procesie generowania tagów ich zawartość może być potraktowana nieco inaczej niż w przypadku pozostałych plików (np. niektóre z generowanych tagów nigdy nie zostaną potraktowane jak tagi statyczne).
Opis działania#
Prawidłowe użycie argumentu najlepiej objaśnić na zapisie składniowym:
ctags -h value [--argument | -argument] [path]
gdzie poszczególne człony oznaczają:
- ctags - ścieżka względna lub bezwzględna do pliku binarnego programu ctags (
ctags.exe
). Wszystko zależy od sposobu uruchamiania programu ctags, np. z systemowej konsoli, ze skrótu do programu czy z innego programu/skryptu. value - jedna z dwóch wartości tekstowych wpływająca na stan wewnętrznych rozszerzeń wskazujących na pliki includes/headers (wielkość znaków nie ma znaczenia tylko w przypadku rozszerzeń plików):
"list"
- lista z nowymi/dodatkowymi rozszerzeniami wskazującymi na pliki includes/headers. Przy tworzeniu tej listy należy pamiętać o kilku regułach:- Poszczególnych rozszerzeń na liście nie rozdziela się żadnym dodatkowym separatorem, np.
".h.inc.def"
. - Duplikowanie rozszerzeń na liście jest dopuszczalne i w żaden sposób nie wpływa na działanie programu ctags, np.
".h.inc.h.def.def"
. - W przypadku ostatniej oficjalnej wersji programu ctags dla systemu Windows między rozszerzeniami z listy a analizowanymi plikami użyte zostaje proste porównanie tekstowe, gdzie umieszczone w rozszerzeniach znaki wieloznaczności
*
i?
lub znaki grupujące w postaci nawiasów kwadratowych nie są obsługiwane. Zadecydował o tym brak funkcji+wildcards
ustawianej w czasie kompilacji, co można sprawdzić np. argumentem--version
. Mimo że znaki te są akceptowane przy definiowaniu rozszerzeń to nie oznacza wcale, że zostaną obsłużone zgodnie z ich pierwotnym przeznaczeniem. - Użycie w liście znaku kroki, po którym nie wystąpi inny znak niż kropka oznacza wszystkie pliki bez rozszerzenia. Jeśli lista rozpoczyna się od kropki wskazującej na wszystkie pliki bez rozszerzenia to koniecznie należy podać przed nią/za nią przynajmniej jedną dodatkową wartość (np. jakieś rozszerzenie), w przeciwnym razie program ctags zwróci komunikat
ctags: -h: Invalid list
. Prawidłowe będą zapisy"+."
,".h."
czy"..h"
. - Jeśli lista z rozszerzeniami rozpoczyna się od dodatkowego prefiksu w postaci znaku
"+"
to wszystkie rozszerzenia z tej listy zostaną dołączone do domyślnych rozszerzeń wskazujących na pliki includes/headers. W przeciwnym razie nowe rozszerzenia wymienione w liście zawsze zastąpią wszystkie te rozszerzenia, które zdefiniowane do chwili podania nowych. Przykładowo zapis".h"
oznacza, że tylko pliki z rozszerzeniami.h
będą traktowane jak pliki includes/headers, a zapis"+.h"
oznacza, że pliki z rozszerzeniami.h
dodatkowo będą traktowane jak pliki includes/headers.
- Poszczególnych rozszerzeń na liście nie rozdziela się żadnym dodatkowym separatorem, np.
"default"
- specjalna wartość przywracająca domyślne rozszerzenia wskazujące na pliki includes/headers dla bieżącego wywołania programu ctags.
- argument - jeden lub więcej dodatkowych argumentów dostrajających działanie programu ctags.
- path - jedna lub więcej dodatkowych ścieżek do plików/folderów, które będą analizowane przy generowaniu tagów (szczegóły).
Kilka uwag odnośnie stosowania argumentu -h
:
- Argument
-h
można podawać wielokrotnie (separatorem jest spacja), i każdy kolejny będzie miał wpływ tylko na te pliki, które występują bezpośrednio po nim. - Przekazanie argumentu
-h
bez podania jakiejkolwiek niepustej wartości zwróci komunikatctags: -h: Invalid list
. Także otoczenie pustej wartości lub samych białych znaków podwójnymi cudzysłowami zwróci komunikatctags: Missing parameter for "h" option
. To powoduje, że nie ma oczywistego sposobu na anulowanie wszystkich zdefiniowanych do tej pory rozszerzeń dla plików includes/headers (wewnętrznych lub własnych) bez podania nowych rozszerzeń. W praktyce wystarczy rozpocząć listę z rozszerzeniami jakimś znakiem, który nie wpływa na zachowanie tej listy i nie pojawia się na początku nazwy w analizowanych plikach, np. pojedynczym cudzysłowem"'"
czy minusem"-"
. Prawidłowe będą wywołania"ctags -h ' *"
czy"ctags -h - *"
. - W programie ctags nie ma żadnego argumentu, który zwróciłby aktualną listę z rozszerzeniami wskazującymi na pliki includes/headers. Można jedynie odczytać domyślne rozszerzenia z informacji o wewnętrznym stanie programu zwracanych przez argumenty
--verbose
lub-V
(użytych jako inicjujący argument). - Specyficzne przetwarzanie plików includes/headers jest możliwe tylko za pośrednictwem wbudowanych parserów, w których przewidziano taką możliwość. Jeżeli jakieś rozszerzenie wskazujące na pliki includes/headers nie zostało skojarzone z żadnym obsługiwanym językiem to można skorzystać z argumentów
--langmap
lub--language−force
. - Tylko niektóre z domyślnych rozszerzeń wskazujących na pliki includes/headers (tj.
.h, .h++, .hh, .hpp, .hxx
) zostały skojarzone z językiem C++ (a nie C) bo właśnie w tym języku są najczęściej używane i nie powodują problemów, gdy zostaną przetworzone zgodnie z regułami języka C++. Można to sprawdzić za pomocą argumentu--list-maps
.
Prosty przykład:
ctags -V :: sprawdzenie domyślnych rozszerzeń dla plików includes/headers
ctags -h ' * :: wyłączenie domyślnych rozszerzeń dla plików includes/headers
ctags -h - * :: wyłączenie domyślnych rozszerzeń dla plików includes/headers
ctags -h ' -h default * :: wyłączenie a następnie przywrócenie domyślnych rozszerzeń dla plików includes/headers
ctags -h .a * :: tylko rozszerzenie '.a' wskazuje na pliki includes/headers
ctags -h ..a * :: tylko pliki bez rozszerzenia i z rozszerzenie '.a' są traktowane jak pliki includes/headers
ctags -h +.a * :: dodatkowe rozszerzenie '.a' wskazuje na pliki includes/headers (obok domyślnych)
ctags -h .a --langmap=c:+a * :: tylko rozszerzenie '.a' wskazuje na pliki includes/headers i jest ono kojarzone z językiem C
ctags -h .a --language-force=c * :: tylko rozszerzenie '.a' wskazuje na pliki includes/headers po czym wymuszono język C dla wszystkich plików
:: Błędne przypadki
ctags -h
ctags -H
ctags -h *
ctags -h "" *
ctags -h " " *
ctags -h DEFAULT *
ctags -h deFAUlt *