Создание файла тегов 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 этот каталог). Это позволит вам также перейти непосредственно к источнику каждого из ваших драгоценных камней и не допустить, чтобы ваш файл тегов раздувался всеми драгоценными камнями в вашей системе.