Come filtrare i contenuti di kill-ring?


9

È possibile impedire la kill-ringmemorizzazione di spazi bianchi / righe vuote? Subito dopo faccio un paio di modifiche e poi vado a browse-kill-ringvedere spesso qualcosa del genere:

-------



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

-------

-------

Esiste un modo per forzare kill-ring ad aggiungere solo contenuti significativi?


1
Non è una risposta, ma sto usando helm-show-kill-ringe sembra filtrare le voci vuote di kill ring. Posso comunque strappare un sacco di spazi bianchi, quindi +1 per la domanda.
Glucas,

Sembra essere la cosa più vicina che è incorporata kill-do-not-save-duplicates, che impedisce kill-newdi aggiungere la stessa cosa all'anello di uccisione due volte di seguito.
Glucas,

Risposte:


3

Ecco un approccio per affrontare le uccisioni in bianco (cioè solo gli spazi bianchi). Invece di filtrarli del tutto, ciò consentirà al massimo una voce vuota nel kill ring. Ogni nuova uccisione controllerà la testa dell'anello di uccisione e lo sostituirà se è vuoto.

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

Nota che sto usando il meccanismo di consulenza Emacs 24.4+ qui per filtrare gli argomenti che alla fine vengono passati kill-new.

L'effetto è che puoi ancora uccidere e strappare un sacco di spazi bianchi, ma se uccidi alcuni spazi bianchi e poi uccidi qualcos'altro, la voce degli spazi bianchi verrà scartata.


Se lo preferisci, puoi scegliere di non aggiungere l'istanza all'anello mortale. Questo approccio funziona per kill, kill-ring-saveecc. Se hai comandi che si aggiungono al kill ring senza chiamare kill-new, ovviamente non funzionerà.
Glucas,

Questo lo ha risolto per me. Penso di non usare alcun comando che si aggiunge a kill ring senza kill-new, o almeno non ho notato alcun comportamento strano.
Ignacy Moryc,

0

Un problema è che qualsiasi comando può modificare il kill-ringcosì l'unico gancio abbastanza potente per farlo è il post-command-hook. Questo è inefficiente, ma AFAIK è l'unico modo per farlo con rigore. Se questo suona bene per te, puoi farlo:

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

Per motivi di efficienza, presumo che tutti i comandi si aggiungano a kill-ring, questo è probabilmente sicuro, ma nota che una funzione può inserire del testo ovunque lo desideri kill-ring. Questo è raro, però, e sono sicuro che non vuoi iterare sull'intero kill ring ad ogni comando.


Un modo leggermente più efficace per farlo potrebbe essere quello di ripulire l'anello di uccisione proprio prima di strapparlo o sfogliarlo, tramite defadvice o i tuoi comandi.
Sacha Chua,

Ci ho pensato, ma poi avremmo bisogno di un elenco di tutti i comandi che accedono al kill-ring per strattonare. Se qualcuno può trovare un elenco, il resto sarebbe facile (ovviamente).
PythonNut,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.