Различия между несколькими плагинами vim tags
У меня есть два вопроса на самом деле.
Во-первых, насколько я знаю, есть два инструмента тегов:
- Ctags
- GNU Global aka gtags
Мне интересно, какой из них больше подходит, если мои ежедневные работы сосредоточены на Ruby, Rails, JavaScript и Python. А именно, динамические языки. Я немного погуглил, и кажется, что gtags как-то эквивалентно ctags + cscope?
Во-вторых, что касается ctags, есть несколько плагинов vim:
- vim-tags: он может генерировать файлы тегов в Vim с помощью команды
:TagsGenerate
, - tagbar: известный плагин. Кажется, он может генерировать теги на лету.
- vim-easytags: похоже на теги vim, но с большим количеством функций.
я задаюсь вопросом
- Есть ли совпадение среди этих плагинов?
- Если есть совпадения, как их интегрировать или как выбрать, какой использовать?
Я знаю, что нехорошо иметь два вопроса в одном сообщении SO, но я думаю, что эти два вопроса тесно связаны, так как они важны для комбинации Vim+Tags. Надеюсь, что этот вопрос может послужить основой или учебным пособием для людей, которые хотят использовать теги, но не знакомы с ним, как я. (Я не могу найти "современный" учебник для vim+ctags, большинство постов в интернете устарели IMO)
Благодарю.
Обновить:
В принципе, я хочу иметь возможность
- Перейти к объявлению определенной функции
- Перейти к использованию определенной функции
Сделайте автозаполнение более умным. Я имею в виду, если у меня есть
class Obj def m1 puts "hello" end end
тогда хочу автозаполнение показать
m1
когда я печатаюobj = Obj.new; obj.
, Насколько я знаю, YouCompleteMe может использовать файл ctags, но я не могу его настроить, даже следуя инструкции.
Честно говоря, я действительно не знаю, что могут или могут предложить ctags. Поэтому, пожалуйста, не стесняйтесь предлагать больше полезных функций. Спасибо!
1 ответ
Вы можете забыть GNU GLOBAL прямо сейчас, потому что - в прошлый раз, когда я проверял - он вообще не поддерживал JavaScript. Я не знаю насчет Ruby и Python, но вам не должно быть слишком сложно это проверить.
Ctags работает с JavaScript (и другими), но ему не нравится "современный" способ написания JavaScript (встроенные обратные вызовы, недобросовестные литеральные объекты, самовызывающиеся функции…). Вы можете немного помочь, добавив следующие строки в ~/.ctags
файл:
--langmap=javascript:.js
--regex-javascript=/([A-Za-z0-9._$()]+)[ \t]*[:=][ \t]*function[ \t]*\(/\1/F,function,functions/
--regex-javascript=/function[ \t]*([A-Za-z0-9._$()]+)[ \t]*\(/\1/F,function,functions/
--regex-javascript=/([A-Za-z0-9._$]+)[ \t]*=[ \t]*\{/\1/o,object,objects/
--regex-javascript=/^[ \t]*([A-Za-z0-9._$]+)[ \t]*[:][ \t]*[^\{]/\1/p,property,properties/
--regex-javascript=/^[ \t]+var[ \t]*([A-Za-z0-9._$]+)[ \t]*=[ \t]*[\d"'\[]/\1/v,variable,variables/
Это работает для меня, но мой JavaScript, по общему признанию, немного "старая школа". Обратите внимание, что ctags ограничен "определениями / объявлениями".
Существуют также языковые варианты ctags, которые обычно дают более ощутимые результаты, такие как jsctags (JavaScript) или ripper-tags (Ruby).
Cscope, с другой стороны, делает "использование" и работает для всех ваших языков. Его настройка немного сложнее, чем настройка ctags, и его использование также немного сложнее, но это вполне логично, учитывая его особенности.
Одна "проблема", которую вы можете иметь с cscope, заключается в том, что вокруг нее написано не так много плагинов по сравнению с ctags. Это ограничение стоит рассмотреть.
Что касается плагинов, которые вы перечислили...
- Да, есть пересечение между #1 и #3. #2 не генерирует и не использует
tags
файл. - Попробуйте их, прочитайте их документ и решите сами.
Вы даже не сказали нам, как вы хотели использовать эту функцию? Что ты после? tags
поколение? Перейти к использованию? Перейти к объявлению? Подобный IDE "проводник классов"? Все это?
редактировать
Позвольте мне обратиться к вашему комментарию и вашему редактированию:
И ctags, и cscope позволяют вам "перейти к объявлению" произвольного символа или (с помощью пользовательских сопоставлений и настроек для cscope) символа под вашим курсором.
Только cscope позволяет "перейти к использованию".
Ctags сам по себе немного глуп, и вы используете высокодинамичные языки, поэтому ctags немного бесполезны для целей завершения. Однако некоторые языки имеют лучшую поддержку, чем другие, поэтому вы можете найти некоторые полезные сторонние плагины, такие как jedi-vim или Tern for Vim.
TagList и TagBar не генерируют
tags
файл, но они запускаются, запускают ctags и потребляют его вывод. Они просто не записывают это на диск. Так что да, вы можете использовать эти плагины, чтобы "перейти к делу", но они по-прежнему изолированы от встроенной поддержки Ctags в Vim, что может привести к проблемам.
Увидеть :help ctags
а также :help cscope
чтобы почувствовать, что они могут сделать.