19

Я знаю, что emacs поддерживает завершение кода. Но, честно говоря, я никогда не был хорошим читателем часто задаваемых вопросов, по крайней мере для чего-то, для чего я совершенно новичок. Поэтому мне интересно, что мне нужно скачать и как сделать так, чтобы emacs мог выполнить для меня умное завершение кода на C++ и Java. Или есть какой-нибудь пакет, который выполняет завершение кода для многих основных языков?

4 ответа4

24

Основной способ работы с буфером любого типа в emacs - это динамическое сокращение, используемое при нажатии M-/ (он же alt+/)

Это расширит текст для дублирования других строк, уже существующих в вашем текущем буфере или в других открытых в данный момент буферах.

Для более полного дополнения кода, специфичного для языка C++ или Java (или других), вам нужно взглянуть на пакет шаблонов кода или фрагмент кода. В этом связанном вопросе обсуждаются некоторые вопросы о StackOverflow. В этих обсуждениях обычно упоминается yasnippet - в этом посте в блоге emacs есть демонстрационная демонстрация.

20

Ответ @ Doug немного устарел, и его внимание сосредоточено на расширении кода с использованием предварительно определенных фрагментов кода.

Я думаю, что вопрос OP о intellisense (например, автозаполнение имени метода класса).

  1. Раньше хиппи расширялся , синтаксический анализатор - это теги emacs. Таким образом, он поддерживает все языки, поддерживаемые ctags (включая C++ и Java). Но результат не идеален, потому что ctags использует только регулярное выражение для анализа кода. Смотрите мой init-hippie-expand.el для деталей. Вы можете начать с проверки значения hippie-expand-try-functions-list

  2. auto-complete - это современный интерфейс с необычным пользовательским интерфейсом (выпадающее меню, даже в окне консоли). Если вы используете Clang в качестве бэкэнда. Интеллект намного лучше. Чтобы заставить работать clang, вам нужно установить auto-complete-clang, который является плагином auto-complete. Он поддерживает только язык, поддерживаемый Clang (C/C++/Obj-C). Как указывал Сильвен Беннер , вы можете использовать emacs-eclim в качестве серверной части для разбора java, которая фактически вызывает исполняемый файл eclipse. Таким образом, автозаполнение может поддерживать Java. Смотрите мой init-auto-complete.el для деталей.

  3. semantic обеспечивает как пользовательский интерфейс, так и механизм синтаксического анализа. Это медленно. Выпадающий пользовательский интерфейс в порядке, но требует X окна. Результат intellisense лучше, чем ctags. И документация слишком отвратительна для меня. Смотрите init-semantic.el для деталей.

  4. Режим компании аналогичен автозаполнению, но отличается тем, что он упаковывает все в один пакет. Например, разработчикам на C++ требуется только установить режим компании (для автозаполнения нужен какой-то сторонний плагин). Другим отличием является UI компания автоматически покажет кандидата. Таким образом, вы нажимаете меньше клавиш в компании. То же самое можно сделать в автозаполнении после настройки.

Подводя итог, автозаполнение, компании наиболее популярны два варианта. Семантика и хиппи-экспанд также приветствуются, но используются реже. Другие слишком тривиальны, чтобы упоминать их, и их особенности уже охвачены большой четверкой. Например, автозаполнение может использовать yasnippet в качестве источника ввода (автозаполнение предоставляет пользовательский интерфейс, но фактические кандидаты генерируются серверной частью yasnippet).

Я предлагаю использовать либо автозаполнение, либо компанию как основной плагин для завершения кода, а либо семантическое, либо расширенное расширение как дополнительный плагин.

Я использую режим компании и хиппи, потому что,

  • Теперь (2017 год) фирменный режим поддерживается более активно, чем автозаполнение, и содержит больше сторонних плагинов (например, латексный плагин)

  • hippie-expand не очень активно, но не занимает клавишу TAB которую использует режим компании /semantic /auto-complete

Если вы используете фирменный режим для C++/Java, вы можете захотеть изменить company-backends .

Еще несколько советов о режиме компании,

Вам может понадобиться настроить значение company-backends . Например, предположим, что его значение равно (company-eclim company-semantic company-clang (company-dabbrev-code company-gtags company-etags company-keywords)) . Тогда, если company-eclim может получить ненулевых кандидатов, company думает, что вы пишете Java, поэтому она НЕ будет запускать бэкэнды после company-eclim .

Теперь давайте посмотрим (company-dabbrev-code company-gtags company-etags company-keywords) . Все эти четыре бэкэнда будут использоваться вместе. Например, даже после того, как company-dabbrev-code успешно выбрал ненулевых кандидатов, остальные три бэкэнда все еще выполняются.

В реальном мире часто необходимо изменить порядок бэкэндов или добавить новый бэкэнд (например, company-rtags ).

2

Короткий ответ: я не знаю ни одного для Emacs, который полезен для Java. Динамическое развертывание не заботится о библиотеках в вашем пути к классам, оно ничего не знает о набираемом коде и может расширяться только до текста, который уже существует в одном из буферов. JDE и emacs-eclim пытаются предоставить эту функциональность, но лично меня это не впечатлило.

0

Краткий ответ: M-/

Длинный ответ: RTFM :-)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .