¿Cómo cambiar entre los estilos de terminación de Ivy?

Pregunta:

Hay tres estilos de terminación Ivy :

ivy--regex-plus
ivy--regex-ignore-order
ivy--regex-fuzzy

Co (hydra-ivy / body) m alterna entre ivy "ivy – regex-plus" y "ivy – regex-fuzzy".

¿Cómo cambiar a Ivy – estilo de finalización de regex-ignore-order?

Por ejemplo, si quisiera una lista de todas las funciones que contienen la cadena "deletrear", en la ayuda para describir las funciones, lo haría: ingresar "deletrear" y cambiar a ivy – regex-ignore-order.

Estoy usando Emacs 25.2.1 con Evil Spacemacs e Ivy en Linux.

Respuesta:

El código en esta respuesta ahora es parte de Ivy: https://github.com/abo-abo/swiper/commit/ae438ff62fa3d9b98d899afc0e97c13be2148725

Dentro de ivy-hydra , la tecla m está vinculada al comando ivy-toggle-fuzzy , que está codificado para alternar la variable ivy--regex-function entre las funciones de construcción de ivy--regex-plus ivy--regex-fuzzy y ivy--regex-plus .

El panel ivy-hydra está igualmente limitado por la función ivy--matcher-desc para describir ivy--regex-fuzzy como "difuso" y todos los demás valores como "ivy".

No estoy familiarizado con hydra y si facilita la combinación de teclas y comandos de intercambio en caliente, por lo que mi única sugerencia (aparte de posiblemente enviar una solicitud de función al proyecto ivy ) es anular las funciones mencionadas anteriormente para exhibir el comportamiento deseado:

(defvar my-ivy-builders '(ivy--regex-plus
                          ivy--regex-ignore-order
                          ivy--regex-fuzzy)
  "Preferred values for `ivy--regex-function'.")

(define-advice ivy--matcher-desc (:override () my-expand-matchers)
  "Return a brief description of `ivy--regex-function'."
  (pcase ivy--regex-function
    ('ivy--regex-fuzzy        "fuzzy")
    ('ivy--regex-ignore-order "order")
    ('ivy--regex-plus         "plus")
    (_                        "other")))

(define-advice ivy-toggle-fuzzy (:override () my-rotate-builders)
  "Slide `ivy--regex-function' across `my-ivy-builders'."
  (when my-ivy-builders
    (setq ivy--old-re nil)
    (setq ivy--regex-function
          (or (cadr (memq ivy--regex-function my-ivy-builders))
              (car my-ivy-builders)))))

Aquí, my-ivy-builders contiene todas las funciones de construcción de expresiones regulares preferidas que son adecuadas como valores de la variable ivy--regex-function . El consejo de ivy--matcher-desc simplemente agrega soporte para describir más funciones de este tipo con un nombre legible por humanos. Puede nombrarlos como quiera, pero asegúrese de que quepan dentro de 5 columnas, de lo contrario, el formato del panel ivy-hydra se distorsionará. Finalmente, el consejo de ivy-toggle-fuzzy desliza ivy--regex-function través de sus valores permitidos que se enumeran en my-ivy-builders . Puede cambiar el orden inicial de my-ivy-builders para que coincida con su gusto y su valor predeterminado para ivy--regex-function .

Yo uso :override advice en lugar de redefinir las funciones con defun porque la primera es reportada por el sistema de ayuda (es decir, describe-function ). Tenga en cuenta que define-advice solo se agregó en Emacs 25.1; bajo Emacs 24, el consejo debería escribirse más como

(defvar my-ivy-builders '(ivy--regex-plus
                          ivy--regex-ignore-order
                          ivy--regex-fuzzy)
  "Preferred values for `ivy--regex-function'.")

(defun my-ivy-matcher-descs ()
  "Return a brief description of `ivy--regex-function'."
  (pcase ivy--regex-function
    ('ivy--regex-fuzzy        "fuzzy")
    ('ivy--regex-ignore-order "order")
    ('ivy--regex-plus         "plus")
    (_                        "other")))

(advice-add 'ivy--matcher-desc :override #'my-ivy-matcher-descs)

(defun my-ivy-rotate-builders ()
  "Slide `ivy--regex-function' across `my-ivy-builders'."
  (when my-ivy-builders
    (setq ivy--old-re nil)
    (setq ivy--regex-function
          (or (cadr (memq ivy--regex-function my-ivy-builders))
              (car my-ivy-builders)))))

(advice-add 'ivy-toggle-fuzzy :override #'my-rotate-builders)

Creo que las comillas simples (') tampoco siempre fueron compatibles con pcase , por lo que es posible que deba cambiarlas por comillas inversas (`).

Actualizar

Además de los útiles comentarios de glucas a continuación, puede renunciar a recomendar la función ivy-toggle-fuzzy y, en su lugar, reemplazarla con my-ivy-rotate-builders ajustados en el mapa de teclas de hydra bajo la combinación de teclas predeterminada de m :

(defvar my-ivy-builders '(ivy--regex-plus
                          ivy--regex-ignore-order
                          ivy--regex-fuzzy)
  "Preferred values for `ivy--regex-function'.")

(define-advice ivy--matcher-desc (:override () my-expand-matchers)
  "Return a brief description of `ivy--regex-function'."
  (pcase ivy--regex-function
    ('ivy--regex-fuzzy        "fuzzy")
    ('ivy--regex-ignore-order "order")
    ('ivy--regex-plus         "plus")
    (_                        "other")))

(defun my-ivy-rotate-builders ()
  "Slide `ivy--regex-function' across `my-ivy-builders'."
  (interactive)
  (when my-ivy-builders
    (setq ivy--old-re nil)
    (setq ivy--regex-function
          (or (cadr (memq ivy--regex-function my-ivy-builders))
              (car my-ivy-builders)))))

(with-eval-after-load 'ivy-hydra
  (define-key hydra-ivy/keymap "m" #'my-ivy-rotate-builders))

Quizás alguien más familiarizado con hydra también pueda sugerir una manera fácil de modificar la sugerencia / panel de hydra-ivy en su lugar en lugar de aconsejar a ivy--matcher-desc .

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım