2011-02-16 8 views
49

Staram się, aby ustawienia (żywiołowe) ctags na Vimie i mam trudności z jego poprawnym działaniem. Generuję plik ctags w wierszu poleceń: z:Vim: Trudności z ustawianiem ctags. Źródło w podkatalogach nie widzi pliku znaczników w katalogu głównym projektu

cd myproj 
ctags -R 

Spowoduje to umieszczenie pliku tagi w katalogu głównym myproj. Jednak Vim wydaje się czytać tylko z tego pliku tagi, gdy pracuję nad źródłem, które znajduje się w katalogu głównym. Jak przejść do głębszych katalogów, jeśli staram się skakać do znacznika za pomocą <C-]>, otrzymuję:

E433: No tags file 
E426: tag not found: MyClassName 

I zostały zweryfikowane, że MyClassName ma znacznik w pliku tags, to po prostu, że Vim nie Zobacz to. Czy ktoś może wyjaśnić, jak skonfigurować Vima, aby odwoływał się do pliku znaczników roota?

Dzięki.

Odpowiedz

98
set tags=tags;/ 

Spowoduje to sprawdzenie bieżącego folderu dla pliku znaczników i kontynuowanie przechodzenia do jednego katalogu aż do folderu głównego. Dzięki temu możesz znajdować się w dowolnym podfolderze w projekcie i będzie on mógł znaleźć pliki znaczników.

+0

To działa idealnie. Dzięki. – Thomas

+2

Jeśli masz inny plik znaczników, możesz chcieć ustawić znaczniki + = znaczniki;/' –

+25

Jeśli już tu dotrzesz i tak jak ja, intrygują mnie' tagi;/', sufiks';/'kieruje vim do zrobienia wyszukiwanie w górę z katalogu zawierającego znaczniki do katalogu zatrzymania, w tym przypadku /. Jeśli chcesz używać katalogu domowego jako katalogu stop, użyj 'set tags + = tags; ~' lub 'set tags + = tags; $ HOME'. Lub możesz użyć katalogu głównego drzewa projektu jako katalogu stop. (Zobacz ': help file-searching', aby zrozumieć średnik.) Należy również pamiętać, że wyszukiwanie pliku znaczników będzie zależało od autochdir. Używam w moim .vimrc 'set tags =./Tags,./TAGS, tags; ~, TAGS; ~' –

14

Istnieje opcja, aby powiedzieć Vimowi, gdzie szukać pliku z tagami.

używam następującej konfiguracji:

" search first in current directory then file directory for tag file 
set tags=tags,./tags 

Wypis help: ''

Gdy tag nazwa pliku rozpoczyna się od "./", to zastępuje ścieżka bieżącego pliku. Dzięki temu możliwe jest użycie pliku znaczników w katalogu , gdzie znajduje się bieżący plik (bez względu na to, jaki jest katalog bieżący). Pomysł: używania "./" jest taki, że możesz zdefiniować, który plik jest wyszukiwany jako pierwszy: W bieżącym katalogu ("tagi,./Tagi") lub w katalogu bieżącego pliku ("./tags, tagi ").

Na przykład: . Set tags =/tagi, tagi,/home/user/commontags

I zachować mój bieżący katalog roboczy w głównym katalogu projektu, gdzie jest mój plik tags jest generowany.

Użyj :pwd, a następnie :cd myproj (wewnątrz Vima), aby przejść do katalogu zawierającego twój plik znaczników.

Aby uzyskać więcej informacji o ścieżce znaczników, zobacz artykuł :help tags-option.

Występujesz prawdopodobnie w niewłaściwym katalogu lub Twoja opcja tags nie jest prawidłowo ustawiona.

+0

To wyjaśnia wielką ofertę. Dziękuję Ci. Zaakceptowałem tylko drugą odpowiedź jako poprawną, ponieważ w mojej konfiguracji bieżący katalog roboczy zmienia się, dopasowując do każdego edytowanego bufora. Dlatego bardziej praktyczne jest przeskoczenie struktury katalogów, aby znaleźć plik znaczników w katalogu głównym. – Thomas

1

Jeśli wygenerować plik Tagi dla każdego projektu, który może Cię zainteresować ten wzór, zwłaszcza jeśli dzielisz swój .vimrc na różnych maszynach:

let repohome=substitute($REPO_HOME, "\/", "\\\\/", "g")       
let &tags=substitute(expand("%:p:h"), "\\(".repohome."/.\\{-}\/\\).*", "\\1tags", "") 

Będziesz wtedy musiał ustawić zmienną środowiskową $ REPO_HOME w swojej .bashrc do głównego katalogu repo bez miejsca końcowego (np./home/<yourusername>/repos) i automatycznie wyszuka plik znaczników w każdym podkatalogu $ REPO_HOME o głębokości 1, np. /home/<yourusername>/repos/myproj/tags.

1
#!/bin/sh 

FREEZE_NAME=/* Give some version number */ 

mkdir $HOME/ctags/$FREEZE_NAME 

V1=/* Software Path */ 

find $V1 -name "*.h" | xargs /usr/local/bin/ctags -a -f $HOME/ctags/$FREEZE_NAME/h.tags 

find $V1 -name "*.c" | xargs /usr/local/bin/ctags -a -f $HOME/ctags/$FREEZE_NAME/c.tags 

cd $HOME/ctags/$FREEZE_NAME/ 

rm -f all.tags 

cat c.tags h.tags >> all.tags 

sort all.tags > temp.tags 

mv temp.tags all.tags 

rm -f c.tags h.tags 

Umieść powyższy kod w pliku .sh i uruchom ... To na pewno wygeneruje twoje tagi.

Powiązane problemy