Як отримати заповнення коду в emacs?


20

Я знаю, що emacs підтримує завершення коду. Але якщо чесно, я ніколи не був хорошим читачем питань, щонайменше, щодо чогось, що я абсолютно новий. Тож мені цікаво, що мені потрібно завантажити та як зробити так, щоб Emacs міг виконати для мене смарт-код у C ++ та Java. Або є якийсь пакет, який виконує завершення коду для багатьох основних мов?

Відповіді:


27

Основний спосіб, який буде працювати над будь-яким буфером у emacs, - це динамічна абревіатура, що використовується натисканням M-/(aka alt+ /)

Це розширить текст до дублювання інших рядків, які вже є у вашому поточному буфері або в інших відкритих буферах.

Для більш широкого заповнення коду, що відповідає мові C ++ або Java (або іншим), вам потрібно переглянути пакет шаблонів коду чи фрагмент. У цьому пов'язаному питанні на StackOverflow є кілька обговорених питань . Одне, що часто згадується в цих дискусіях, - це ясніппет - у цьому дописі в блозі emacs є демонстрація скріншота .


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

21

@ Відповідь Дуга трохи застаріла, і він зосереджується на розширенні коду за допомогою попередньо визначених фрагментів.

Я думаю, що питання ОП стосується інтеліссенсу (наприклад, автозавершення назви методу класу).

  1. хіпі розширення раніше користувалося популярністю, синтаксичний аналізатор - теги emacs . Таким чином, він підтримує всі мови, що підтримують ctags (включаючи C ++ , Java). Але результат не є ідеальним, оскільки ctags використовує регулярне вираження для аналізу коду. Докладніше див. Мій init-hippie-expand.el . Ви можете почати, перевіривши значенняhippie-expand-try-functions-list

  2. Автодоповнення - це сучасний із фантазійним інтерфейсом (спадне меню навіть у вікні консолі). Якщо ви використовуєте clang як бекенд. Інтелісенс набагато кращий. Для того, щоб кланг працював, вам потрібно встановити auto-complete-clang, який є плагіном автоматичного завершення. Він підтримує лише підтримку мовного кланг (C / C ++ / Obj-C). Як зазначив Сильвен Беннер , ви можете використовувати emacs-eclim як задній кінець розбору Java, який насправді викликає виконуваний час затемнення. Тож автоматичне завершення може підтримувати Java. Докладні відомості див. У моєму init-auto-complete.el .

  3. семантичний забезпечує як інтерфейс користувача, так і механізм розбору заднього кінця. Це повільно. Користувацький інтерфейс, що випадає, добре, але вимагає вікна X. Результат intellisense кращий, ніж ctags. І документування для мене занадто вигадливе. Докладніше див. У init-semantic.el .

  4. Режим компанії схожий на автоматичне завершення, різниця полягає в тому, що він пакує все в один пакет. Наприклад, розробникам C ++ потрібно лише встановити режим компанії (для автоматичного завершення потрібен плагін сторонніх розробників). Інша відмінність є UI компанія покаже кандидат автоматично . Отже, ви менше натискаєте клавіші в компанії. Можна виконати те ж саме в автоматичному завершенні після налаштування.

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

Я пропоную використовувати або автозаповнення або компанії в якості основного автозавершения коду плагіна і або семантичного або хіпі розширитися додаткового плагіна .

Я використовую режим компанії та хіпі-розширення, тому що,

  • Зараз (рік 2017) компанія-режим підтримується активніше, ніж автозаповнення та має більше сторонніх плагінів (наприклад, латексний плагін)

  • хіпі-розширення не дуже активне, але воно не займає TABключ, який використовує компанія-режим / семантичний / автозавершений

Якщо ви використовуєте режим компанії для 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 для латексу?
докторантура

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

Зверніть увагу, що в режимі компанії також підтримується латекс. Тому я пропоную компанію замість автоматичного заповнення
chen bin

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-/?
Doug Harris
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.