¿Cómo filtro el contenido del anillo de cierre?

9

¿Es posible evitar el kill-ringalmacenamiento de espacios en blanco / líneas vacías? En este momento, después de hacer un par de cambios y luego ir, a browse-kill-ringmenudo veo algo como esto:

-------



-------
   merchant_uuid: "some_uuid"
-------
   it "creates a webhook" do
-------

-------

-------

¿Hay alguna manera de obligar a kill-ring a agregar solo contenido significativo?

Ignacy Moryc
fuente
1
No es una respuesta, pero estoy usando helm-show-kill-ringy parece filtrar las entradas de anillo de matar en blanco. Sin embargo, todavía puedo tirar un montón de espacios en blanco, así que +1 para la pregunta.
glucas
Parece ser lo más cercano que está incorporado kill-do-not-save-duplicates, lo que impide kill-newagregar lo mismo al anillo de matar dos veces seguidas.
glucas

Respuestas:

3

Aquí hay un enfoque para tratar con asesinatos en blanco (es decir, solo espacios en blanco). En lugar de filtrarlos por completo, esto permitirá a lo sumo una entrada en blanco en el anillo de matar. Cada nueva muerte verificará la cabeza del anillo de la muerte y la reemplazará si está en blanco.

(defun my/replace-blank-kill (args)
  (let ((string (car args))
        (replace (cdr args))
        (last (car-safe kill-ring)))
    (when (and last (string-blank-p last))
      (setq replace t))
    (list string replace)))

(advice-add 'kill-new :filter-args #'my/replace-blank-kill)

Tenga en cuenta que estoy usando el mecanismo de asesoramiento Emacs 24.4+ aquí para filtrar los argumentos que eventualmente se pasan a kill-new.

El efecto es que todavía puedes matar y tirar un montón de espacios en blanco, pero si matas algo de espacio en blanco y luego matas algo más, la entrada de espacio en blanco se descartará.

glucas
fuente
Puede optar por no agregar el insteda al anillo de matar si lo prefiere. Este enfoque funciona para kill, kill-ring-saveetc. Si tiene comandos que se agregan al anillo de matar sin llamar, kill-newentonces no funcionará, por supuesto.
glucas
Este me lo resolvió. Creo que no uso ningún comando que agregue a kill ring sin kill-new, o al menos no noté ningún comportamiento extraño.
Ignacy Moryc
0

Un problema es que cualquier comando puede modificar el, kill-ringpor lo que el único gancho lo suficientemente potente como para hacer esto es el post-command-hook. Esto es ineficiente, pero AFAIK es la única forma de hacerlo con rigor. Si eso te parece bien, puedes hacer esto:

(defun kill-ring-clean-whitespace-only ()
  (when (string-match "^[[:space:]]*$" (car kill-ring))
    (setq kill-ring (cdr kill-ring))))

(add-hook 'post-command-hook #'kill-ring-clean-whitespace-only)

En aras de la eficiencia, supongo que todos los comandos se agregan al kill-ring, esto es probablemente seguro, pero tenga en cuenta que una función puede insertar texto en cualquier lugar que desee en el kill-ring. Sin embargo, esto es raro, y estoy seguro de que no desea iterar sobre todo el anillo de matar en cada comando.

PythonNut
fuente
Una forma un poco más eficiente de hacer esto podría ser limpiar el anillo de matar justo antes de tirarlo o navegarlo, ya sea a través del desacoplamiento o sus propios comandos.
Sacha Chua
Pensé en eso, pero luego necesitaríamos una lista de todos los comandos que acceden al anillo de matar para tirar. Si alguien puede llegar a una lista, el resto sería fácil (por supuesto).
PythonNut