Wie filtere ich Kill-Ring-Inhalte?

9

Ist es möglich zu verhindern, dass kill-ringLeerzeichen / Leerzeilen gespeichert werden? Gerade jetzt, nachdem ich ein paar Änderungen vorgenommen und dann zu gegangen browse-kill-ringbin, sehe ich oft so etwas:

-------



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

-------

-------

Gibt es eine Möglichkeit, Kill-Ring zu zwingen, nur sinnvolle Inhalte anzuhängen?

Ignacy Moryc
quelle
1
Keine Antwort, aber ich benutze helm-show-kill-ringund es scheint leere Kill-Ring-Einträge herauszufiltern. Ich kann immer noch ein paar Leerzeichen ziehen, also +1 für die Frage.
Glucas
Das nächste, was eingebaut ist, scheint zu sein kill-do-not-save-duplicates, das verhindert, dass kill-newzweimal hintereinander dasselbe zum Kill Ring hinzugefügt wird.
Glucas

Antworten:

3

Hier ist ein Ansatz für den Umgang mit leeren (dh nur Leerzeichen) Kills. Anstatt sie vollständig herauszufiltern, wird höchstens ein leerer Eintrag im Kill Ring zugelassen. Jeder neue Kill überprüft den Kopf des Kill-Rings und ersetzt ihn, wenn er leer ist.

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

Beachten Sie, dass ich hier den Emacs 24.4+ -Ratgebermechanismus verwende, um die Argumente zu filtern, an die schließlich übergeben wird kill-new.

Der Effekt ist, dass Sie immer noch eine Reihe von Leerzeichen töten und ziehen können. Wenn Sie jedoch einige Leerzeichen töten und dann etwas anderes töten, wird der Leerzeicheneintrag verworfen.

Glucas
quelle
Wenn Sie möchten, können Sie den Kill Ring Insteda nicht hinzufügen. Dieser Ansatz funktioniert für kill, kill-ring-saveusw. Wenn Sie Befehle, die ohne Aufruf zum Kill - Ring hinzufügt kill-newdann wird es nicht funktionieren, natürlich.
Glucas
Dieser hat es für mich gelöst. Ich glaube, ich benutze keine Befehle, die dazu beitragen, Ring ohne Kill-New zu töten, oder zumindest habe ich kein seltsames Verhalten bemerkt.
Ignacy Moryc
0

Ein Problem ist, dass jeder Befehl das ändern kann, kill-ringso dass der einzige Haken, der dazu mächtig genug ist, der ist post-command-hook. Dies ist ineffizient, aber AFAIK ist der einzige Weg, dies mit Strenge zu tun. Wenn das für Sie gut klingt, können Sie dies tun:

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

Aus Gründen der Effizienz gehe ich davon aus, dass alle Befehle an das angehängt kill-ringwerden. Dies ist wahrscheinlich sicher. Beachten Sie jedoch, dass eine Funktion Text an einer beliebigen Stelle in das Feld einfügen kann kill-ring. Dies ist jedoch selten und ich bin sicher, dass Sie nicht bei jedem Befehl den gesamten Kill-Ring durchlaufen möchten.

PythonNut
quelle
Ein etwas effizienterer Weg, dies zu tun, könnte darin bestehen, den Kill-Ring unmittelbar vor dem Ziehen oder Durchsuchen zu bereinigen, entweder durch defadvice oder durch Ihre eigenen Befehle.
Sacha Chua
Ich habe darüber nachgedacht, aber dann brauchen wir eine Liste aller Befehle, die zum Ziehen auf den Kill-Ring zugreifen. Wenn jemand eine Liste erstellen kann, ist der Rest (natürlich) einfach.
PythonNut