Jak uzyskać uzupełnienie kodu rozmytego

27

Podczas używania ReSharper w Visual Studio symbole mogą być automatycznie uzupełniane przy użyciu dopasowania rozmytego zamiast dopasowania przedrostka. Na przykład, jeśli szukam funkcji o nazwie DoSomethingAmazingmógłbym napisać DoSoAmi byłoby spróbować poszerzyć moje zapytanie, aby dopasować wszystkie symbole zawierające Do, Soi Amgdzieś w ich imieniu.

Kolejny przykład można znaleźć w poniższym gifie. Możesz zobaczyć kilka rozszerzeń, w których łańcuchy nieprefiksowe są rozwijane do właściwego symbolu. (Zignoruj ​​rozwinięcie fragmentu, ponieważ w tym pytaniu chodzi mi tylko o dopasowanie rozmyte).Gif przedstawiający kilka przykładów rozmytego dopasowania w akcji

Kolejny przykład można zobaczyć we wtyczce YouCompleteMe dla Vima: Gif pokazujący więcej przykładów rozmytego dopasowywania w akcji w vimie

Wydaje się, że zarówno autouzupełnianie, jak i tryb firmowy mają dopasowanie do prefiksu, ale nie mogę znaleźć sposobu na włączenie dopasowania rozmytego.

Idealnie byłoby, gdyby rozwiązanie było niezależne od języka i dotyczyło dowolnego pakietu uzupełniania symboli, którego używam, ale interesują mnie również rozwiązania specyficzne dla języka. Patrzyłem na Helma, ale nie znalazłem sposobu na zastosowanie go do uzupełniania kodu.

Rozważyłem alternatywy, takie jak przypisanie klawiszy do aktywacji uzupełniania symboli za pomocą bufora Helm, ale mam nadzieję, że istnieje sposób, aby to zrobić za pomocą uzupełniania w stylu wyskakującym.

Jestem również otwarty na ręczną konfigurację dla poszczególnych języków, ponieważ niektóre języki oddzielają symbole myślnikami, podczas gdy inne używają znaków podkreślenia lub myślników, które, jak zakładam, wpłynęłyby na sposób dopasowania.

Jake Woods
źródło

Odpowiedzi:

19

Wbudowana funkcja uzupełniania Emacsa oferuje podobne dopasowanie rozmyte (domyślnie jest używane do „zrób tak”, a nie do „DoSoAm”), a najnowsze wersje trybu firmowego IIUC używają tego przynajmniej w niektórych przypadkach.

