Как я могу запустить ctags в большой базе кода?


Предполагая, что у меня есть структура каталога кода следующим образом:

/top  
   /second  
       /core  
           a.pl  
           b.pl  
           c.pl  
       /common  
           d.pl  
           e.pl  
       /util  
           f.pl  
           g.pl  
           h.pl    

Где я должен запустить ctags, чтобы я мог перейти к определениям функций через vi?

Например, у меня было:

/dir
   /perl  
      a.pl  

И я запускаю в dir команду ctags -R perl, но в a.pl я не могу перейти к определению функции, которое существует в том же файле.
Если бы я знал ... ctags -R . внутри каталога perl он работал.

Так что я не могу понять закономерность. Должен ли я запустить ctags в core, common,util? Что делать, если моя кодовая база огромна? Действительно ли мне нужно запускать его в каждом каталоге?
2 5

2 ответа:

Обычно вы используете только один файл tags, расположенный в корневом каталоге вашего проекта.

Например, чтобы пометить весь исходный код Vim, расположенный в ~/src/vim-7.3, вы переходите в этот каталог и генерируете файл тегов там.

$ cd ~/src/vim-7.3
$ ctags -R

Вот и все.

Вы можете сделать то же самое изнутри Vim, конечно. Запустите Vim и введите:

:cd ~/src/vim-7.3
:!ctags -R

Проверьте правильность установки 'tags'. По умолчанию используется ./tags,tags, что означает, что Vim будет искать файл tags в текущий каталог.

Обязательно прочитайте :h 'tags' во всей своей полноте. Вы можете поручить Vim искать файлы tags глубоко в дереве каталогов, задав шаблоны, содержащие подстановочные знаки.

Еще одна вещь: для того, чтобы этот подход работал, текущий рабочий каталог Vim должен всегда оставаться в корне. Если у вас есть какая-то опция, например 'autochdir' установить или постоянно переключать каталоги самостоятельно, то tags, очевидно, не будет найден.

Ваш файл tags должен быть сгенерирован в первом общем предке вашего кода (в вашем случае это будет second) с помощью $ ctags -R ..

Я бы предложил вам добавить эту строку в ваш ~/.vimrc, чтобы Vim всегда находил ваш tags файл, независимо от того, где вы находитесь в вашем проекте и независимо от того, какой" текущий каталог":

set tags=./tags;/,tags;/

Он работает так же, как и в ответе @glts с интересным поворотом: из-за части ;/ Vim смотрит вверх и вверх, пока / не найдет файл tags. Предположим, что вы редактируете g.pl, Vim правильно использует ваш файл tags, расположенный в second.

:h tags
:h ctags