Kopieren Sie Text von Emacs in die OS X-Zwischenablage


25

Wenn ich Emacs in einem Textterminal anstelle des normalen GUI-Modus ausführe, kann ich in Emacs kopieren, indem ich den Start einer Region mit aktiviere C-SPCund dann auswähle, was ich will, und dann mache M-w.

Gibt es eine Möglichkeit, eine Region auf diese Weise kopieren zu lassen, die in der OSX-Zwischenablage verfügbar ist, um sie beispielsweise in eine Webseite einzufügen (außer natürlich, indem Emacs im GUI-Modus ausgeführt wird)?

Ich bin nicht daran interessiert, eine andere Verknüpfung zu erstellen, und im Idealfall sollten keine Module installiert werden.

Ich habe diesen Beitrag gesehen und die akzeptierte Antwort ausprobiert, aber es scheint nicht so zu funktionieren, wie ich es oben erwarte.

Irgendwelche anderen Ideen?


Alter, die Frage ist fast 3 Jahre alt und wurde beantwortet
Galder Zamarreño

Antworten:


33

Kopieren von Emacs in die OS X-Zwischenablage:

Wählen Sie dann die Region aus M-| pbcopy RET

Einfügen aus der OS X-Zwischenablage in Emacs:

C-u M-| pbpaste RET (ersetzt die aktuelle Region, falls vorhanden)


Erläuterung:

M-|Läuft shell-command-on-region, was, wie der Name schon sagt, bedeutet, dass die aktuelle Region an einen Shell-Befehl weitergeleitet wird. C-u M-|tut dasselbe, ersetzt jedoch die aktuelle Region durch die stdoutdes ausgeführten Befehls.

pbcopyund pbpastesind OS X-Dienstprogramme für den Zugriff auf die Systemzwischenablage.


1
Neben der Beantwortung der Frage hat mich Ihre Antwort gelehrt, wie man Shell-Befehle von Emacs, Amazing, ausführt.
Andreskwan

20

Das Folgende funktioniert einfach, kopiert von hier

(defun copy-from-osx ()
  (shell-command-to-string "pbpaste"))

(defun paste-to-osx (text &optional push)
  (let ((process-connection-type nil))
    (let ((proc (start-process "pbcopy" "*Messages*" "pbcopy")))
      (process-send-string proc text)
      (process-send-eof proc))))

