Activer la correspondance floue du lierre partout, sauf dans le swiper

10

J'utilise flx-ido-modedepuis un moment et j'aime ça. Ivy peut se comporter de la même manière en utilisant ivy--regex-fuzzy.

Le problème est qu'il swiperutilisera également la correspondance floue maintenant et dans ce cas, je ne l'aime pas vraiment (du moins pas par défaut, tout le temps).

Je voudrais donc continuer à utiliser la correspondance floue avec Ivy, sauf dans swiper. Existe-t-il un moyen de configurer cela? Ou puis-je dire en quelque sorte swiperque je recherche vraiment "cette" sous-chaîne en ce moment en préfixant quelque chose?

Audacieux
la source

Réponses:

16

Je voudrais continuer à utiliser la correspondance floue avec Ivy sauf dans swiper.

La variable qui détermine quel "constructeur d'expressions rationnelles", comme Ivy se réfère à ces fonctions, est utilisée pour quelle fonction de collecte est 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.

Donc, pour changer le générateur d'expressions rationnelles par défaut de ivy--regex-plusà ivy--regex-fuzzy, mais conserver l'ancien pour swiper, vous pouvez

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

ou, plus programmatique,

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

Ceci est décrit plus en détail dans (ivy) Completion Styles.

Je n'aime pas vraiment [l'appariement flou] (du moins pas par défaut, tout le temps)

Ivy vous permet de faire pivoter le constructeur d'expressions rationnelles à la volée via son interface hydra. La dernière phrase assez cachée (ivy) ivy--regex-fuzzyfait allusion à cela, et une description plus complète peut être trouvée sous (ivy) Hydra in the minibuffer, mais il semble que le manuel soit un peu dépassé étant donné que cela fait un petit moment depuis la dernière version.

Le résultat est que, depuis le 04/07/2017 , Ivy vous permet de parcourir les constructeurs d'expressions régulières lors de l'achèvement via C-om( ivy-rotate-preferred-builders). Edit : comme indiqué par Asme Justdans un commentaire , la liaison de touches par défaut a été modifiée C-oMle 2019-02-06 .

Basilic
la source
Pourriez-vous s'il vous plaît expliquer un peu le cycle d'achèvement? Par exemple, si j'ai commencé une recherche par balayage, Co me donnera immédiatement un message "commande-exécuter: Impossible d'ouvrir le fichier de chargement: Aucun fichier ou répertoire, ivy-hydra".
B_old
@B_old Essayez d'installer le ivy-hydrapackage optionnel en premier. La question morale de savoir si une liaison de touches par défaut devrait exister pour une fonctionnalité facultative (c'est-à-dire pas toujours installée) a déjà été soulevée et le statu quo ne devrait pas changer prochainement. Si vous avez d'autres questions ivy-hydraauxquelles le manuel ne répond pas, veuillez envisager de leur créer de nouvelles questions Emacs SE.
Basil
( ivy-rotate-preferred-builders) est C-o M pour moi actuellement par défaut.
Asme Just
@AsmeJust Merci, c'était un changement incompatible en arrière effectué il y a un peu plus de 2 semaines: github.com/abo-abo/swiper/commit/…
Basil
2

Si vous souhaitez désactiver la correspondance des expressions rationnelles dans le swiper, mais la garder active ailleurs, ajoutez ceci à votre user-init-file:

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

Si vous souhaitez le désactiver une seule fois, appuyez M-rsur Swiper.

Cayhorstmann
la source
+1 pour avoir mentionné la M-rreliure pratique . Notez, cependant, que OP a seulement spécifié qu'il voulait désactiver la correspondance floue; quel constructeur d'expressions rationnelles devrait le remplacer n'était pas clair.
Basil