So kopieren Sie Text von Emacs in eine andere Anwendung unter Linux

113

Wenn ich Text in Emacs 22.1.1 ausschneide (töte) (in einem eigenen Fenster auf X, in KDE, auf Kubuntu), kann ich ihn in keiner anderen Anwendung einfügen (ziehen).

memius
quelle
Ich schlage vor, Sie lesen dies: CopyAndPaste-Emacs Wiki . Dies erklärt sehr gut das Tourproblem.
El Borito

Antworten:

122

Seien wir vorsichtig mit unseren Definitionen hier

  • Eine Emacs-Kopie ist der Befehl kill-ring-save(normalerweise gebunden an M-w).
  • Eine Systemkopie erhalten Sie normalerweise durch Drücken von C-c(oder durch Wählen von "Bearbeiten-> Kopieren" in einem Anwendungsfenster).
  • Eine X-Kopie hebt Text "physisch" mit dem Mauszeiger hervor.
  • Eine Emacs-Paste ist der Befehl yank(normalerweise gebunden an C-y).
  • Ein System-Paste ist das, was Sie normalerweise durch Drücken von C-v(oder Wählen von "Bearbeiten-Einfügen" in einem Anwendungsfenster) erhalten.
  • Eine X-Paste drückt die "mittlere Maustaste" (simuliert durch gleichzeitiges Drücken der linken und rechten Maustaste).

In meinem Fall (auf GNOME):

  • Sowohl Emacs als auch die Systemkopie funktionieren normalerweise mit X-Paste.
  • X-Kopie funktioniert normalerweise mit Emacs Paste.
  • Damit die Systemkopie mit Emacs Paste und die Emacs-Kopie mit System Paste funktioniert, müssen Sie sie (setq x-select-enable-clipboard t)zu Ihrer hinzufügen .emacs. Oder Versuche

    META-X set-variable RET x-select-enable-clipboard RET t

Ich denke, das ist ziemlich normales modernes Unix-Verhalten.

Es ist auch wichtig zu beachten (obwohl Sie sagen, dass Sie Emacs in einem separaten Fenster verwenden), dass Emacs, wenn es in einer Konsole ausgeführt wird, vollständig vom System und den X-Zwischenablagen getrennt ist: Das Ausschneiden und Einfügen wird in diesem Fall vom Terminal vermittelt . Beispielsweise sollte "Bearbeiten-> Einfügen" in Ihrem Terminalfenster genau so funktionieren, als hätten Sie den Text aus der Zwischenablage in den Emacs-Puffer eingegeben.

Chris Conway
quelle
7
Dies ist eine verwirrende Terminologie . Der standardmäßige und weniger verwirrende Name für das, was Sie als "X-Kopieren / Einfügen" bezeichnen, ist die X-Primärauswahl. Was Sie als "Systemkopieren / Einfügen" bezeichnen, ist die X-Zwischenablage.
Gilles 'SO - hör auf böse zu sein'
Danke ... sieht so aus, als ob die Variable seit dem Schreiben umbenannt wurde. META-X set-variable RET select-enable-clipboard RET toder(setq select-enable-clipboard t)
David McCorrie
95

Fügen Sie Folgendes in Ihre .emacsDatei ein:

(setq x-select-enable-clipboard t)
memius
quelle
3
Nicht wortreich, sagt dir, was du wissen musst. Hervorragende Antwort.
JasonFruit
Funktioniert perfekt, ich benutze Ubuntu 12.04. Vielen Dank
Zhihong
7
Schön und einfach, aber das funktioniert im Terminal nicht. Es gibt keinen Grund, warum dieselbe Verknüpfung nicht sowohl im Terminal als auch in einem freien Fenster funktionieren sollte, und einige der folgenden Antworten sprechen beide gleichzeitig an.
RussellStewart
1
Beim Ausführen verwende emacs -nwich die Verknüpfungen des Terminals. Umschalt-Strg-X zum Ausschneiden (Töten) von Text und Umschalt-Strg-C zum Kopieren.
Memius
4
Das wird nicht funktionieren, wenn Sie emacs -nwin horizontal geteilten tmux-Fenstern laufen.
Sridhar Ratnakumar
11

Ich stecke das in meine .emacs:

