Bagaimana saya bisa mendapatkan penyelesaian kode fuzzy

27

Saat menggunakan ReSharper dalam simbol Visual Studio dapat dilengkapi secara otomatis menggunakan pencocokan fuzzy alih-alih pencocokan awalan. Misalnya jika saya sedang mencari fungsi bernama DoSomethingAmazingsaya bisa menulis DoSoAmdan itu akan mencoba untuk memperluas permintaan saya untuk mencocokkan semua simbol yang mengandung Do, Sodan Amdi suatu tempat di nama mereka.

Contoh lain dapat ditemukan di gif di bawah ini. Anda dapat melihat beberapa ekspansi di mana string non-awalan diperluas ke simbol yang benar. (Abaikan ekspansi snipet seperti dalam pertanyaan ini saya hanya peduli dengan pencocokan fuzzy).Gif menunjukkan beberapa contoh pencocokan fuzzy dalam aksi

Contoh lain dapat dilihat di plugin YouCompleteMe untuk Vim: Sebuah gif menampilkan lebih banyak contoh pencocokan fuzzy dalam aksi di vim

Mode Autocomplete dan Company sepertinya memiliki pencocokan awalan tetapi saya tidak dapat menemukan cara untuk mengaktifkan pencocokan fuzzy.

Idealnya solusinya adalah agnostik bahasa dan berlaku untuk paket penyelesaian simbol apa pun yang saya gunakan, tetapi saya juga tertarik dengan solusi spesifik bahasa. Saya telah melihat Helm tetapi belum menemukan cara untuk menerapkannya pada penyelesaian kode.

Saya telah mempertimbangkan alternatif seperti memiliki pengikat tombol untuk mengaktifkan pelengkapan simbol menggunakan buffer Helm tapi saya berharap ada cara untuk melakukan ini menggunakan pelengkapan gaya popup.

Saya juga terbuka untuk melakukan konfigurasi manual berdasarkan bahasa karena beberapa bahasa memisahkan simbol dengan tanda hubung sementara yang lain menggunakan garis bawah atau tanda hubung yang saya anggap akan mempengaruhi bagaimana pencocokan akan dilakukan.

Jake Woods
sumber

Jawaban:

19

Fungsionalitas penyelesaian built-in Emacs menawarkan pencocokan fuzzy yang serupa (tho secara default ini digunakan untuk "do-so-am" daripada untuk "DoSoAm") dan IIUC versi terbaru dari mode perusahaan menggunakan ini setidaknya dalam beberapa kasus.

