Як я можу отримати нечітке заповнення коду


27

При використанні ReSharper у Visual Studio символи можуть бути автоматично завершені, використовуючи нечітке зіставлення замість відповідності префікса. Наприклад, якщо я шукаю функцію з назвою, яку DoSomethingAmazingя міг би написати, DoSoAmі я спробую розширити свій запит, щоб відповідати всім символам, що містять Do, Soа Amдесь їх імені.

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

Інший приклад можна побачити у плагіні YouCompleteMe для Vim: GIF - зображення, що показує більше прикладів нечіткої відповідності у дії in vim

Автоматичне заповнення та режим компанії, схоже, мають збіг префіксів, але я не можу знайти спосіб увімкнути нечітке зіставлення.

В ідеалі рішення було б мовним агностиком і застосовуватиметься до будь-якого пакета завершення символів, який я використовую, але я також зацікавлений у конкретних мовних рішеннях. Я переглянув Helm, але не знайшов способу застосувати його для завершення коду.

Я розглядав альтернативи, такі як прив'язка клавіш для активації завершення символу за допомогою буфера Helm, але сподіваюся, що є спосіб зробити це за допомогою завершення в стилі спливаючого вікна.

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


Відповіді:


19

Вбудована функція завершення Emacs пропонує аналогічну нечітку відповідність (за замовчуванням вона використовується для "do-so-am", а не для "DoSoAm"), а останні версії компанії-режиму IIUC використовують це принаймні в деяких випадках.