Np. Jeśli otworzysz bufor Elisp za pomocą Emacsa-24.4 i najnowszego trybu firmowego, jeśli wpiszesz (wi-syfirmę, pojawi się menu zakończenia pokazujące window-system, window-system-for-displayi with-syntax-table.

Stefan
źródło
2
Z Emacsa 24,4 company-modepodporach completion-styles, ten post sugeruje możliwość ustawienia próbuje ją.
wasamasa
Po zainstalowaniu 24.4 odkryłem, że właśnie tego szukałem. Niestety wydaje się, że jest specyficzny dla danego języka i będzie wymagał zmian w backendach firmy, aby działał w innych językach. Jednak spośród odpowiedzi jest najbliższa, jaką znalazłem i mam nadzieję, że z dłuższym czasem będzie ona dotyczyć większej liczby języków. Dzięki!
Jake Woods,
company-ycmdto kolejny backend, który obsługuje rozmyte zakończenie.
Dmitry
9

Za pomocą company-modemożna C-swyszukiwać spośród dostępnych kandydatów, które wyświetla. Wyszukiwane hasło jest wyświetlane w modeline (wiem, że nie jest to łatwe do znalezienia. W tym przypadku zgłosiłem problem ).

Jeśli chcesz użyć Hełmu do ukończenia, rozważ użycie steru lub steru . Nie próbowałem z ac-helm, ale z helm-company, możesz bezpośrednio powiązać go z kluczem, aby zastąpić standardowy interfejs company-complete.

Do zrobienia
źródło
To było blisko tego, czego szukałem. Miałem nadzieję na zakończenie bez konieczności naciskania klawisza, ale odkryłem, że użycie go w połączeniu z dopasowaniem prefiksu stanowi odpowiednią alternatywę. Dzięki!
Jake Woods,
Jeśli korzystasz z company-modeinterfejsu użytkownika, możesz nacisnąć przycisk, C-saby wyszukać kandydata z listy dostępnych kandydatów companyprzedstawionych tobie.
Tu Do
Tak, rozumiem to i tak jak powiedziałem w powyższym komentarzu, który jest bliski temu, czego szukałem. Idealne rozwiązanie (dla mnie) nie wymagałoby Cs i szukałbym kandydatów bezpośrednio w wyskakującym oknie podczas pisania. Ale podejście Cs jest z pewnością interesujące i zamierzam zintegrować je z moim przepływem pracy.
Jake Woods,
Podczas korzystania z firmy uważam, że C-M-sjest o wiele lepszy niż C-s. Dzięki meta będzie filtrować kandydatów zamiast tylko wyszukiwania.
niania
@nanny świetnie to wiedzieć.
Tu Do
5

Jak wspomniano w komentarzu wcześniej, ycmdobsługuje dopasowanie rozmyte. Możesz go używać za pośrednictwem company-ycmd. Właściwie skonfigurowane, możesz uzyskać uzupełnienie specyficzne dla języka, jak również proste uzupełnienie oparte na identyfikatorze, w bardzo płynnym doświadczeniu.

abingham
źródło
fajnie byłoby pokazać tutaj, co oznacza „prawidłowo”.
Jason Hu,
2

Istnieje kilka pakietów, które oferują takie rozmyte zakończenie. Wyobrażam sobie na przykład, że Helm (skoro o tym wspominasz).

Jeśli korzystasz z biblioteki Icicles , możesz wybrać (w locie) spośród kilku metod rozmytego uzupełniania - większy wybór, niż widziałem oferowany gdzie indziej. (Sam nie jestem fanem rozmytego ukończenia, ale oferuję to.)

Sople zakończenie (stąd niewyraźny zakończenie, jeśli zdecydujesz że) ma zastosowanie prawie wszędzie, ale nie ma całe mnóstwo Icicles -specyficznych kodowych -completion funkcji. Ta strona dokumentu Icicles mówi o takim uzupełnieniu tekstu buforowego.


Z Sople , wykorzystujące przykład Stefana ukończenia (wi-syw trybie Emacs Lisp:

  1. Po ukończeniu Sopli (co zapewnia Emacs, szanując ) otrzymujesz te same symbole, o których wspomina Stefan.vanillacompletion-styles

  2. Dzięki ukończeniu zamazanego symbolu Icicles Swank (z biblioteki el-swank-fuzzy.el) jako obecnej metodzie uzupełniania TAB otrzymujesz tych kandydatów do uzupełnienia:

    system okien                
    z tabelą składni
    system okien dla wyświetlacza
    widget-coding-system-action
    widget-symbol-prompt-internal
    widget-kodowanie-system-wartość-zachęty
    with-swfy-struct
    widget-spec-doc
    z-swfy-timeedout
    widget-spec-field
    widget-spec-active
    przycisk widżetu-określenia
    widget-spec-insert
    widget-spec-sample
    widget-spec-secret
    widget-spec-nieaktywny
    okno-bezpiecznie-termokurczliwe-p
    typy widgetów-kopiowanie
    Window-Resize-Apply
    window - resize-root-window-vertical
    okno-wyświetlacz-stół
    okno - bufor wyświetlacza
    okno - resize-Apply-p
    Window-Resize-Apply-Total
    widgetp-display-Completions
    Window-redisplay-end-trigger
    z wyświetlonym oknem bufora
    widget-visibility-value-create
    widget-emacs-library-link-action
    widget-editable-list-entry-create
    widget-emacs-commentary-link-action

Pierwszych 3 kandydatów to znowu ci, o których Stefan wspomina.

  1. Przy zwykłym zakończeniu dopasowania rozmytego (biblioteka fuzzy-match.el) jedynym kandydatem jest with-syntax-table.

  2. Dzięki zamrożonemu zamrożeniu Sople otrzymujesz wszystkich kandydatów, których oferuje zamszowe uzupełnienie Swank, a także:

    ange-ftp-wait-not-busy
    dired-into-dir-with-symlinks
    ediff-wybierz-okno-konfiguracja-funkcja-automatycznie
    ediff-make-wide-display
    ediff-toggle-wide-display
    ediff-window-display-p
    ediff-window-ok-do-display
    ediff-with-syntax-table
    find-new-buffer-file-coding-system-system
    gnus-frame-or-window-display-name
    komunikat o wyświetleniu okna pomocy
    icicle-select-window-for-buffer-display
    revert-buffer-with-coding-system
    set-w32-system-system-kodowania
    set-window-display-table
    set-window-redisplay-end-trigger
    shell-write-history-on-exit
    rozsądnie podzielone okno
    tree-widget - locate-podkatalog
    w32-find-file-not-found-set-buffer-file-coding-system-system
    w32-initialize-window-system
  1. Z zakończeniem rozmytego substratu Icicles Levenshtein (1) (odległość Levenshtein 1), otrzymujesz tylko następujące uzupełnienia:
    symbol podążania za pomocą
    wiadomość-sprawdź-składnia-wiadomości
    w32-initialize-window-system window-system
    system okien dla wyświetlacza
  1. Przy odległości Levenshteina wynoszącej 2 zamiast 1, jest ponad 300 kandydatów do ukończenia.

  2. Przy ścisłym ukończeniu Levenshtein (1 lub 2) nie ma kandydatów. Podobnie, w przypadku Icicles Jaro-Winkler rozmyte zakończenie .

Drew
źródło
1
Zgadzam się, że istnieje pewne potencjalne nakładanie się interfejsów API dla uzupełniania rozmytego, ale uzupełnianie kodu zazwyczaj wymaga kompilacji specyficznej dla trybu lub kontroli środowiska wykonawczego. Jak sam się twierdzisz, Icicles nie zapewnia zbyt wielu funkcji uzupełniania kodu, więc nie wydaje się, aby był on odpowiedni do pytania.
zdiagnozowano
@dgtized: Cóż, nie zgadzam się. Próbowałeś completion.el? (Podobnie, dabbrevi hippie-expand- wszystkie 3 są zawarte w GNU Emacs). Te rzeczy są bardzo pomocne przy uzupełnianie kodu, chociaż, jak sugerujesz, mają żadnej wiedzy kodu specyficzne. Możesz być zaskoczony, jak mogą być pomocni (z dopasowaniem rozmytym lub bez). I podobnie jak te, każde uzupełnienie specyficzne dla kodu, które używa minibufora do ukończenia, gdy jest wielu kandydatów, automatycznie korzysta z rozmytego zakończenia Icicles .
Drew
2

jeśli używasz ivy, w ostatnich aktualizacjach ivyobsługuje funkcję uzupełniania w punkcie w nakładce. Ivy obsługuje dopasowanie rozmyte przy pomocy flx. Kasy to film o tym, jak to działa :)

Wszystko, co musisz zrobić, to nacisnąć klawisz powiązania, dla complete-symbolktórego domyślnie jest powiązany, C-M-ipojawi się nakładka i użyjesz rozmytego dopasowywania, aby uzyskać kandydata do ukończenia.

Chakravarthy Raghunandan
źródło