Wie kann ich Systemzwischenablagen verschieben, um Ringinhalte in Echtzeit zu löschen, wenn ich außerhalb von Emacs kopiere?

8

Ich bemerkte, dass, wenn ich etwas außerhalb von Emacs kopiere, das Ding den Ring nicht sofort zu töten scheint, außer ich ziehe es an Emacs. Wenn ich zweimal kopiere, kann nur die letzte Kopie per Ruck erhalten werden.

Manchmal möchte ich die Kopien aus den System-Zwischenablagen verschieben, um den Ring zu beenden, sobald ich die Kopie erstellt habe. Danach kann ich auswählen, was ich im Kill Ring brauche, um Emacs einzufügen. Wie kann ich also erreichen, dass die Kopien viele Male in den Kill Ring geschoben werden können?

Ich bin auf Windows 7.

Leu_Grady
quelle

Antworten:

5

TL; DR: Sie können clipmonauf MELPA verfügbar verwenden und aktivieren clipmon-mode.

Hinweis: Die folgenden Details gelten für X-Server, das Paket sollte jedoch auf jeder Plattform funktionieren.

Wie funktioniert die Zwischenablage? Die Zwischenablage wird als asynchroner Prozess implementiert. Wenn Sie aus einer Anwendung kopieren, wird diese zum "Eigentümer der Zwischenablage", legt die kopierten Daten jedoch nirgendwo ab. Wenn Sie in eine Anwendung einfügen, werden die Daten vom aktuellen "Eigentümer der Zwischenablage" angefordert.

Referenz: http://www.jwz.org/doc/x-cut-and-paste.html

So erhalten Sie den Inhalt der Zwischenablage Nach meinem Verständnis besteht die "zuverlässige" Methode, um festzustellen, ob neue Daten in der Zwischenablage vorhanden sind, darin, den X-Server regelmäßig abzufragen, um zu überprüfen, was sich dort befindet. Für Emacs erledigt das Paket clipmon ( https://github.com/bburns/clipmon ) dies. Standardmäßig alle zwei Sekunden.

Auszug aus der README:

Außerdem werden Änderungen an der System-Zwischenablage zum Kill-Ring hinzugefügt, sodass Emacs zu einem Zwischenablage-Manager für Text wird. Anschließend können Sie mit einem Paket wie Browse-Kill-Ring oder Helm-Ring den Verlauf Ihrer Zwischenablage anzeigen und verwalten.

(Bitte beachten Sie, dass ich dieses Paket nicht ausprobiert habe, aber es sieht auf jeden Fall nach einer Lösung aus.)

Junger Frosch
quelle
3

Ich bin nicht sicher, ob es möglich ist, dass kopierter Text sofort nach dem Kopieren in Ihrem Kill-Ring angezeigt wird, es sei denn, es gibt eine Möglichkeit, einen Hook-on-Copy auszuführen. Dies würde natürlich von Ihrem Betriebssystem / Ihrer Umgebung abhängen, aber ich wollte erwähnen, dass Sie möglicherweise versuchen möchten, Einstellungen vorzunehmen

(setq save-interprogram-paste-before-kill t)

Dadurch wird zumindest kopierter Text aus dem Betriebssystem beibehalten, wenn etwas aus Emacs kopiert wird.


Von C-h v save-interprogram-paste-before-kill:

Speichern Sie die Zeichenfolgen der Zwischenablage im Kill Ring, bevor Sie sie ersetzen.

Wenn einer etwas in einem anderen Programm auswählt, um es in Emacs einzufügen, aber etwas in Emacs beendet, bevor er es tatsächlich einfügt, ist diese Auswahl weg, es sei denn, diese Variable ist nicht null. In diesem Fall wird die Auswahl des anderen Programms kill-ring vor dem Beenden des Emacs gespeichert und man kann es immer noch mit einfügen C-y M-y.

imalison
quelle
Ja, diese Variable kann genau das tun, was Sie gesagt haben. Aber ich frage nicht nur danach, ich möchte, dass der Kill Ring eine Kopie außerhalb von Emacs speichern kann, sobald ich sie kopiert habe.
Leu_Grady
2

Schließlich fand ich eine ungeschickte Lösung, die sich auf das Konzept von bezog clipmon. Aber sehr einfach mit dem Code einer Zeile:

(run-at-time 0 3 (lambda () (interactive) (current-kill 0)))

Der Kill Ring wird alle 3 Sekunden mit der Systemzwischenablage synchronisiert. Natürlich können Sie das Intervall auf einen noch kleineren Wert ändern.

PS: Der Grund, warum ich diese Funktionalität benötige, ist, dass ich einen Befehl definieren möchte, der mit Argumenten aufgerufen werden kann, die ich extern kopiert habe.

Vielen Dank für die Antworten von @kaushalmodi und @YoungFrog.

Leu_Grady
quelle