Может ли поддержка emacs перейти к объявлению функции во всем проекте?


12

Есть ли в emacs функция или библиотека, которые могут позволить пользователю перейти к объявлению функции, даже если оно было определено в другом файле?

Если да, то какие языки поддерживаются?

Источником вдохновения для этого вопроса является статья ниже, в которой говорится о некоторых причинах, по которым emacs никогда не сможет конкурировать с IDE.

http://henrikwarne.com/2012/06/17/programmer-productivity-emacs-versus-intellij-idea/


Обычно emacs справляется с этим, полагаясь на внешние скомпилированные программы (например, clang), чтобы быстро понимать исходный код и отвечать на запросы, передаваемые через командную строку. Проверьте irony-clangс этой целью. Вы читали комментарии к статье?
Шон Оллред

1
Функциональность, предоставляемая alchemist.el для elixir или omnisharp для C #, обе из которых зависят от внешних программ для навигации / рефакторинга / ide-ish, довольно похожи на большинство IDE. (по крайней мере, для большинства случаев использования). Emacs не относится к тому же бизнесу, что и IDE, поэтому я не думаю, что разумно говорить, что у него никогда не будет конкурирующего шанса.
Ренан Ранелли

@RenanRanelli IDE точно такой же, за исключением того, что мы должны делать интеграцию вручную, а не кто-то уже сделал это и назвал это «IDE».
Tu Do

В 2019 году, по моему мнению, есть только одно решение. И это связано с завершением компании. Забудьте etags или раздутый, нестабильный CEDET. rtags использует информацию времени компиляции для предоставления LIVE-структуры того, что использует ваш проект. global и др. ужасны - они прославляют "greps", которые делают много догадок и часто ведут вас в неправильное место. github.com/Andersbakken/rtags
RichieHH

Ответы:


14

Вы можете мгновенно перейти к любому определению / ссылке на весь проект размером с исходное дерево ядра Linux (более 36 КБ). Смотрите подробности в моем руководстве по C / C ++ . Для C / C ++ я предлагаю использовать GNU Global, который поддерживает C, C ++, Yacc, Java, PHP4 и ассемблер.

Ключевым моментом является то, что если вы хотите иметь возможности IDE для языка, вы должны установить плагин для этого языка. Вот несколько пакетов для динамических языков, о которых я знаю:

  • Живая веб-разработка: skewer-mode .
  • Javascript: крачка . Но перед этим не забудьте установить js2-mode . Что касается того js2-mode, что делает, см. Описание ; но по сути, js2-modeэто полный анализатор Javascript, который генерирует AST для выполнения надлежащих функций IDE. Если вы установите, skewer-modeчем вы будете иметь js2-modeпо умолчанию, так как skewer-modeзависит от этого.
  • Python: elpy , см. Функции IDE
  • Ruby: robe предоставляет следующие возможности:
  • Перейти к определению метода
  • Перейти к супер или конструктор вызывается в точке
  • Перейти к модулю или классу (при условии, что в нем определен хотя бы один метод)
  • Показать документацию по методу
  • Отображение информации о методе, вызванном в точке с помощью ElDoc
  • Завершение метода и постоянного имени

Вы также можете использовать ctagsдля поддержки большого количества языков, таких как сценарий оболочки или Tcl ...


Любое предложение свита для JavaScript?
user2522280

@BarryG Есть крачка, и j2-modeя отредактировал в своем ответе.
Ту До

2
Я хотел бы отметить, что это anacondaможет быть более конкретным решением для определения прыжков в Python.
PythonNut

@TuDo Вы поместили список возможностей Robe в ESS.
Дмитрий

Для C ++, есть также rtags и ycmd . Я использую ycmd, который также работает, например, с Python, C #, Go и другими языками. Я использую dumb-jump и counsel-rg в качестве запасного варианта или для показа упоминаний или упоминаний о символах.
unhammer

18

Я столкнулся с аналогичной проблемой с Emacs, поэтому я сделал Dumb Jump . Я пробовал многие из решений, упомянутых в принятом ответе, но всегда сталкивался с одной или несколькими из следующих проблем:

  • Решение работало только для одного языка программирования
  • Для решения требуется файл индекса (TAG) или постоянный процесс

Я очень хотел решение, которое «просто работало» и не требовало настройки или настройки. То есть я хотел клонировать случайное репо на Github и перемещаться по нему, как и любой другой из моих собственных проектов.

Прямо сейчас Dumb Jump имеет базовую поддержку для:

  • JavaScript
  • Emacs Lisp
  • питон
  • Идти
  • PHP
  • Рубин
  • Faust
  • р
  • Lua
  • Ржавчина
  • ...и более

Он доступен через выпуски MELPA и GitHub, и PR приветствуются.


4

Основным решением для этого в emacs является использование файлов TAGS, которые создаются такими программами, как etags или gtags. Я сам использую (и рекомендую) обильные ctags и etags-select.el, чтобы помочь вам сузить места назначения, когда символ поиска находится в нескольких местах назначения. Поддерживаемых языков довольно много, см. Руководства для отдельных инструментов. Существует даже поддержка добавления вашего собственного языка, благодаря чему вы можете предоставить регулярное выражение, которое инструктирует ctags, как изолировать интересующие вас теги.


1
Ой! Как я мог забыть о tagfiles? ctags -e -R *из корневого каталога создаст его для вас.
Шон Оллред

Является ли это приемлемым решением, когда ваш проект имеет много зависимостей (например, более свежие проекты javascript для веб-разработчиков)?
Рудольф Олах

Количество зависимостей само по себе не является препятствием. Вы можете иметь один большой файл тегов, который объединяет много разных библиотек; Я делал это в течение многих лет, вызов команды ctags тривиально делает это. Или то, что я сейчас рекомендую, это иметь отдельный файл тегов для каждой зависимости; Emacs достаточно умен, чтобы загрузить несколько файлов тегов. Чтобы облегчить это, найдите etags-table.el, который помогает загружать группы файлов тегов для каждого проекта.
InHarmsWay
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.