Habilite la coincidencia difusa de hiedra en todas partes, excepto en swiper

10

Lo he estado usando flx-ido-modedurante un tiempo y me gusta. Ivy puede comportarse de la misma manera usando ivy--regex-fuzzy.

El problema es que ahora swipertambién usaré la coincidencia difusa y, en este caso, realmente no me gusta (al menos no por defecto, todo el tiempo).

Así que me gustaría seguir usando coincidencias difusas con Ivy, excepto en swiper. ¿Hay alguna forma de configurar esto? ¿O puedo decir de alguna manera swiperque realmente estoy buscando "esta" subcadena en este momento prefijando algo?

Negrita
fuente

Respuestas:

16

Me gustaría seguir usando coincidencias difusas con Ivy, excepto en swiper.

La variable que determina qué "generador de expresiones regulares", como Ivy se refiere a estas funciones, se utiliza para qué función de colección es 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.

Entonces, para cambiar el generador de expresiones regulares predeterminado de ivy--regex-plusa ivy--regex-fuzzy, pero mantener el primero para swiper, podría

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

o, más programáticamente,

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

Esto se describe con más detalle en (ivy) Completion Styles.

Realmente no me gusta [coincidencia difusa] (al menos no por defecto, todo el tiempo)

Ivy le permite rotar el generador de expresiones regulares sobre la marcha a través de su interfaz de hidra. La última oración bastante oculta (ivy) ivy--regex-fuzzyalude a esto, y se puede encontrar una descripción más completa debajo (ivy) Hydra in the minibuffer, pero parece que el manual está un poco desactualizado dado que ha pasado un tiempo desde la última versión.

El resultado es que, desde 2017-07-04 , Ivy le permite recorrer los constructores de expresiones regulares durante la finalización a través de C-om( ivy-rotate-preferred-builders). Editar : como ha señalado Asme Justen un comentario , la clave de enlace predeterminado se cambió por C-oMel 02/06/2019 .

Albahaca
fuente
¿Podría por favor explicar un poco la finalización del ciclo? Por ejemplo, si he comenzado una búsqueda rápida, Co inmediatamente me dará un mensaje "ejecutar comando: No se puede abrir el archivo de carga: No hay tal archivo o directorio, mensaje de hiedra-hidra".
B_old
@B_old Intente instalar ivy-hydraprimero el paquete opcional . Ya se ha planteado la cuestión moral de si debería existir una combinación de teclas predeterminada para una característica opcional (es decir, no siempre instalada) y parece poco probable que el status quo cambie pronto. Si tiene otras preguntas sobre las ivy-hydracuales el manual no trata, considere crear nuevas preguntas de Emacs SE para ellas.
Basil
( ivy-rotate-preferred-builders) es C-o M para mí actualmente por defecto.
Asme Just
@AsmeJust Gracias, ese fue un cambio incompatible con versiones anteriores realizado hace poco más de 2 semanas: github.com/abo-abo/swiper/commit/…
Basil
2

Si desea desactivar la coincidencia de expresiones regulares en swiper, pero mantenerla activa en otro lugar, agregue esto a su user-init-file:

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

Si desea desactivarlo solo una vez, M-rpresione swiper.

cayhorstmann
fuente
+1 por mencionar la práctica M-rencuadernación. Sin embargo, tenga en cuenta que OP solo especificó que desean deshabilitar la coincidencia difusa; qué constructor de expresiones regulares debería reemplazarlo no quedó claro.
Albahaca