Fügen Sie die Zwischenablage des Betriebssystems hinzu, um den Ring zu beenden

25

Oft kopiere ich einen Codeausschnitt aus dem Internet in die Zwischenablage meines Betriebssystems. Dann mache ich die folgenden einfachen Schritte:

  1. Wechseln Sie zu meinem Emacs-Fenster
  2. Suchen Sie die Stelle, an der der Code eingefügt werden soll
  3. Verwenden Sie C-y( yank), um den kopierten Text einzufügen.

Manchmal stelle ich jedoch (zu meiner großen Enttäuschung) fest, dass ich versehentlich einen Kill-Befehl (wie kill-wordoder kill-line) verwendet habe, während ich in Schritt 2 war. In solchen Fällen gelangt der kopierte Text aus der "Zwischenablage" niemals in den Kill Ring.

Kann ich sicherstellen, dass kopierter Text aus anderen Anwendungen immer in meinen Kill Ring gelangt?

Ich arbeite am häufigsten unter Linux, benutze aber auch regelmäßig Emacs unter Windows und Mac OS X, daher ist eine OS-unabhängige Antwort vorzuziehen.

Nispio
quelle
Darf ich diesen Link vorschlagen ? Wenn Sie die ganze Seite
durchblättern
@ Nsukami_ Danke. Ich werde versuchen, es zu verdauen, aber die verlinkte Seite ist ein gutes Beispiel dafür, warum ich es leid bin, bei EmacsWiki nach Antworten zu suchen. Viele der dortigen Elisp-Hacker scheinen zu glauben, dass Elisp-Code selbstdokumentierend ist und keine Kommentare und keine Erklärung zu Funktion oder Verwendung erfordert. Normalerweise habe ich keine Zeit, den Code rückzuentwickeln, um zu entscheiden, ob er das tut, was ich will oder nicht.
Nispio
haha, ich verstehe;)
Nsukami _

Antworten:

31

Sie müssen sich anpassen save-interprogram-paste-before-killan t. Dies wird Ihre Zwischenablage auf den Killring schieben, falls Sie etwas in Emacs töten, bevor Sie die Zwischenablage einfügen. Eine verwandte Anpassung ist, yank-pop-change-selectiondie Ihren aktuellen Ruck in Emacs in die Zwischenablage schiebt. Damit beide funktionieren, müssen Sie x-select-enable-clipboard(ersetzt durch gui-select-enable-clipboardin Emacs 25.1) tdie Standardeinstellung sein.

Dies ist standardmäßig deaktiviert, um zu verhindern, dass versehentlich große Datenmengen auf den Killring übertragen werden, der im Gegensatz zur Zwischenablage, die leicht ersetzt werden kann, während der gesamten Sitzung bestehen bleibt.

Vamsi
quelle
1
Noch sauberer und einfacher als ich erwartet hatte. save-interprogram-paste-before-killscheint genau das zu tun was ich will!
Nispio
Ich bin auf Emacs 26 und gui-select-enable-clipboardheißt eben select-enable-clipboard.
Rune Kaagaard
3

Eine andere Lösung ist, wenn möglich, nur das CLI-Tool zu verwenden.

  • pbcopy / pbpaste auf dem Mac

  • getclip / putclip auf Cygwin

  • xsel unter Linux
  • x-Zwischenablage in GUI Emacs (wie bereits erwähnt, müssen Sie das Flag x-select-enable-clipboard aktivieren).

Der Vorteil dieser Lösung ist, dass die Zwischenablage immer verwendbar ist (zum Beispiel, wenn Sie Remote-ssh verwenden).

Meine Antwort besteht aus zwei Teilen. teil eins stellt einige nützliche werkzeuge zum manipulieren der zwischenablage vor. Teil zwei beantwortet Ihre ursprüngliche Frage (Zwischenablage in Kill Ring speichern).

TEIL EINS

Füge den folgenden Code in deine ~ / .emacs ein:

(setq *is-a-mac* (eq system-type 'darwin))
(setq *cygwin* (eq system-type 'cygwin) )
(setq *linux* (or (eq system-type 'gnu/linux) (eq system-type 'linux)) )
(defun copy-to-x-clipboard ()
  (interactive)
  (if (region-active-p)
      (progn
        (cond
         ((and (display-graphic-p) x-select-enable-clipboard)
          (x-set-selection 'CLIPBOARD (buffer-substring (region-beginning) (region-end))))
         (t (shell-command-on-region (region-beginning) (region-end)
                                     (cond
                                      (*cygwin* "putclip")
                                      (*is-a-mac* "pbcopy")
                                      (*linux* "xsel -ib")))
            ))
        (message "Yanked region to clipboard!")
        (deactivate-mark))
        (message "No region active; can't yank to clipboard!")))

(defun paste-from-x-clipboard()
  (interactive)
  (cond
   ((and (display-graphic-p) x-select-enable-clipboard)
    (insert (x-selection 'CLIPBOARD)))
   (t (shell-command
       (cond
        (*cygwin* "getclip")
        (*is-a-mac* "pbpaste")
        (t "xsel -ob"))
       1))
   ))

(defun my/paste-in-minibuffer ()
  (local-set-key (kbd "M-y") 'paste-from-x-clipboard)
  )

(add-hook 'minibuffer-setup-hook 'my/paste-in-minibuffer)

ZWEITER TEIL

Füge den folgenden Code in deinen ~ / .emacs ein und benutze von nun an "Mx paste-from-clipboard-and-cc-kill-ring", um Folgendes einzufügen:

(defun paste-from-clipboard-and-cc-kill-ring ()
  "paste from clipboard and cc the content into kill ring"
  (interactive)
  (let (str)
    (with-temp-buffer
      (paste-from-x-clipboard)
      (setq str (buffer-string)))
    ;; finish the paste
    (insert str)
    ;; cc the content into kill ring at the same time
    (kill-new str)
    ))
chen bin
quelle