Различия между несколькими плагинами vim tags

У меня есть два вопроса на самом деле.

Во-первых, насколько я знаю, есть два инструмента тегов:

  1. Ctags
  2. GNU Global aka gtags

Мне интересно, какой из них больше подходит, если мои ежедневные работы сосредоточены на Ruby, Rails, JavaScript и Python. А именно, динамические языки. Я немного погуглил, и кажется, что gtags как-то эквивалентно ctags + cscope?

Во-вторых, что касается ctags, есть несколько плагинов vim:

  1. vim-tags: он может генерировать файлы тегов в Vim с помощью команды :TagsGenerate,
  2. tagbar: известный плагин. Кажется, он может генерировать теги на лету.
  3. vim-easytags: похоже на теги vim, но с большим количеством функций.

я задаюсь вопросом

  1. Есть ли совпадение среди этих плагинов?
  2. Если есть совпадения, как их интегрировать или как выбрать, какой использовать?

Я знаю, что нехорошо иметь два вопроса в одном сообщении SO, но я думаю, что эти два вопроса тесно связаны, так как они важны для комбинации Vim+Tags. Надеюсь, что этот вопрос может послужить основой или учебным пособием для людей, которые хотят использовать теги, но не знакомы с ним, как я. (Я не могу найти "современный" учебник для vim+ctags, большинство постов в интернете устарели IMO)

Благодарю.

Обновить:

В принципе, я хочу иметь возможность

  1. Перейти к объявлению определенной функции
  2. Перейти к использованию определенной функции
  3. Сделайте автозаполнение более умным. Я имею в виду, если у меня есть

    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. Да, есть пересечение между #1 и #3. #2 не генерирует и не использует tags файл.
  2. Попробуйте их, прочитайте их документ и решите сами.

Вы даже не сказали нам, как вы хотели использовать эту функцию? Что ты после? tags поколение? Перейти к использованию? Перейти к объявлению? Подобный IDE "проводник классов"? Все это?

редактировать

Позвольте мне обратиться к вашему комментарию и вашему редактированию:

  1. И ctags, и cscope позволяют вам "перейти к объявлению" произвольного символа или (с помощью пользовательских сопоставлений и настроек для cscope) символа под вашим курсором.

  2. Только cscope позволяет "перейти к использованию".

  3. Ctags сам по себе немного глуп, и вы используете высокодинамичные языки, поэтому ctags немного бесполезны для целей завершения. Однако некоторые языки имеют лучшую поддержку, чем другие, поэтому вы можете найти некоторые полезные сторонние плагины, такие как jedi-vim или Tern for Vim.

  4. TagList и TagBar не генерируют tags файл, но они запускаются, запускают ctags и потребляют его вывод. Они просто не записывают это на диск. Так что да, вы можете использовать эти плагины, чтобы "перейти к делу", но они по-прежнему изолированы от встроенной поддержки Ctags в Vim, что может привести к проблемам.

Увидеть :help ctags а также :help cscope чтобы почувствовать, что они могут сделать.

Другие вопросы по тегам