Comment filtrer le contenu du kill-ring?

9

Est-il possible d'empêcher kill-ringde stocker des espaces / lignes vides? En ce moment, après avoir fait quelques changements, puis browse-kill-ringje vais souvent voir quelque chose comme ça:

-------



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

-------

-------

Existe-t-il un moyen de forcer le kill-ring à n'ajouter que du contenu significatif?

Ignacy Moryc
la source
1
Pas une réponse, mais j'utilise helm-show-kill-ringet il semble filtrer les entrées vides de l'anneau de destruction. Je peux toujours tirer un tas d'espaces, alors +1 pour la question.
glucas
La chose la plus proche qui est intégrée semble être kill-do-not-save-duplicates, ce qui empêche kill-newd'ajouter la même chose à l'anneau de mise à mort deux fois de suite.
glucas

Réponses:

3

Voici une approche pour gérer les éliminations vides (c'est-à-dire uniquement les espaces blancs). Plutôt que de les filtrer complètement, cela permettra au plus une entrée vierge dans le kill ring. Chaque nouveau kill vérifiera la tête du kill-ring et le remplacera s'il est vide.

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

Notez que j'utilise ici le mécanisme de conseil Emacs 24.4+ pour filtrer les arguments qui finissent par être transmis kill-new.

L'effet est que vous pouvez toujours tuer et tirer un tas d'espaces blancs, mais si vous tuez des espaces blancs puis tuez autre chose, l'entrée des espaces blancs sera supprimée.

glucas
la source
Si vous préférez, vous pouvez choisir de ne pas l'ajouter au kill ring insteda. Cette approche fonctionne pour kill, kill-ring-saveetc. Si vous avez des commandes qui s'ajoutent au kill ring sans appeler, kill-newcela ne fonctionnera pas, bien sûr.
glucas
Celui-ci l'a résolu pour moi. Je pense que je n'utilise aucune commande qui ajoute à kill ring sans kill-new, ou du moins je n'ai remarqué aucun comportement bizarre.
Ignacy Moryc
0

Un problème est que toute commande peut modifier le kill-ringdonc le seul hook suffisamment puissant pour le faire est le post-command-hook. C'est inefficace, mais l'AFAIK est le seul moyen de le faire avec rigueur. Si cela vous convient, vous pouvez le faire:

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

Par souci d'efficacité, je suppose que toutes les commandes s'ajoutent à la kill-ring, c'est probablement sûr, mais notez qu'une fonction peut insérer du texte n'importe où dans le kill-ring. C'est rare, cependant, et je suis sûr que vous ne voulez pas parcourir tout le ring de destruction à chaque commande.

PythonNut
la source
Un moyen légèrement plus efficace de le faire pourrait être de nettoyer l'anneau de destruction juste avant de tirer dessus ou de le parcourir, soit par le biais de defadvice ou de vos propres commandes.
Sacha Chua
Je pensais à ce sujet, mais nous aurions alors besoin d'une liste de toutes les commandes qui accèdent au kill-ring pour tirer. Si quelqu'un peut établir une liste, le reste serait facile (bien sûr).
PythonNut