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?


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.


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.