Как добавить company-dabbrev во всплывающее окно завершения компании?

12

Настроить:

Версия графического интерфейса GNU Emacs 25.0.50.1 (x86_64-w64-mingw32) 2015-07-25 на KAEL

Скомпилировано из EmacsW64.

, используя последнюю версию от MELPA

Windows 7 x64 бит.

Ситуация:

Например, я печатаю в буфере foobarsentence.

А затем начните новую строку ниже и, набрав fooba, я ожидал, что меня предложат в foobarsentenceокне завершения всплывающего окна. Но нет foobarsentence.

Из другого ответа я узнал, что для этого я могу использовать company-dabbrev`` M-/. Но я не мог понять, как я мог «подать» предложения из company-dabbrevвсплывающего окна. Я сделал гифку, чтобы прояснить свой вопрос.

введите описание изображения здесь

Как видите, M-/звонки company-dabbrev. Но я хотел бы видеть, что предлагается во всплывающем окне завершения компании. Меня удивило, что это не по умолчанию.

Любое предложение, чтобы «накормить» предложения company-dabbrevвсплывающим окном компании?

ReneFroger
источник
Что это за основной режим?
PythonNut

Ответы:

25

Вот как работает завершение в компании (я немного упрощаю, более подробное описание можно найти в документации к company-backends C-hvcompany-backendsRET.

У вас есть список бэкэндов (двигателей завершения), которые компания должна попытаться предоставить в момент завершения. Компания пробует каждый из этих бэкэндов один за другим, и первый, который возвращает кандидатов, используется для завершения, а остальные бэкэнды игнорируются. Таким образом, по умолчанию используется только один бэкэнд.

В вашем случае (вы, похоже, в emacs-lisp-mode) бэкэнд emacs-lisp возвращает кандидатов на завершение и поэтому company-dabbrevникогда не используется компанией для завершения, и вы никогда не получите foobarsentenceзавершение. Так что вы можете захотеть изменить backends компании так, чтобы это company-dabbrevпроисходило раньше company-elisp(или company-capfв недавнем emacsen). Но я полагаю, что это не то, что вам нужно, поскольку это изменило бы текущую ситуацию, и вы не получите завершения от emacs-lisp backend (в этом случае читайте дальше).

Компания предоставляет способ объединения дополнений из нескольких источников, используя то, что она называет groupedбэкэндами. Обычно члены company-backendsявляются отдельными бэкэндами, но это также может быть список бэкэндов, и в этом случае завершение из бэкэндов объединяется при условии, что они возвращают то же самое prefixили текст, который должен быть завершен (см. Документацию company-backendsдля подробного описания).

Так что, если вы хотите объединить дополнения из company-elisp(на недавних emacsen company-capfиспользуется) и company-dabbrevпросто сделайте это

(add-to-list 'company-backends '(company-capf company-dabbrev))

Кроме того, вы можете объединить различные бэкэнды, используя :withключевое слово

(add-to-list 'company-backends '(company-capf :with company-dabbrev))

Это отличается от примера со списком бэкендов, :withтак как компания будет использовать только бэкэнды :withдля определения prefix(текст, который необходимо заполнить). Это подразумевает, что кандидаты из бэкэндов после :withбудут игнорироваться компанией, независимо от того, вернут ли бэкэнды a prefixили нет, если ни один из бэкэндов до не :withвернул a prefix.

Вы можете установить это локально в буфере emacs-lisp (я предпочитаю делать это)

Икбал Ансари
источник
@wasamasa спасибо за отзыв, отредактировал мой ответ, чтобы упомянуть:with
Iqbal Ansari
Сэр, вы заслуживаете моего голоса. Мне очень понравилось ваше объяснение, и я узнал кое-что о компании. Спасибо за это.
ReneFroger
Рад, что смог помочь
Икбал Ансари