Aktivieren Sie Efeu-Fuzzy-Matching überall, außer im Swiper

10

Ich benutze es flx-ido-modeseit einer Weile und ich mag es. Ivy kann sich genauso verhalten wie mit ivy--regex-fuzzy.

Das Problem ist, dass swiperjetzt auch Fuzzy Matching verwendet wird und in diesem Fall gefällt es mir nicht wirklich (zumindest nicht immer als Standard).

Daher möchte ich weiterhin Fuzzy Matching mit Ivy verwenden, außer in swiper. Gibt es eine Möglichkeit, dies zu konfigurieren? Oder kann ich irgendwie sagen, swiperdass ich gerade wirklich nach "diesem" Teilstring suche , indem ich etwas voranstelle?

Fett gedruckt
quelle

Antworten:

16

Ich möchte weiterhin Fuzzy Matching mit Ivy verwenden, außer in swiper.

Die Variable, die bestimmt, welcher "Regexp Builder", wie Ivy auf diese Funktionen verweist, für welche Erfassungsfunktion verwendet wird 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.

Um den Standard-Regexp-Builder von ivy--regex-plusauf zu ändern ivy--regex-fuzzy, aber den ersteren für beizubehalten swiper, können Sie dies tun

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

oder programmatischer,

(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))

Dies wird ausführlicher in beschrieben (ivy) Completion Styles.

Ich mag [Fuzzy Matching] nicht wirklich (zumindest nicht immer als Standard)

Mit Ivy können Sie den Regexp-Builder über die Hydra-Schnittstelle im laufenden Betrieb drehen. Der ziemlich versteckte letzte Satz von (ivy) ivy--regex-fuzzyAnspielungen darauf und eine ausführlichere Beschreibung finden Sie unter (ivy) Hydra in the minibuffer, aber es sieht so aus, als ob das Handbuch etwas veraltet ist, da es seit der letzten Veröffentlichung eine Weile her ist.

Das Ergebnis ist, dass Sie mit Ivy seit dem 04.07.2017 während der Fertigstellung über C-om( ivy-rotate-preferred-builders) durch Regexp-Builder blättern können . Bearbeiten : Wie Asme Justin einem Kommentar erwähnt , wurde die Standardschlüsselbindung C-oMam 06.02.2019 in geändert .

Basilikum
quelle
Könnten Sie bitte etwas näher auf die Fertigstellung des Radfahrens eingehen? Wenn ich beispielsweise eine Swiper-Suche gestartet habe, gibt Co sofort die Meldung "Befehl ausführen: Ladedatei kann nicht geöffnet werden: Keine solche Datei oder kein solches Verzeichnis, ivy-hydra".
B_old
@B_old Versuchen Sie zuerst, das optionale ivy-hydraPaket zu installieren . Die moralische Frage, ob für eine optionale (dh nicht immer installierte) Funktion eine Standardschlüsselbindung vorhanden sein sollte, wurde bereits aufgeworfen, und es ist unwahrscheinlich, dass sich der Status Quo bald ändert. Wenn Sie weitere Fragen haben, ivy-hydradie im Handbuch nicht behandelt werden, können Sie neue Emacs SE-Fragen für diese erstellen.
Basil
( ivy-rotate-preferred-builders) ist C-o M für mich derzeit standardmäßig.
Asme Nur
@ AsmeJust Danke, das war eine rückwärts inkompatible Änderung, die vor etwas mehr als 2 Wochen vorgenommen wurde: github.com/abo-abo/swiper/commit/…
Basil
2

Wenn Sie den Regex-Abgleich in Swiper deaktivieren möchten, ihn aber an anderer Stelle aktiv lassen möchten, fügen Sie Folgendes hinzu user-init-file:

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

Wenn Sie es nur einmal deaktivieren möchten, M-rdrücken Sie den Swiper.

Cayhorstmann
quelle
+1 für die Erwähnung der handlichen M-rBindung. Beachten Sie jedoch, dass OP nur angegeben hat, dass der Fuzzy-Abgleich deaktiviert werden soll. Welcher Regexp-Builder ihn ersetzen sollte, war unklar.
Basil