Vim автоматически генерирует ctags - PullRequest
52 голосов
/ 01 октября 2008

Прямо сейчас у меня есть .vimrc:

au BufWritePost *.c,*.cpp,*.h !ctags -R

Есть несколько проблем с этим:

  1. Это медленно - восстанавливает теги для файлов, которые не изменились с момента последнего создания тегов.
  2. Я должен нажать кнопку ввода снова после записи файла из-за неизбежного «нажмите Enter или введите команду для продолжения».

Когда вы объединяете эти две проблемы, я заканчиваю тем, что нажимаю дополнительный ввод слишком рано (до того, как ctags -R закончил), затем вижу досадное сообщение об ошибке и вынужден снова нажимать ввод.

Я знаю, что это не так уж важно, но с количеством записей файлов, которые я делаю в данный день, это действительно раздражает. Должен быть лучший способ сделать это!

Ответы [ 12 ]

42 голосов
/ 01 октября 2008

au BufWritePost *.c,*.cpp,*.h silent! !ctags -R &

Недостатком является то, что у вас не будет файла полезных тегов, пока он не завершится. Пока вы работаете в системе * nix, должно быть хорошо делать несколько записей до завершения предыдущих ctags, но вы должны это проверить. В системе Windows он не помещает его в фоновый режим и будет жаловаться, что файл заблокирован до завершения первого ctags (что не должно вызывать проблем в vim, но в результате вы получите слегка устаревший файл тегов ).

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

14 голосов
/ 03 октября 2008

Редактировать : Решение, очень похожее на следующее, было опубликовано как AutoTag vim script . Обратите внимание, что сценарию требуется vim с поддержкой Python , однако.

Мое решение вместо этого использует awk, поэтому оно должно работать на многих других системах.


au FileType {c,cpp} au BufWritePost <buffer> silent ! [ -e tags ] &&
    \ ( awk -F'\t' '$2\!="%:gs/'/'\''/"{print}' tags ; ctags -f- '%:gs/'/'\''/' )
    \ | sort -t$'\t' -k1,1 -o tags.new && mv tags.new tags

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

Там много чего происходит:

  1. Эта автоматическая команда срабатывает, когда обнаружено, что файл является C или C ++, и добавляет в свою очередь локальную буферную автоматическую команду, которая запускается событием BufWritePost.

  2. Он использует заполнитель %, который заменяется именем файла буфера во время выполнения, вместе с модификатором :gs, используемым для кавычек в имени файла (превращая любые встроенные одинарные кавычки в escape-escape -quote кавычка).

  3. Таким образом он запускает команду оболочки, которая проверяет, существует ли файл tags, и в этом случае его содержимое печатается, за исключением строк, которые относятся к только что сохраненному файлу, при этом ctags вызывается для только что сохраненный файл, и затем результат sort редактируется и возвращается на место.

Разработчик Caveat: предполагается, что все находится в одном и том же каталоге и является текущим каталогом локального буфера. Я не задумывался о путанице на пути.

10 голосов
/ 15 января 2012

Я написал easytags.vim , чтобы сделать это: автоматически обновлять и выделять теги. Плагин может быть настроен на обновление только редактируемого файла или всех файлов в каталоге редактируемого файла (рекурсивно). Он может использовать файл глобальных тегов, файлы тегов определенного типа и файлы тегов конкретного проекта.

7 голосов
/ 30 ноября 2010

Я заметил, что это старая тема, однако ... Используйте incron в * nix-подобных средах, поддерживающих inotify. Он всегда будет запускать команды всякий раз, когда файлы в каталоге меняются. то есть.,

/home/me/Code/c/that_program IN_DELETE,IN_CLOSE_WRITE ctags --sort=yes *.c

Вот и все.

3 голосов
/ 01 октября 2008

Возможно, используйте аргумент добавления к ctags, как показано:

http://vim.wikia.com/wiki/Autocmd_to_update_ctags_file

Я действительно не могу ручаться за это, так как я обычно использую понимание источника для просмотра кода, но использую vim в качестве редактора ... пойди разберись.

2 голосов
/ 01 сентября 2011

В OSX эта команда не будет работать из коробки, по крайней мере, не для меня.

au BufWritePost *.c,*.cpp,*.h silent! !ctags -R &

Я нашел сообщение , в котором объясняется, как получить стандартную версию ctags, содержащую опцию -R. Это само по себе не работает для меня. Мне пришлось добавить / usr / local / bin в переменную PATH в .bash_profile, чтобы взять корзину, в которую Homebrew устанавливает программы.

2 голосов
/ 01 октября 2008

Чтобы подавить приглашение «нажать клавишу ввода», используйте : без звука .

2 голосов
/ 01 октября 2008

Как насчет запланированного запуска ctags через crontab? Если дерево вашего проекта достаточно стабильно по своей структуре, это должно быть выполнимо?

1 голос
/ 26 марта 2011

По моему мнению, плагин Indexer лучше.

http://www.vim.org/scripts/script.php?script_id=3221

Это может быть:

1) дополнение для project.tar.gz

2) независимый плагин

  • генерация фоновых тегов (вы не дождались, пока работает ctags)
  • поддерживается несколько проектов
1 голос
/ 10 февраля 2011

Существует плагин vim под названием AutoTag , который действительно хорошо работает.

Если у вас установлен taglist, он также обновит его для вас.

...