Misalnya jika Anda membuka buffer Elisp menggunakan Emacs-24.4 dan mode-perusahaan terbaru, jika Anda mengetik (wi-syperusahaan akan memunculkan menu penyelesaian yang ditampilkan window-system, window-system-for-displaydan with-syntax-table.

Stefan
sumber
2
Dengan company-modedukungan Emacs 24.4 completion-styles, pos ini menyarankan pengaturan yang memungkinkan untuk mencobanya.
wasamasa
Setelah menginstal 24.4 saya telah menemukan bahwa ini adalah persis apa yang saya cari. Sayangnya itu tampaknya spesifik untuk bahasa dan akan memerlukan perubahan pada backend perusahaan untuk membuatnya berfungsi untuk bahasa lain. Namun diluar jawaban itu yang paling dekat yang saya temukan dan mudah-mudahan dengan lebih banyak waktu akan berlaku untuk lebih banyak bahasa. Terima kasih!
Jake Woods
company-ycmdadalah backend lain yang mendukung penyelesaian fuzzy.
Dmitry
9

Dengan company-mode, Anda dapat menggunakan C-suntuk mencari dari kandidat yang tersedia yang ditampilkan. Permintaan pencarian ditampilkan dalam modeline (tidak terlalu mudah dikenali, saya tahu. Saya mengajukan masalah di sini ).

Jika Anda ingin menggunakan Helm untuk penyelesaian, pertimbangkan untuk menggunakan helm-perusahaan atau helm-ac . Belum pernah mencoba ac-helm, tetapi dengan helm-company, Anda dapat langsung mengikatnya ke kunci untuk mengganti antarmuka standar company-complete.

Tu Do
sumber
Ini dekat dengan apa yang saya cari. Saya berharap untuk mendapatkan penyelesaian tanpa harus menekan tombol tapi saya menemukan bahwa menggunakannya dalam kombinasi dengan pencocokan awalan menyajikan alternatif yang cocok. Terima kasih!
Jake Woods
Jika Anda menggunakan company-modeUI, Anda dapat menekan C-suntuk mencari kandidat dari daftar kandidat yang tersedia yang companydisajikan kepada Anda.
Tu Do
Ya saya mengerti itu dan seperti saya katakan di komentar di atas yang dekat dengan apa yang saya cari. Solusi ideal (untuk saya) tidak akan membutuhkan Cs dan akan mencari kandidat inline di jendela sembulan saat saya mengetik. Tetapi pendekatan Cs tentu saja menarik dan saya bermaksud untuk mengintegrasikannya ke dalam alur kerja saya.
Jake Woods
Saat menggunakan perusahaan, saya menemukan C-M-sjauh lebih baik daripada C-s. Dengan meta, itu akan menyaring kandidat, bukan hanya mencari.
pengasuh
@nanny senang mengetahui hal itu.
Tu Do
5

Seperti yang disebutkan dalam komentar sebelumnya, ycmdmendukung pencocokan fuzzy. Anda dapat menggunakannya melalui company-ycmd. Dikonfigurasi dengan benar, Anda bisa mendapatkan penyelesaian khusus bahasa serta penyelesaian berbasis pengidentifikasi sederhana dalam pengalaman yang cukup mulus.

abingham
sumber
akan menyenangkan untuk menunjukkan apa yang dimaksud dengan "benar" di sini.
Jason Hu
2

Ada beberapa paket yang menawarkan penyelesaian fuzzy dari satu jenis atau lainnya. Saya membayangkan Helm melakukannya, misalnya (karena Anda menyebutkannya).

Jika Anda menggunakan perpustakaan Icicles maka Anda dapat memilih (on the fly) di antara beberapa metode fuzzy-completion - lebih banyak pilihan daripada yang saya lihat ditawarkan di tempat lain. (Saya sendiri bukan penggemar penyelesaian fuzzy, tapi saya menawarkannya.)

Penyelesaian Icicles (maka penyelesaian fuzzy, jika Anda memilihnya) berlaku cukup banyak di mana-mana, tetapi tidak ada banyak Icicles - kode khusus - fitur penyempurnaan. Ini halaman dari Icicles doc berbicara tentang penyelesaian penyangga-teks tersebut.


Dengan Icicles , gunakan contoh Stefan untuk menyelesaikan (wi-sydalam mode Emacs Lisp:

  1. Dengan selesainya Icicles (apa yang disediakan Emacs, hormati ), Anda mendapatkan simbol yang sama dengan yang disebutkan Stefan.vanillacompletion-styles

  2. Dengan penyelesaian simbol fuzzy Icicles Swank (dari perpustakaan el-swank-fuzzy.el) sebagai metode penyelesaian TAB saat ini, Anda mendapatkan kandidat penyelesaian ini:

    sistem jendela                
    dengan-sintaks-tabel
    window-system-for-display
    widget-coding-system-action
    widget-symbol-prompt-internal
    widget-coding-system-prompt-value
    dengan-swfy-struct
    widget-tentukan-doc
    dengan-swfy-timedout
    widget-tentukan-bidang
    widget-tentukan-aktif
    widget-tentukan-tombol
    widget-tentukan-masukkan
    widget-tentukan-sampel
    widget-tentukan-rahasia
    widget-tentukan-tidak aktif
    window-safe-shrinkable-p
    widget-types-copy
    window-resize-apply
    window - resize-root-window-secara vertikal
    window-display-table
    window - display-buffer
    window - resize-apply-p
    window-resize-apply-total
    widgetp-display-Completions
    window-redisplay-end-trigger
    dengan-display-buffer-window
    widget-visibility-value-create
    widget-emacs-library-link-action
    widget-editable-list-entry-create
    widget-emacs-commentary-link-action

3 kandidat pertama adalah, sekali lagi, yang disebutkan Stefan.

  1. Dengan penyelesaian fuzzy-match polos (perpustakaan fuzzy-match.el), satu-satunya kandidat adalah with-syntax-table.

  2. Dengan Icicles scatter fuzzy completion , Anda mendapatkan semua kandidat yang ditawarkan Swank fuzzy completion, ditambah yang berikut:

    ange-ftp-wait-not-busy
    dired-into-dir-with-symlinks
    ediff-pilih-jendela-pengaturan-fungsi-secara otomatis
    ediff-make-wide-display
    ediff-toggle-wide-display
    ediff-window-display-p
    ediff-window-ok-for-display
    ediff-dengan-sintaks-tabel
    find-new-buffer-file-coding-system
    gnus-frame-atau-window-display-name
    help-window-display-message
    icicle-select-window-for-buffer-display
    revert-buffer-with-coding-system
    set-w32-system-coding-system
    set-window-display-table
    set-window-redisplay-end-trigger
    shell-write-history-on-exit
    split-window-masuk akal
    tree-widget - cari-sub-direktori
    w32-find-file-not-found-set-buffer-file-coding-system
    w32-menginisialisasi-jendela-sistem
  1. Dengan Icicles Levenshtein (1) penyelesaian substring fuzzy (Levenshtein jarak 1), Anda hanya mendapatkan penyelesaian ini:
    help-follow-symbol
    message-check-news-syntax
    w32-menginisialisasi-jendela-sistem-sistem jendela
    window-system-for-display
  1. Dengan jarak Levenshtein 2 bukannya 1, ada lebih dari 300 kandidat yang lulus.

  2. Dengan penyelesaian Levenshtein (1 atau 2) yang ketat, tidak ada kandidat. Demikian juga, untuk Icicles Jaro-Winkler penyelesaian fuzzy .

Drew
sumber
1
Saya setuju ada beberapa potensi tumpang tindih API untuk penyelesaian fuzzy, tetapi penyelesaian kode umumnya memerlukan pemeriksaan kompilasi atau runtime mode khusus. Saat Anda menyatakan sendiri, Icicles menyediakan sedikit fitur pelengkap kode, sehingga sepertinya tidak relevan dengan pertanyaan yang ada.
dgtized
@dgtized: Yah, saya tidak setuju. Sudahkah Anda mencoba completion.el? (Demikian juga, dabbrevdan hippie-expand- ketiganya termasuk dalam GNU Emacs.) Hal-hal ini cukup membantu dengan penyelesaian kode, meskipun, seperti yang Anda sarankan, mereka tidak memiliki pengetahuan khusus kode. Anda mungkin terkejut betapa mereka bisa sangat membantu (dengan atau tanpa pencocokan fuzzy). Dan seperti ini, setiap penyelesaian khusus kode yang menggunakan minibuffer untuk menyelesaikan ketika ada beberapa kandidat secara otomatis mendapat manfaat dari penyelesaian fuzzy Icicles .
Drew
2

jika Anda gunakan ivy, dalam pembaruan terbaru ivymendukung penyelesaian fungsi titik pada overlay. Ivy mendukung pencocokan fuzzy dengan bantuan flx. Lihat video ini tentang cara kerjanya :)

Yang harus Anda lakukan adalah, tekan ikatan kunci complete-symbolyang secara default terikat C-M-idan overlay akan muncul dan Anda menggunakan pencocokan fuzzy untuk mendapatkan kandidat penyelesaian.

Chakravarthy Raghunandan
sumber