Наприклад , якщо ви відкриваєте Elisp буфера з допомогою Emacs-24.4 і остання компанія-режим, якщо ви наберете (wi-syкомпанії з'явиться показ меню завершення window-system, window-system-for-displayі with-syntax-table.


2
З Emacs 24.4 company-modeопорами completion-styles, цей пост передбачає можливу установку для спробувати.
wasamasa

Після установки 24.4 я виявив, що саме це я шукав. На жаль, схоже, що мова є специфічною для мови, і вона потребує змін у програмі компанії, щоб вона працювала на інших мовах. Однак з відповідей це найближче, що я знайшов, і, сподіваюся, що більше часу воно застосуватиме до більшої кількості мов. Спасибі!
Джейк Вудс

company-ycmd- ще один бекенд, який підтримує нечітке завершення.
Дмитро

9

З company-mode, ви можете використовувати C-sдля пошуку доступних кандидатів, які відображаються. Пошуковий запит відображається в моделі (я не дуже легко помітити, я знаю. Я подав питання тут ).

Якщо ви хочете використовувати Helm для завершення, подумайте про використання Helm -company або ac-helm . Не пробували ac-helm, але з helm-company, ви можете безпосередньо прив'язати його до клавіші, щоб замінити стандартний інтерфейс company-complete.


Це було близько до того, що я шукав. Я сподівався на завершення, не вимагаючи натискання клавіші, але я виявив, що використання його в поєднанні з збігом префіксів є підходящою альтернативою. Спасибі!
Джейк Вудс

Якщо ви користуєтесь company-modeінтерфейсом, ви можете натиснути, C-sщоб шукати кандидата зі списку доступних вам кандидатів company.
Ту До

Так, я розумію, що і як я вже говорив у коментарі, що є близьким до того, що я шукав. Ідеальне рішення (для мене) не вимагатиме Cs і шукатиме кандидатів, вбудованих у спливаюче вікно під час введення тексту. Але підхід Cs, безумовно, цікавий, і я маю намір інтегрувати його у свій робочий процес.
Джейк Вудс

Використовуючи компанію, я вважаю, що C-M-sце набагато краще, ніж C-s. За допомогою мета вона буде фільтрувати кандидатів, а не просто шукати.
няня

@nanny чудово це знати.
Ту

5

Як було сказано в коментарі раніше, ycmdпідтримує нечітке узгодження. Ви можете використовувати його через company-ycmd. Налаштований належним чином, ви можете отримати повне мовне завершення, а також просте завершення на основі ідентифікаторів у досить легкому досвіді.


непогано було б показати, що тут "правильно" означає.
Джейсон Ху

2

Є кілька пакетів, які пропонують нечітке завершення того чи іншого виду. Я уявляю, що робить Гельм, наприклад (оскільки ви це згадуєте).

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

Завершення бурульок (отже, нечітке завершення, якщо ви вибрали це) застосовується майже всюди, але не існує цілого ряду функцій завершення Icicles - специфічного коду . Ця сторінка документа Icicles говорить про таке завершення буферного тексту.


З Icicles , використовуючи приклад Стефана про завершення (wi-syв режимі Emacs Lisp:

  1. З завершенням Icicles (що забезпечує Emacs, поважаючи ) ви отримуєте ті самі символи, про які згадує Стефан.vanillacompletion-styles

  2. З нечітким символом завершення Icicles Swank (з бібліотеки el-swank-fuzzy.el) як поточним методом завершення TAB, ви отримуєте таких кандидатів на завершення:

    віконна система                
    з-синтаксисом-таблицею
    віконна система для відображення
    віджет-кодування-система-дія
    віджет-символ-підказка-внутрішній
    віджет-кодування-система-підказка-значення
    з-swfy-структура
    віджет-вказати-doc
    з-swfy-timedout
    віджет-вказати-поле
    віджет-вказати-активний
    віджет-вказати кнопку
    віджет-вказати-вставити
    віджет-вказати-зразок
    віджет-уточнення-секрет
    віджет-вказати-неактивний
    вікно-безпечно-стискається-p
    віджети-види-копія
    змінити розмір вікна-застосувати
    window - змінити розмір-root-window-вертикально
    вікно-дисплей-стіл
    вікно - буфер дисплея
    вікно - змінити розмір-застосувати-p
    вікно-зміна розміру-застосування-загальний
    віджет-дисплей-Завершення
    повторне відображення вікна-кінець-тригер
    з-відображається буфер-вікно
    віджет-видимість-значення-створення
    віджет-emacs-library-link-action
    редагувати віджет-список-запис-запис-створення
    віджет-emacs-коментар-посилання-дія

Перші 3 кандидати, знову ж таки, ті, про які згадує Стефан.

  1. З простим заповненням нечіткої відповідності (бібліотека fuzzy-match.el) єдиний кандидат with-syntax-table.

  2. Коли Icicles розсіює нечітке завершення , ви отримуєте всіх кандидатів, які пропонує Swank нечітке завершення, а також наступне:

    ange-ftp-чекати-не зайнятий
    введено в дір-з-посиланнями
    ediff-select-window-setup-function-автоматично
    широкомобільний дисплей
    широкоекранний дисплей
    ediff-window-display-p
    ediff-window-ok-for-display
    ediff-with-syntax-table
    find-new-buffer-file-code-system
    gnus-frame-or-window-display-name
    help-window-display-message
    бурулька-вибір-вікно-для-буфера-дисплея
    система повернення-буфер-з-кодуванням
    set-w32-system-кодування-система
    set-window-display-table
    встановити вікно-повторно відтворити-закінчити тригер
    shell-write-history-on-exit
    розділене вікно-спритно
    дерево-віджет - пошук-підкаталог
    w32-find-file-not-found-set-buffer-file-code-system
    w32-ініціалізація-window-система
  1. З нечітким завершенням підрядок Icicles Levenshtein (1) (відстань Левенштейна 1) ви отримуєте лише ці завершення:
    help-follow-символ
    синтаксис повідомлення-перевірки-новини
    w32-ініціалізувати-window-system window-system
    віконна система для відображення
  1. При відстані Левенштейна 2 замість 1 є понад 300 кандидатів на завершення.

  2. З суворим завершенням Левенштейна (1 або 2) немає кандидатів. Так само для Icicles Яро-Вінклер нечітке завершення .


1
Я погоджуюся, що існує певне перекриття API для нечіткого завершення, але для завершення коду, як правило, необхідний компільований режим або перевірка часу виконання. Як ви заявляєте про себе, Icicles надає мало можливостей для заповнення коду, тому це не здається актуальним для розглянутого питання.
дегтізовано

@dgtized: Ну, я не згоден. Ви пробували completion.el? (Так само dabbrevі hippie-expand- всі 3 включені до GNU Emacs.) Ці речі дуже корисні при заповненні коду, хоча, як ви підказуєте, вони не мають знань, що стосуються коду. Ви можете бути здивовані, наскільки вони можуть бути корисними (з нечітким узгодженням або без). І як вони, будь-яке завершення, що стосується коду, яке використовує мінібуфер для завершення, коли декілька кандидатів автоматично отримують вигоду від нечіткого завершення Icicles .
Дрю

2

якщо ви використовуєте ivy, в останніх оновленнях ivyпідтримується функція завершення в точці в накладанні. Плющ підтримує нечітке узгодження за допомогою flx. Ознайомтесь із цим відео про те, як воно працює :)

Все, що вам потрібно зробити, - це натиснути прив’язку клавіш, для complete-symbolякої за замовчуванням поширюється C-M-iі накладка з’явиться, і ви використовуєте нечітке відповідність, щоб отримати кандидата на завершення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.