Как получить завершение кода в Emacs?


20

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

Ответы:


27

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

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

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


+1. Вы также можете complete.elпопробовать стандартную библиотеку . Он очень старый и малоизвестный, но тот тип завершения в буфере, который он предоставляет, может быть полезен. M-x find-library complete, затем прочитайте Комментарий в файле.
Дрю

21

Ответ @ 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например).


Какой самый лучший пакет автозаполнения в Emacs 24 для латекса?
докторская степень

@doctorate Я думаю, вам нужно использовать автозаполнение и его источник emacswiki.org/emacs/AutoCompleteSources , но я программист, а не пользователь латекса, так что вам лучше перепроверить в сообществе Google и Emacs, там много академических парней ,
Чен бин

Обратите внимание, что фирменный режим также поддерживает латекс. Поэтому я предлагаю компанию вместо автозаполнения
чен бен

2

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


0

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

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


6
+1, боже, я надеюсь, что следующий вопрос, который я вижу, это «нужна помощь с помощью команды
RTFM

@rownage: о, вот это `` info-emacs-manual'` ( C-h r)
SamB

1
Как насчет C-h k M-/?
Даг Харрис
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.