Как я могу получить нечеткое завершение кода

27

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

Другой пример можно найти в следующем GIF. Вы можете увидеть несколько расширений, где строки без префиксов раскрываются до правильного символа. (Не обращайте внимания на расширение фрагмента, так как в этом вопросе меня интересует только нечеткое сопоставление).GIF показывает несколько примеров нечеткого соответствия в действии

Другой пример можно увидеть в плагине YouCompleteMe для Vim: GIF показывает больше примеров нечеткого соответствия в действии в VIM

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

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

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

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

Джейк Вудс
источник
github.com/PythonNut/helm-flx
Питер Бечич

Ответы:

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, этот пост предполагает возможную установку для попробовать.
Васамаса
После установки 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представленных вам.
Ту До
Да, я понимаю это, и, как я сказал в приведенном выше комментарии, это близко к тому, что я искал. Идеальное решение (для меня) не требует C и будет искать кандидатов в строке во всплывающем окне, когда я печатаю. Но подход Cs, безусловно, интересен, и я намерен интегрировать его в свой рабочий процесс.
Джейк Вудс
Используя компанию, я считаю, что C-M-sэто намного лучше, чем C-s. С мета, он будет фильтровать кандидатов, а не просто поиск.
няня
@nanny здорово знать это.
Ту До
5

Как уже упоминалось в комментарии ранее, ycmdподдерживается нечеткое сопоставление. Вы можете использовать его через company-ycmd. Правильно настроенный, вы можете получить завершение для конкретного языка, а также простое завершение на основе идентификатора в довольно плавном взаимодействии.

abingham
источник
было бы неплохо показать, что значит «правильно» здесь.
Джейсон Ху
2

Есть несколько пакетов, которые предлагают нечеткое завершение того или иного вида. Я полагаю, что Хелм, например, (поскольку вы упоминаете об этом).

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

Завершение Icicles (следовательно, нечеткое завершение, если вы выберете это) применяется практически везде, но не так много специфичных для Icicles возможностей дополнения кода . На этой странице документа « Сосульки» говорится о таком заполнении буферного текста.


С помощью Icicles , используя пример завершения работы Стефана (wi-syв режиме Emacs Lisp:

  1. С завершением Сосульки (что обеспечивает Emacs, уважая ), вы получаете те же символы, что упоминает Стефан.vanillacompletion-styles

  2. С помощью завершения нечеткого символа Сосульки Свонка (из библиотеки el-swank-fuzzy.el) в качестве текущего метода завершения TAB вы получаете следующие кандидаты на завершение:

    Окно-система                
    с-синтаксического столом
    Окно-система для-дисплея
    виджет-кодирования-система действия
    виджет-символ-приглашение-внутренний
    виджет-кодирования-системы-оперативное значение
    с-swfy-структуры
    виджет указать-документ
    с-swfy-timedout
    виджет указать поле
    виджеты указать активный
    виджет указать кнопку
    виджеты указать-вставка
    виджет указать выборки
    виджетами указать секретный
    виджеты указать неактивный
    оконный безопасно термоусадочный-р
    виджет-типа копирования
    Окно изменение размера применить
    Окно - изменение размера корня окна-вертикально
    Окно-дисплей стол
    Окно - дисплей-буфер
    Окно - изменение размера применить-р
    Окно изменения размера применить итог
    widgetp-дисплей-заканчивания
    Окно-конец восстановить изображение-триггер
    с-отображаемого-буферного окно
    виджет видимость значение создать
    виджет-Emacs-библиотека-ссылка действия
    виджет для редактирования-лист ввода создать
    виджет Emacs-комментарий-ссылка действия

Первые 3 кандидата, опять же, те, о которых упоминает Стефан.

  1. С простым нечетким завершением (библиотека fuzzy-match.el) единственным кандидатом является with-syntax-table.

  2. С нечетким завершением « Сосульки» вы получаете всех кандидатов, которые предлагает нечеткое завершение Суонка, а также следующее:

    Анж-FTP-выжидательную не занята
    Dired-в-Dir-с-симлинками
    Ediff-выбор окна-настройки-функция-автоматически
    Ediff-макияж широкий дисплей
    Ediff-тумблер широкий дисплей
    Ediff-окно-дисплей-р
    Ediff окна-ок-на-дисплей
    Ediff-с-синтаксического столом
    найти новую-буфер-файл кодирование-система
    Или-дисплей имя окна гну-кадр
    помощь окно-дисплей-сообщение
    сосулька-выбрать-окно-в-буферный-дисплей
    Revert-буфер-с-кодирования-системы
    Набор-W32-система кодирования-система
    установка окна дисплей стол
    установка оконного конца восстановить изображение-триггер
    оболочечная запись история-на-выход
    сплит-окна-здраво
    дерево-виджет - местонахождение-подкаталог
    w32-находка-файл не обретенные посаженная-буфер-файл кодирование-система
    w32-инициализация окно-система
  1. С завершением нечеткой подстроки Сосульки Левенштейна (1) (расстояние Левенштейна, равное 1), вы получите только эти дополнения:
    помощь-последующий символ
    сообщение-регистрация новости синтаксис
    w32-initialize-window-system оконная система
    Окно-система для-дисплея
  1. С расстоянием Левенштейна 2 вместо 1, есть больше чем 300 кандидатов завершения.

  2. При строгом завершении Левенштейна (1 или 2) нет кандидатов. Аналогично, для Сосульки у Джаро-Винклера нечеткое завершение .

Нарисовался
источник
1
Я согласен, что существует некое потенциальное наложение API для нечеткого завершения, но для завершения кода обычно требуется скомпилированный режим или проверка во время выполнения. Как вы заявляете, Icicles предоставляет мало возможностей для дополнения кода, поэтому он не имеет отношения к рассматриваемому вопросу.
dgtized
@dgtized: Ну, я не согласен. Ты пробовал completion.el? (Точно так же, dabbrevи hippie-expand- все 3 включены в GNU Emacs.) Эти вещи весьма полезны с кодом завершения, несмотря на то , как вы предлагаете, они не имеют не кода конкретных знаний. Вы можете быть удивлены, насколько полезными они могут быть (с нечетким соответствием или без него). И, как это, любое не зависящее от кода завершение, которое использует минибуфер для завершения, когда есть несколько кандидатов, автоматически получает выгоду от нечеткого завершения Icicles .
Дрю
2

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

Все, что вам нужно сделать, это нажать связывание клавиш, для complete-symbolкоторого по умолчанию привязано значение, C-M-iи появится всплывающее наложение, и вы используете нечеткое сопоставление, чтобы получить кандидата на завершение.

Чакраварти Рагхунандан
источник