Aktifkan ivy fuzzy matching di mana-mana, kecuali di swiper

10

Saya telah menggunakan flx-ido-modeuntuk sementara waktu dan saya menyukainya. Ivy dapat berperilaku dengan cara yang sama dengan menggunakan ivy--regex-fuzzy.

Masalahnya adalah bahwa swiperjuga akan menggunakan pencocokan fuzzy sekarang dan dalam hal ini saya tidak benar-benar menyukainya (setidaknya tidak sebagai default, sepanjang waktu).

Jadi saya ingin terus menggunakan pencocokan fuzzy dengan Ivy kecuali dalam swiper. Apakah ada cara untuk mengkonfigurasi ini? Atau bisakah saya mengatakan swiperbahwa saya benar-benar mencari substring "ini" sekarang dengan mengawali sesuatu?

Mencolok
sumber

Jawaban:

16

Saya ingin terus menggunakan pencocokan fuzzy dengan Ivy kecuali dalam swiper.

Variabel yang menentukan "pembuat regexp", seperti Ivy merujuk ke fungsi-fungsi ini, digunakan untuk fungsi pengumpulan mana ivy-re-builders-alist:

ivy-re-builders-alist is a variable defined in ‘ivy.el’.
Its value is ((t . ivy--regex-plus))

Documentation:
An alist of regex building functions for each collection function.

Each key is (in order of priority):
1. The actual collection function, e.g. ‘read-file-name-internal’.
2. The symbol passed by :caller into ‘ivy-read’.
3. ‘this-command’.
4. t.

Each value is a function that should take a string and return a
valid regex or a regex sequence (see below).

Possible choices: ‘ivy--regex’, ‘regexp-quote’,
‘ivy--regex-plus’, ‘ivy--regex-fuzzy’.

If a function returns a list, it should format like this:
’(("matching-regexp" . t) ("non-matching-regexp") ...).

The matches will be filtered in a sequence, you can mix the
regexps that should match and that should not match as you
like.

Jadi, untuk mengubah pembuat regexp default dari ivy--regex-plusmenjadi ivy--regex-fuzzy, tetapi mempertahankan yang pertama swiper, Anda bisa

(setq ivy-re-builders-alist
      '((swiper . ivy--regex-plus)
        (t      . ivy--regex-fuzzy)))

atau, lebih terprogram,

(with-eval-after-load 'ivy
  (push (cons #'swiper (cdr (assq t ivy-re-builders-alist)))
        ivy-re-builders-alist)
  (push (cons t #'ivy--regex-fuzzy) ivy-re-builders-alist))

Ini dijelaskan lebih rinci dalam (ivy) Completion Styles.

Saya tidak terlalu suka [fuzzy matching] (setidaknya bukan sebagai default, sepanjang waktu)

Ivy memungkinkan Anda memutar pembuat regexp dengan cepat melalui antarmuka hydra-nya. Kalimat terakhir yang cukup tersembunyi dari (ivy) ivy--regex-fuzzymenyinggung ini, dan deskripsi yang lebih lengkap dapat ditemukan di bawah (ivy) Hydra in the minibuffer, tetapi sepertinya manual agak ketinggalan jaman mengingat sudah beberapa saat sejak rilis terakhir.

Hasilnya adalah, sejak 2017-07-04 , Ivy memungkinkan Anda untuk menelusuri pembuat regexp selama penyelesaian melalui C-om( ivy-rotate-preferred-builders). Sunting : seperti yang ditunjukkan Asme Justdalam komentar , pengikatan kunci default diubah menjadi C-oMpada 2019-02-06 .

Kemangi
sumber
Bisakah Anda menjelaskan sedikit tentang penyelesaian bersepeda? Sebagai contoh jika saya telah memulai pencarian swiper, Co akan segera memberi saya "perintah-eksekusi: Tidak dapat membuka file: Tidak ada file atau direktori, ivy-hydra" pesan.
B_old
@ B_old Coba instal ivy-hydrapaket opsional terlebih dahulu. Pertanyaan moral apakah ikatan kunci default harus ada untuk fitur opsional (yaitu tidak selalu diinstal) telah dinaikkan dan status quo sepertinya tidak akan segera berubah. Jika Anda memiliki pertanyaan lain tentang ivy-hydramana manual ini tidak membahas, silakan mempertimbangkan membuat pertanyaan SE Emacs baru untuk mereka.
Basil
( ivy-rotate-preferred-builders) C-o M untuk saya saat ini secara default.
Asme Just
@ AsmeJust Terima kasih, itu adalah perubahan mundur yang tidak kompatibel yang dilakukan lebih dari 2 minggu yang lalu: github.com/abo-abo/swiper/commit/…
Basil
2

Jika Anda ingin mematikan pencocokan regex di swiper, tetapi tetap aktif di tempat lain, tambahkan ini ke user-init-file:

(setq ivy-re-builders-alist
      '((swiper . regexp-quote)
        (t      . ivy--regex-fuzzy)))

Jika Anda ingin menonaktifkannya sekali saja, tekan M-rswiper.

cayhorstmann
sumber
+1 untuk menyebutkan M-rpengikatan praktis . Perhatikan, bagaimanapun, bahwa OP hanya menentukan mereka ingin pencocokan fuzzy dinonaktifkan; pembangun regexp mana yang harus menggantinya tidak jelas.
Basil