Создание файла тегов emacs для проекта Ruby on Rails

Я создаю файл тегов для emacs для моего проекта Ruby on Rails со следующей командой:

ctags -f TAGS --extra=-f --languages=-javascript --exclude=.git --exclude=log -e -R . $(rvm gemdir)/gems/

Когда я пытаюсь найти теги (используя M-.), некоторые теги работают нормально, но с большим количеством других тегов я получаю такие ошибки, как:

tag-find-file-of-tag-noselect: File /Users/simao/Documents/sp/ofe/° ¡ not found

etags-goto-tag-location: Rerun etags: `^class Tools::FilteringSteps' not found in /Users/simao/Documents/sp/ofe/lib/geo_db.rb

Как вы создаете теги для своих проектов RoR с emacs? Вы когда-нибудь видели эту проблему раньше?

Это вывод ctags --version

Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert
Compiled: Mar  9 2012, 15:47:35
Addresses: <[email protected]>, http://ctags.sourceforge.net
Optional compiled features: +wildcards, +regex

Моя версия emacs:

GNU Emacs 24.0.95.1 (x86_64-apple-darwin, NS apple-appkit-1038.36) of 2012-04-02

Ответы

Ответ 1

Да, да, да.; -)

Почему вы заботитесь о не использовании ctags в первую очередь? Ctags - отличный проект, и он поддерживает многие (например, 50) языков. Но поддержка Ruby очень слаба, парсер не в хорошем состоянии, и он не изменился через 4 года.

  • Ctags не имеет отношения к: модуль A:: B
  • Ctags не тегирует (по крайней мере, некоторые из) методы оператора, такие как ==
  • Ctags не поддерживает квалифицированные теги, -type = +
  • Ctags не выводит теги для констант или атрибутов.

К сожалению, все остальные (я нашел 2) генераторы Ruby ctags либо устарели (без поддержки Ruby 1.9+), либо очень медленны. Но есть решение! Он называется ripper-tags. https://github.com/tmm1/ripper-tags

gem install ripper-tags
cd your_project/
ripper-tags -R # for vim
ripper-tags -R -f TAGS # for emacs

Этот проект использует встроенный API-анализатор Ruby под названием Ripper. Он работает быстро и работает так, как ожидалось. Это почти так же быстро, как ctags, но дает наиболее точные результаты. Предупреждение: оно не поддерживает Ruby 1.8.

Если вам нравятся риппер-теги, и вы хотите, чтобы все метки генерировались автоматически при установке gem, вы можете проверить мои теги gem-ripper, которые это делают. К сожалению, он не поддерживает Emacs на данный момент (исправленный патч - довольно легко сделать). Дополнительная информация: https://github.com/lzap/gem-ripper-tags

Ответ 2

это 2016 здесь, и etags, похоже, хорошо работают с рубином в этот момент. Вероятно, тоже.

Вот грабельная задача, которую я написал для управления тегами. Сохраните его как lib/tasks/etags.rake, а затем запустите rake etags create периодически. Замените etags ctags, если вы используете vi.

def project_root
  gemfile_path = ENV['BUNDLE_GEMFILE']
  if !gemfile_path || gemfile_path.empty?
    then fail "can't find the root of your project from $BUNDLE_GEMFILE"
    else File.dirname gemfile_path
  end
end

namespace :etags do
  desc "generate tags for emacs code hypertext linking aka metadot"
  task create: :environment do
    system "find #{project_root}/app/ -iname \\*.rb -print0 | xargs -0 etags"
  end

  desc "remove tags for emacs code hypertext linking aka metadot"
  task clean: :environment do
    system "rm #{project_root}/TAGS"
  end
end

Ответ 3

Кажется, это может быть актуально:

В частности, обратите внимание на комментарий во второй ссылке, предполагая, что эта ошибка существует с Emacs 22.

Предполагая, что вы не используете Emacs 24, похоже, что вы должны применить этот патч к etags.el(и байт-перекомпилировать).

(Если вы используете версию Emacs 24, содержащую эту ошибку, вы, очевидно, должны обновиться до последней версии предварительного тестирования.)

Ответ 4

Я использую rtags. Для меня он работал лучше с Ruby, чем ctags.

Ответ 5

Если вы используете Git, я рекомендую вам следовать этой настройке из Effortless CTags для автоматической сборки ваших файлов тегов при выполнении операций git:

http://tbaggery.com/2011/08/08/effortless-ctags-with-git.html

Даже если вы не используете Git, вы можете попробовать его команду для создания CTags:

ctags --tag-relative -Rf.git/tags.$$ --exclude=.git --languages=-javascript,sql

Кроме того, я рекомендую вам установить псевдоним для установки пакета, чтобы указать путь, чтобы ваши драгоценные камни попадали в подкаталог вашего проекта, например:

alias bi='bundle install --path vendor'

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