(setq interprogram-cut-function 'paste-to-osx)
(setq interprogram-paste-function 'copy-from-osx)

Die Aussprache hier scheint rückwärts
Jordon Biondo

1
Im bösen Modus wird das vimish-Einfügeverhalten aufgehoben
Felix D.

@FelixD .: xclip-modeleidet das gleiche Problem?
Stefan

Dies scheint in Emacs26 beim Kopieren und Einfügen von Multibyte-Zeichen nicht zu funktionieren
silencej

9

Wenn Sie Emacs "auf die normale Weise" (dh als GUI-Anwendung) verwenden, sollte dies standardmäßig bereits geschehen. Wenn Sie Emacs in einem Terminal-Emulator verwenden, weiß es zwar nicht, wie das standardmäßig gemacht wird, aber Sie können das xclipPaket von GNU ELPA installieren und dann das aktivieren, xclip-modedas Emacs beibringt, wie das sowohl für GNU / Linux als auch für Linux gemacht wird OSX.


Funktioniert xclipmit OSX? Nach dem,
Galder Zamarreño,

1
Das xclip.elPaket wurde erweitert, um zu verwenden pbpaste.
Stefan

Terminal-Emacs im Servermodus (nicht als reguläre Instanz) frieren ein, wenn ich aus irgendeinem Grund xclip unter macOS verwende.
Rien333

Könnten Sie es als Fehler melden (entweder direkt an mich oder über M-x report-emacs-bug?
Stefan

3

Wie Stefan sagte, sollten die grafischen Emacs-Anwendungen dies standardmäßig tun.

In einem Textterminal können Sie auch Funktionen wie die folgenden verwenden:

(defun pbcopy ()
  (interactive)
  (let ((deactivate-mark t))
    (call-process-region (point) (mark) "pbcopy")))

(defun pbpaste ()
  (interactive)
  (call-process-region (point) (if mark-active (mark) (point)) "pbpaste" t t))

(defun pbcut ()
  (interactive)
  (pbcopy)
  (delete-region (region-beginning) (region-end)))

außer wenn es nicht der Fall ist. 20 Jahre später dasselbe Bild in Emacs ... Ich wünschte wirklich, es gäbe einen gemeinsamen und gesunden Boden, der irgendwo in Stein gemeißelt wäre
Nicolas,

1

Hier ist eine einfache Elisp-Funktion, die Sie in Ihre .emacs-Datei einfügen können, um den Inhalt des Puffers, in dem Sie sich befinden, in die Zwischenablage zu kopieren. Sie müssen nichts auswählen, es kopiert alles. Der Code ist kurz und ziemlich selbsterklärend.

(defun xclip ()
(interactive)
(shell-command (concat "cat " (buffer-file-name (window-buffer (minibuffer-selected-window))) " | pbcopy")))

Nachdem Sie Emacs geladen oder neu geladen haben, rufen Sie es mit Mx xclip auf.
jumar

Das OP hat nicht darum gebeten, den gesamten Puffer in die Zwischenablage zu kopieren. Im Übrigen scheint dies nur das zu wiederholen, was andere bereits gesagt haben.
Stefan

Ich entschuldige mich, wenn dies nicht zum Thema gehört. Ich bin von Google zu dieser Seite navigiert, wo es das erste Ergebnis für "Text in Emacs der Zwischenablage kopieren" war. Die Frage trägt den Titel "Text aus Emacs in die Zwischenablage von OS X kopieren", sodass Sie leicht sehen können, wie Sie zu diesem Suchergebnis gelangen. Ich denke, es ist auf die Art und Weise anwendbar, wie die Phrasen ihre Frage stellen, eine Obermenge davon. Ich habe StackExchange-Antworten bereits besucht und war frustriert, als eine einfache Antwort nicht verfügbar war, insbesondere, als ich wusste, dass Tausende von Menschen die Frage stellten, und dachte, ich würde meine für diejenigen hinzufügen, die davon profitieren könnten.
jumar

0

Check out clipboard-kill-regionund clipboard-yank. Diese kommen aus menu-bar.el.

Sobald eine Region markiert ist, können Sie mit Clipboard-Kill-Region die Region sowohl in Ihrem Einfügepuffer als auch in der System-Zwischenablage löschen. clipboard-yank "fügt" ein, was sich gerade in der Zwischenablage des Systems befindet.


Bitte erweitern Sie Ihre Antwort.
Dan

Ich habe versucht, mit diesen Befehlen etwas von Emacs zu kopieren, und war extern nicht verfügbar, um es an eine andere Stelle außerhalb von Emacs zu kopieren.
Galder Zamarreño

@ GalderZamarreño es funktioniert bei mir in Emacs und ich bin auf OSX.
Bitops

0

Die Antwort von Galder Zamarreño ist großartig, sie bricht jedoch das böse putVerhalten im bösen Modus. Ich habe es daher weiter unten etwas angepasst - ich bin sicher, es könnte besser sein, aber es macht den Job für mich. Fühlen Sie sich frei, Verbesserungen vorzuschlagen:

(defun copy-from-osx ()
  (shell-command-to-string "pbpaste"))

(defun paste-to-osx (text &optional push)
  (let ((process-connection-type nil))
    (let ((proc (start-process "pbcopy" "*Messages*" "pbcopy")))
      (process-send-string proc text)
      (process-send-eof proc))))

----> Neuer Code

  (defun clipboard-on ()
    (interactive)
    (setq interprogram-cut-function 'paste-to-osx)
    (setq interprogram-paste-function 'copy-from-osx))
  (defun clipboard-off ()
    (interactive)
    (setq interprogram-cut-function 'gui-select-text)
    (setq interprogram-paste-function 'gui-selection-value))
  (global-set-key (kbd "C-c C-p") 'clipboard-on)
  (global-set-key (kbd "C-c C-y") 'clipboard-off))
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.