Я знаю, что emacs поддерживает завершение кода. Но, честно говоря, я никогда не был хорошим читателем часто задаваемых вопросов, по крайней мере для чего-то, для чего я совершенно новичок. Поэтому мне интересно, что мне нужно скачать и как сделать так, чтобы emacs мог выполнить для меня умное завершение кода на C++ и Java. Или есть какой-нибудь пакет, который выполняет завершение кода для многих основных языков?
4 ответа
Основной способ работы с буфером любого типа в emacs - это динамическое сокращение, используемое при нажатии M-/
(он же alt+/)
Это расширит текст для дублирования других строк, уже существующих в вашем текущем буфере или в других открытых в данный момент буферах.
Для более полного дополнения кода, специфичного для языка C++ или Java (или других), вам нужно взглянуть на пакет шаблонов кода или фрагмент кода. В этом связанном вопросе обсуждаются некоторые вопросы о StackOverflow. В этих обсуждениях обычно упоминается yasnippet - в этом посте в блоге emacs есть демонстрационная демонстрация.
Ответ @ Doug немного устарел, и его внимание сосредоточено на расширении кода с использованием предварительно определенных фрагментов кода.
Я думаю, что вопрос OP о intellisense (например, автозаполнение имени метода класса).
Раньше хиппи расширялся , синтаксический анализатор - это теги emacs. Таким образом, он поддерживает все языки, поддерживаемые ctags (включая C++ и Java). Но результат не идеален, потому что ctags использует только регулярное выражение для анализа кода. Смотрите мой init-hippie-expand.el для деталей. Вы можете начать с проверки значения
hippie-expand-try-functions-list
auto-complete - это современный интерфейс с необычным пользовательским интерфейсом (выпадающее меню, даже в окне консоли). Если вы используете Clang в качестве бэкэнда. Интеллект намного лучше. Чтобы заставить работать clang, вам нужно установить auto-complete-clang, который является плагином auto-complete. Он поддерживает только язык, поддерживаемый Clang (C/C++/Obj-C). Как указывал Сильвен Беннер , вы можете использовать emacs-eclim в качестве серверной части для разбора java, которая фактически вызывает исполняемый файл eclipse. Таким образом, автозаполнение может поддерживать Java. Смотрите мой init-auto-complete.el для деталей.
semantic обеспечивает как пользовательский интерфейс, так и механизм синтаксического анализа. Это медленно. Выпадающий пользовательский интерфейс в порядке, но требует X окна. Результат intellisense лучше, чем ctags. И документация слишком отвратительна для меня. Смотрите init-semantic.el для деталей.
Режим компании аналогичен автозаполнению, но отличается тем, что он упаковывает все в один пакет. Например, разработчикам на 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
).
Короткий ответ: я не знаю ни одного для Emacs, который полезен для Java. Динамическое развертывание не заботится о библиотеках в вашем пути к классам, оно ничего не знает о набираемом коде и может расширяться только до текста, который уже существует в одном из буферов. JDE и emacs-eclim пытаются предоставить эту функциональность, но лично меня это не впечатлило.
Краткий ответ: M-/
Длинный ответ: RTFM :-)