Vim: Сложно настроить ctags. Источник в подкаталогах не видит файл тегов в корне проекта

Сегодня я пытаюсь настроить (буйные) ctags в Vim, и мне трудно заставить его работать должным образом. Я создаю свой файл ctags в командной строке с помощью:

cd myproj
ctags -R

Это помещает файл тегов в корень myproj. Однако кажется, что Vim читает этот файл тегов только тогда, когда я работаю с исходным кодом, который находится в корневом каталоге. Когда я перехожу к более глубоким каталогам, если я пытаюсь перейти к тегу, используя <C-]>, я получаю:

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

Я проверил, что у MyClassName есть тег в файле тегов, просто Vim его не видит. Может кто-нибудь объяснить, как настроить Vim для ссылки на файл корневых тегов?

Спасибо.


person Thomas    schedule 16.02.2011    source источник


Ответы (5)


добавить это в .vimrc файл set tags=tags;/

Это проверит текущую папку на наличие файла тегов и продолжит переход на один каталог вверх до корневой папки.

Таким образом, вы можете находиться в любой подпапке вашего проекта, и он сможет найти файлы тегов.

person Amjith    schedule 16.02.2011
comment
Если у вас есть другой файл тегов, вы можете set tags+=tags;/ - person Henry Hu; 07.11.2012
comment
Если вы попали сюда и, как и я, озадачены tags;/, суффикс ;/ направляет vim на поиск вверх от каталога, содержащего теги, до каталога остановки, в данном случае /. Если вы хотите использовать свой домашний каталог в качестве стоп-каталога, используйте set tags+=tags;~ или set tags+=tags;$HOME. Или вы можете использовать верхний каталог вашего дерева проектов в качестве каталога остановки. (См. :help file-searching, чтобы понять, что такое точка с запятой.) Также обратите внимание, что на поиск файла тегов влияет autochdir. Я использую в своем .vimrc set tags=./tags,./TAGS,tags;~,TAGS;~ - person Andrej Panjkov; 18.12.2012
comment
?? У меня был файл тегов, который игнорировался в том же каталоге, и мне нужно было использовать set tags=./tags;/. - person xtian; 07.04.2015
comment
@Amjith Мы продолжаем изменять файлы, поэтому ctags также нуждается в обновлении. Можем ли мы это автоматизировать? - person kamal; 01.06.2016
comment
У меня система с довольно старым Vim: 7.4. set tags=tags;/ работает нормально... но я не могу найти ссылку на этот механизм в документации :help. :help tags-option ничего не имеет. Поиск help.txt и tagsrch.txt файлов справки для ;/ также ничего не дает. - person Kaz; 21.01.2020
comment
Я также не могу найти ;/ в vimdoc.sourceforge.net/vimum.html. - person Kaz; 21.01.2020
comment
Просто примечание: убедитесь, что set wildignore? не содержит шаблонов из пути вашего проекта. Похоже, я создал временное рабочее дерево в папке ./tmp/my_branch, и у меня есть set wildignore=*/tmp/*, поэтому теги файлов игнорировались. - person maslovw; 30.03.2020

Существует возможность указать Vim, где искать файл тега.

Я использую следующую конфигурацию:

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

Выдержка из справки:

Когда имя файла тега начинается с «./», «.» заменяется путем к текущему файлу. Это позволяет использовать файл тегов в каталоге, где находится текущий файл (независимо от текущего каталога). Идея использования "./" заключается в том, что вы можете определить, какой файл тегов будет искаться первым: в текущем каталоге ("tags,./tags") или в каталоге текущего файла ("./tags,tags"). .

Например: :set tags=./tags,tags,/home/user/commontags

И я храню свой текущий рабочий каталог в верхнем каталоге проекта, где создается мой tagsfile.

Используйте :pwd, а затем :cd myproj (внутри Vim), чтобы перейти в каталог, содержащий файл тегов.

См. :help tags-option для получения дополнительной информации о пути тегов.

Ваша проблема, вероятно, в том, что вы либо находитесь в неправильном каталоге, либо ваша опция tags не установлена ​​​​должным образом.

person Xavier T.    schedule 16.02.2011
comment
Это многое объясняет. Спасибо. Я принял другой ответ как правильный только потому, что в моей настройке текущий рабочий каталог изменяется, чтобы соответствовать каждому редактируемому мной буферу. Так что практичнее перейти вверх по структуре каталогов, чтобы найти файл тегов в корне. - person Thomas; 16.02.2011

#!/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 

Поместите приведенный выше код в файл .sh и запустите... Это точно сгенерирует ваши теги.

person Devi Piriya Kannan    schedule 25.04.2016

Если вы создаете файл тегов для каждого проекта, вам может понравиться этот шаблон, особенно если вы делитесь своим .vimrc на разных машинах:

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

Затем вам нужно будет установить переменную среды $REPO_HOME в вашем .bashrc на ваш основной каталог репо без завершающего пробела (например, /home/<yourusername>/repos), и он будет автоматически искать файл тегов в каждом подкаталоге $REPO_HOME с глубина 1, например /home/<yourusername>/repos/myproj/tags.

person 3cheesewheel    schedule 16.09.2013

Создайте файл .sh с приведенным ниже кодом. И запустите файл .sh, где вы хотите теги. Это точно сработает.

#!/bin/sh`enter code here`
filelist=`mktemp`
find . -name \*.h >> ${filelist}
find . -name \*.c >> ${filelist}
find . -name \*.cc >> ${filelist}
find . -name \*.cpp >> ${filelist}
find . -name \*.hpp >> ${filelist}
if [ "$SDKTARGETSYSROOT" != "" ]; then
find $SDKTARGETSYSROOT/usr/include -name \*.h >> ${filelist}
fi
cat ${filelist} | ctags -L -
person Ramanand Yadav    schedule 01.10.2020
comment
Это здорово, вы, ребята, можете попробовать - person Ramanand Yadav; 01.10.2020