Чи може підтримка emacs перейти до оголошення функції в цілому проекті?


12

Чи є у emacs функція або бібліотека, яка може дозволити користувачу перейти до декларації функції, навіть якщо це було визначено в іншому файлі?

Якщо так, то для яких мов існує підтримка?

Натхнення для цього питання походить з нижченаведеної статті, яка розповідає про деякі причини, чому Emacs ніколи не зможе конкурувати з IDE.

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


Спосіб, яким Emacs в основному займається цим, покладається на зовнішні, складені програми (наприклад, кланг) для швидкого розуміння вихідного коду та відповіді на запити, передані командним рядком. Ознайомтеся з irony-clangцією метою. Чи читали ви коментарі до статті?
Шон Аллред

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

@RenanRanelli IDE - це точно так само, за винятком того, що ми повинні робити інтеграцію вручну, замість того, щоб хтось це вже зробив і назвав це "IDE".
Tu Do

В 2019 році є лише одне рішення, яке ви повинні розглянути на мою думку. А це рейтинги з завершенням компанії. Забудьте про етагів або роздутий, нестабільний CEDET. rtags використовує інформацію про час компіляції, щоб забезпечити LIVE структуру того, що використовується у вашому проекті. global et al є жахливими - вони прославлені "грепси", які роблять багато здогадок і часто переводять вас у неправильне місце. github.com/Andersbakken/rtags
RichieHH

Відповіді:


14

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

Ключ полягає в тому, що якщо ви хочете мати особливості IDE мови, ви повинні встановити плагін цієї мови. Ось кілька пакунків для динамічних мов, які я знаю:

  • Веб-розробка в реальному часі : режим перекидання .
  • Javascript: Tern . Але перед цим не забудьте встановити js2-режим . Щодо того, що js2-modeробить, дивіться опис ; але по суті, js2-modeце повний аналізатор Javascript, який генерує AST для належних функцій IDE. Якщо ви встановите, skewer-modeніж у вас буде js2-modeза замовчуванням, оскільки це skewer-modeзалежить від цього.
  • Python: elpy , див. Функції IDE
  • Ruby: robe має такі можливості:
  • Перейти до визначення методу
  • Перейти до супер або конструктор, який викликається в точці
  • Перейти до модуля чи класу (за умови, що визначено принаймні один метод)
  • Документація методу відображення
  • Відобразити інформацію про метод, викликаний у точці, за допомогою ElDoc
  • Метод та постійне заповнення імені

Ви також можете використовувати ctagsдля підтримки безлічі мов, таких як скрипт оболонки або Tcl ...


Будь-яка пропозиція для JavaScript?
користувач2522280

@BarryG Є Терн, і j2-modeя відредагував свою відповідь.
Tu Do

2
Я хотів би зазначити наше, що anacondaможе бути більш конкретним рішенням для стрибків з визначеннями в Python.
PythonNut

@TuDo Ви включили список функцій Robe під ESS.
Дмитро

Для C ++ також є rtags та ycmd . Я використовую ycmd, який також працює, наприклад, з Python, C #, Go та іншими мовами. Я використовую німий стрибок і пораду-rg як резервну або для показу звичаїв або коментарів / згадок документа в символі.
unhammer

20

Я зіткнувся з подібною проблемою з emacs, тому зробив Dumb Jump . Я спробував багато рішень, згаданих у прийнятій відповіді, але я завжди стикався з одним або кількома з наступних питань:

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

Я дуже хотів рішення, яке "просто працювало" і не вимагало налаштування чи налаштування. Тобто, я хотів клонувати випадковий репо на Github і орієнтуватися навколо нього, як і будь-який інший із моїх власних проектів.

Зараз Dumb Jump має основну підтримку:

  • JavaScript
  • Emacs Lisp
  • Пітон
  • Іди
  • PHP
  • Рубін
  • Фауст
  • R
  • Луа
  • Іржа
  • ...і більше

Це доступно через MELPA питань і GitHub і реципієнти більш ніж вітається.


4

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


1
Ой! Як я можу забути про файли тегів? ctags -e -R *з кореневого каталогу встановить його для вас.
Шон Аллред

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

Кількість залежностей сама по собі не є перешкодою. Ви можете мати один великий тег-файл, який об'єднує безліч різних бібліотек; Я робив це протягом багатьох років, це викликає виклик команди ctags тривіально. Або те, що я зараз рекомендую, - це мати окремий файл тегів на залежність; emacs досить розумний для завантаження декількох файлів тегів. Щоб полегшити це, знайдіть etags-table.el, який допомагає завантажувати групи файлів тегів на проект.
InHarmsWay
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.