(setq x-select-enable-clipboard t)
(setq interprogram-paste-function 'x-cut-buffer-or-selection-value)

Ich habe anschließend im Grunde keine Probleme, von irgendetwas in Emacs zu einer anderen X11- oder Gnome-Anwendung hin und her zu schneiden und einzufügen.

Bonus: Um diese Dinge in Emacs zu erreichen, ohne dass Sie Ihre gesamten .emacs neu laden müssen, führen Sie Cx Ce mit dem Cursor direkt nach dem Schließen jedes dieser Ausdrücke im .emacs-Puffer aus.

Viel Glück!

jfm3
quelle
3
Diese Lösung funktioniert für Emacs in einem X-Fenster, dh Emacs wird in einem Fenster ausgeführt, wenn Sie Emacs in der Befehlszeile ausführen.
elviejo79
Symbol’s function definition is void: x-cut-buffer-or-selection-value
Alper
10

Die Schwierigkeit beim Kopieren und Einfügen in Emacs besteht darin, dass es unabhängig vom internen Kill / Yank funktionieren soll und dass es sowohl im Terminal als auch in der GUI funktionieren soll. Es gibt robuste Lösungen für Terminal oder GUI, aber nicht für beide. Nach der Installation von xsel (z. B. sudo apt-get install xsel) mache ich Folgendes zum Kopieren und Einfügen, um sie zu kombinieren:

(defun copy-to-clipboard ()
  (interactive)
  (if (display-graphic-p)
      (progn
        (message "Yanked region to x-clipboard!")
        (call-interactively 'clipboard-kill-ring-save)
        )
    (if (region-active-p)
        (progn
          (shell-command-on-region (region-beginning) (region-end) "xsel -i -b")
          (message "Yanked region to clipboard!")
          (deactivate-mark))
      (message "No region active; can't yank to clipboard!")))
  )

(defun paste-from-clipboard ()
  (interactive)
  (if (display-graphic-p)
      (progn
        (clipboard-yank)
        (message "graphics active")
        )
    (insert (shell-command-to-string "xsel -o -b"))
    )
  )

(global-set-key [f8] 'copy-to-clipboard)
(global-set-key [f9] 'paste-from-clipboard)
RussellStewart
quelle
Denn ich erhalte eine Fehlermeldung, weil es keine Parameter gibt. Ich muss die erste Zeile "(Kopie in Zwischenablage deaktivieren ()" in "(Kopie von Ubuntu deaktivieren (Text & optionaler Push)" ändern. Dies funktioniert für mich: D
Renato Cassino
Es funktioniert, aber der Einfügevorgang ist ziemlich langsam. Könnte er auf das Netzwerk übertragen werden?
Alper
7

Ich gehe davon aus, dass Sie mit Emacs Emacs unter X meinen (dh nicht innerhalb eines Terminalfensters).

Es gibt zwei Möglichkeiten:

  1. (Gilt nur für Unix-Betriebssysteme.) Markieren Sie den gewünschten Text mit der Maus (dies kopiert ihn in die X-Zwischenablage) und klicken Sie dann mit der mittleren Maustaste, um ihn einzufügen.
  2. Markieren Sie den gewünschten Text und dann "Mx Zwischenablage-Kill-Ring-Speichern" (beachten Sie, dass Sie dies an eine einfachere Taste binden können). Dann einfach "Bearbeiten-> Einfügen" in Ihrer Lieblings-App.

Zwischenablage verfügbar:

  • Zwischenablage-Kill-Ring-Speichern - Kopieren Sie die Auswahl von Emacs in die Zwischenablage
  • Zwischenablage-Kill-Region - Auswahl von Emacs in Zwischenablage schneiden
  • Zwischenablage-Ruck - Einfügen aus der Zwischenablage in Emacs
pdq
quelle
7

Es gibt einen EmacsWiki-Artikel , in dem einige Probleme beim Kopieren und Einfügen unter X sowie die Konfiguration für die Funktionsweise erläutert werden.

cschol
quelle
Es gibt einen Emacs-Wiki-Eintrag zum Kopieren und Einfügen. So schlimm ist das.
Nicole
4

Dies funktioniert unter M-wMac OSX. Fügen Sie einfach Ihre .emacs- Datei hinzu.

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

Quelle https://gist.github.com/the-kenny/267162

Cevaris
quelle
1

Der Code unten, inspiriert von @ RussellStewart Antwort oben, fügt Unterstützung für x-PRIMARY und x-NEBEN, ersetzt region-active-pmit use-region-pdem Fall einer leeren Region zu decken, nicht stillschweigend zurückkehrt , wenn xsel hat nicht installiert wurde (gibt eine Fehlermeldung), und enthält eine "Schnitt" -Funktion (Emacs Cy, Windows Cx).

(defun my-copy-to-xclipboard(arg)
  (interactive "P")
  (cond
    ((not (use-region-p))
      (message "Nothing to yank to X-clipboard"))
    ((and (not (display-graphic-p))
         (/= 0 (shell-command-on-region
                 (region-beginning) (region-end) "xsel -i -b")))
      (error "Is program `xsel' installed?"))
    (t
      (when (display-graphic-p)
        (call-interactively 'clipboard-kill-ring-save))
      (message "Yanked region to X-clipboard")
      (when arg
        (kill-region  (region-beginning) (region-end)))
      (deactivate-mark))))

(defun my-cut-to-xclipboard()
  (interactive)
  (my-copy-to-xclipboard t))

(defun my-paste-from-xclipboard()
  "Uses shell command `xsel -o' to paste from x-clipboard. With
one prefix arg, pastes from X-PRIMARY, and with two prefix args,
pastes from X-SECONDARY."
  (interactive)
  (if (display-graphic-p)
    (clipboard-yank)
   (let*
     ((opt (prefix-numeric-value current-prefix-arg))
      (opt (cond
       ((=  1 opt) "b")
       ((=  4 opt) "p")
       ((= 16 opt) "s"))))
    (insert (shell-command-to-string (concat "xsel -o -" opt))))))

(global-set-key (kbd "C-c C-w") 'my-cut-to-xclipboard)
(global-set-key (kbd "C-c M-w") 'my-copy-to-xclipboard)
(global-set-key (kbd "C-c C-y") 'my-paste-from-xclipboard)
user1404316
quelle
Gibt es Gründe, die Standard-Tastenkombinationen nicht zu überschreiben?
Paul Brodersen
@Paul: Die 'Standard-Tastenkombinationen' gelten für die 'emacs-interne Zwischenablage', die sich von der X-Zwischenablage unterscheidet. Ich habe den Begriff "Emacs interne Zwischenablage" zitiert, weil die Emacs-Terminologie anders ist - siehe Chris Conways ausgezeichnete Erklärung oben.
user1404316
1

Ich verwende das Folgende, basierend auf den anderen Antworten hier, um es auf Mac und Linux zu erstellen C-x C-wund C-x C-yzu kopieren und einzufügen (wenn jemand die Version für Windows kennt, kann er sie gerne hinzufügen). Beachten Sie, dass Sie unter Linux xsel und xclip mit Ihrem Paketmanager installieren müssen.

;; Commands to interact with the clipboard

(defun osx-copy (beg end)
  (interactive "r")
  (call-process-region beg end  "pbcopy"))

(defun osx-paste ()
  (interactive)
  (if (region-active-p) (delete-region (region-beginning) (region-end)) nil)
  (call-process "pbpaste" nil t nil))

(defun linux-copy (beg end)
  (interactive "r")
  (call-process-region beg end  "xclip" nil nil nil "-selection" "c"))

(defun linux-paste ()
  (interactive)
  (if (region-active-p) (delete-region (region-beginning) (region-end)) nil)
  (call-process "xsel" nil t nil "-b"))

(cond
 ((string-equal system-type "darwin") ; Mac OS X
  (define-key global-map (kbd "C-x C-w") 'osx-copy)
  (define-key global-map (kbd "C-x C-y") 'osx-paste))
 ((string-equal system-type "gnu/linux") ; linux
  (define-key global-map (kbd "C-x C-w") 'linux-copy)
  (define-key global-map (kbd "C-x C-y") 'linux-paste)))
asmeurer
quelle
1
Tatsächlich können Sie xclipden Inhalt der Zwischenablage auch mit verwenden xclip -o. Dies kann für Benutzer nützlich sein, die bereits ein xclipanderes Programm installiert haben und nicht installieren möchten, um sowohl das Kopieren als auch das Einfügen durchzuführen.
Amin NAIRI
0

Hmm, welche Plattform und welche Version von Emacs verwenden Sie? Mit GNU Emacs 22.1.1 unter Windows Vista funktioniert es gut für mich.

Wenn Sie dies zufällig über einen RealVNC-Viewer von Windows zu Linux tun, stellen Sie sicher, dass Sie zuerst "vncconfig -iconic" auf der Linux-Box ausführen .....

kfh
quelle
0

Ich benutze immer die Option zum schnellen Einfügen - Ziehen in Emacs, drücke die mittlere Maustaste im Zielfenster.

(Aus dem Verweis auf Kate gehe ich davon aus, dass Sie unter Linux oder ähnlichem arbeiten und wahrscheinlich Emacs in X auf die eine oder andere Weise verwenden.)

Cannam
quelle
0

Möglicherweise möchten Sie angeben, welche Plattform Sie verwenden. Ist es unter Linux, Unix, Macosx, Windows, MS-Dos?

Ich glaube, dass es für Windows funktionieren sollte. Für MacOSX wird es zur x-windows-Zwischenablage hinzugefügt, was nicht mit der macosx-Zwischenablage identisch ist. Für Linux hängt es von Ihrer Art des Fenstermanagers ab, aber ich glaube, dass x-windows bei den meisten von ihnen auf nette Weise damit umgeht.

Also bitte angeben.

Mats Fredriksson
quelle
-1

Ich verwende ein gutes Terminal-Tool (PuTTY unter Windows, Konsole oder Terminal unter Linux) mit integrierten Kopierfunktionen.

In PuTTY markieren Sie den gewünschten Text mit der Maus und fügen ihn an einer anderen Stelle ein. Durch Klicken mit der rechten Maustaste in ein PuTTY-Fenster wird der Inhalt des Windows-Kopier- / Einfügepuffers eingefügt.

In Konsole oder Terminal unter Linux markieren Sie, was Sie möchten, und drücken dann Umschalt + Strg + C zum Kopieren und Umschalt + Strg + V zum Einfügen.

In der Win32-Kompilierung von Emacs wird sie durch Ziehen an Text meistens in den Kopier- / Einfügepuffer gestellt.

Unter Mac OS X funktionieren die Apple-Key-Chortcuts einwandfrei, da sie vom Terminal abgefangen werden.

Es gibt keine direkte Möglichkeit, dies in der Befehlszeile zu tun, da die Shell nicht für jede Anwendung einen Kopier- / Einfügepuffer verwaltet. bash macht eine Kopie halten / paste für sich Puffer und standardmäßig emacs ^ k / ^ y Verknüpfungen Arbeit.

Labyrinth
quelle