Ative a correspondência difusa de hera em todos os lugares, exceto no swiper

10

Eu tenho usado flx-ido-modepor um tempo e eu gosto. Ivy pode se comportar da mesma maneira usando ivy--regex-fuzzy.

O problema é que swipertambém usará a correspondência difusa agora e, neste caso, eu realmente não gosto (pelo menos não como padrão, o tempo todo).

Então, eu gostaria de continuar usando correspondência difusa com Ivy exceto em swiper. Existe uma maneira de configurar isso? Ou posso, de alguma forma, dizer swiperque estou realmente procurando por "essa" substring agora, prefixando algo?

Negrito
fonte

Respostas:

16

Eu gostaria de continuar usando correspondência difusa com Ivy exceto em swiper.

A variável que determina qual "regexp builder", como Ivy se refere a essas funções, é usada para qual função de coleção é 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.

Portanto, para alterar o construtor de regexp padrão de ivy--regex-pluspara ivy--regex-fuzzy, mas mantenha o antigo por swiper, você pode

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

ou, mais programaticamente,

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

Isso é descrito em mais detalhes em (ivy) Completion Styles.

Eu realmente não gosto de [correspondência difusa] (pelo menos não como padrão, o tempo todo)

Ivy permite que você gire o construtor regexp em tempo real através de sua interface hydra. A última frase bastante escondida (ivy) ivy--regex-fuzzyfaz alusão a isso, e uma descrição mais completa pode ser encontrada em (ivy) Hydra in the minibuffer, mas parece que o manual está um pouco desatualizado, pois já faz um tempo desde o último lançamento.

O resultado é que, desde 04/07/2017 , o Ivy permite percorrer os construtores regexp durante a conclusão via C-om( ivy-rotate-preferred-builders). Editar : como apontado Asme Justem um comentário , a ligação de tecla padrão foi alterada para C-oMem 2019-02-06 .

Manjericão
fonte
Poderia, por favor, elaborar um pouco a conclusão do ciclo? Por exemplo, se eu iniciei uma pesquisa de swiper, o Co me fornecerá imediatamente uma mensagem "command-execute: Não é possível abrir o arquivo de carregamento: não existe esse arquivo ou diretório, ivy-hydra".
B_old
@B_old Tente instalar o ivy-hydrapacote opcional primeiro. A questão moral sobre se uma combinação de teclas padrão deve existir para um recurso opcional (ou seja, nem sempre instalado) já foi levantada e o status quo parece improvável que mude em breve. Se você tiver outras perguntas sobre as ivy-hydraquais o manual não aborda, considere criar novas perguntas para o Emacs SE.
Basil
( ivy-rotate-preferred-builders) é C-o M para mim atualmente por padrão.
Asme Apenas
@AsmeJust Obrigado, foi uma alteração incompatível com versões anteriores feita há mais de duas semanas: github.com/abo-abo/swiper/commit/…
Basil
2

Se você deseja desativar a correspondência de expressões regulares no swiper, mas mantenha-o ativo em outro lugar, adicione-o ao seu user-init-file:

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

Se você quiser desativá-lo apenas uma vez, pressione o M-rswiper.

cayhorstmann
fonte
+1 por mencionar a M-rligação prática . Observe, no entanto, que o OP especificou apenas que eles desejam desabilitar a correspondência difusa; qual construtor de regexp deve substituí-lo não ficou claro.
Basil