Come copiare testo da Emacs a un'altra applicazione su Linux


113

Quando taglio (uccido) il testo in Emacs 22.1.1 (nella sua finestra su X, in KDE, su Kubuntu), non posso incollarlo (estrarlo) in nessun'altra applicazione.


Ti suggerisco di leggere questo: CopyAndPaste-Emacs Wiki . Questo spiega molto bene il problema del tour.
El borito

Risposte:


122

Stiamo attenti con le nostre definizioni qui

  • Una copia di Emacs è il comando kill-ring-save(solitamente associato a M-w).
  • Una copia di sistema è ciò che di solito ottieni premendo C-c(o scegliendo "Modifica-> Copia" in una finestra dell'applicazione).
  • Una copia X evidenzia "fisicamente" il testo con il cursore del mouse.
  • Un incolla di Emacs è il comando yank(solitamente associato a C-y).
  • Un incolla di sistema è ciò che di solito ottieni premendo C-v(o scegliendo "Modifica-Incolla" in una finestra dell'applicazione).
  • Una X incolla sta premendo il "pulsante centrale del mouse" (simulato premendo i pulsanti sinistro e destro del mouse insieme).

Nel mio caso (su GNOME):

  • Sia Emacs che la copia di sistema di solito funzionano con X paste.
  • La copia X di solito funziona con Emacs paste.
  • Per fare in modo che la copia di sistema funzioni con Emacs paste e la copia di Emacs funzioni con incolla di sistema, è necessario aggiungere (setq x-select-enable-clipboard t)al file .emacs. Oppure prova

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

Penso che questo sia un comportamento Unix moderno piuttosto standard.

È anche importante notare (anche se dici che stai usando Emacs in una finestra separata) che quando Emacs è in esecuzione su una console, è completamente separato dal sistema e dagli appunti X: taglia e incolla in questo caso è mediato dal terminale . Ad esempio, "Modifica-> Incolla" nella finestra del tuo terminale dovrebbe agire esattamente come se avessi digitato il testo dagli appunti nel buffer di Emacs.


7
Questa è una terminologia confusa . Il nome standard e meno confuso per ciò che chiamate "X copia / incolla" è la selezione primaria X. Quello che chiami "copia / incolla di sistema" sono gli appunti X.
Gilles 'SO- smettila di essere malvagio'

Grazie ... sembra che la variabile sia stata rinominata da quando è stata scritta. META-X set-variable RET select-enable-clipboard RET toppure(setq select-enable-clipboard t)
David McCorrie,

95

Inserisci quanto segue nel tuo .emacsfile:

(setq x-select-enable-clipboard t)

3
Non prolisso, ti dice quello che devi sapere. Ottima risposta.
JasonFruit

Funziona perfettamente, uso Ubuntu 12.04. Grazie
zhihong

7
Bello e semplice, ma non funziona nel terminale. Non c'è motivo per cui la stessa scorciatoia non dovrebbe funzionare sia nel terminale che in una finestra libera, e alcune delle risposte seguenti riguardano entrambe contemporaneamente.
RussellStewart

1
Quando corro emacs -nw, utilizzo le scorciatoie del terminale; Maiusc-Ctrl-X per tagliare (uccidere) il testo e Maiusc-Ctrl-C per copiare.
memius

4
Non funzionerà quando corri emacs -nwall'interno di finestre tmux divise orizzontalmente.
Sridhar Ratnakumar

11

Lo infilo nel mio .emacs:

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

Successivamente non ho praticamente problemi a tagliare e incollare avanti e indietro da qualsiasi cosa in Emacs a qualsiasi altra applicazione X11 o Gnome.

Bonus: per fare in modo che queste cose avvengano in Emacs senza dover ricaricare l'intero .emacs, fai Cx Ce con il cursore subito dopo la parentesi chiusa di ciascuna di quelle espressioni nel buffer .emacs.

In bocca al lupo!


3
Questa soluzione funziona per emacs in una finestra X cioè Emacs è in esecuzione all'interno di una finestra se si esegue emacs nella riga di comando che cosa avete bisogno è: stackoverflow.com/questions/5288213/...
elviejo79

Symbol’s function definition is void: x-cut-buffer-or-selection-value
alper

10

La difficoltà con copia e incolla in Emacs è che vuoi che funzioni indipendentemente dal kill / yank interno, e vuoi che funzioni sia nel terminale che nella gui. Esistono solide soluzioni per terminale o interfaccia grafica, ma non per entrambi. Dopo aver installato xsel (ad esempio sudo apt-get install xsel), ecco cosa faccio per copiare e incollare per combinarli:

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

Perché ricevo un errore perché non ci sono parametri. Devo cambiare la prima riga "(defun copy-to-clipboard ()" in "(defun copy-from-ubuntu (text & optional push)". Questo funziona per me: D
Renato Cassino

Funziona ma l'operazione di incolla è piuttosto lenta, potrebbe essere collegata alla rete?
alper

7

Presumo che per emacs tu intenda Emacs sotto X (cioè non all'interno di una finestra di terminale).

Ci sono due modi:

  1. (Si applica solo ai sistemi operativi unix) Evidenzia il testo desiderato con il mouse (questo lo copia negli appunti X) e quindi fai clic con il pulsante centrale per incollarlo.
  2. Evidenzia il testo desiderato e poi "Mx clipboard-kill-ring-save" (nota che puoi associarlo a un tasto più semplice). Quindi basta "Modifica-> Incolla" nella tua app preferita.

Operazioni disponibili negli appunti:

  • clipboard-kill-ring-save - copia la selezione da Emacs negli appunti
  • clipboard-kill-region - taglia la selezione da Emacs negli appunti
  • clipboard-yank - incolla dagli appunti a Emacs

7

C'è un articolo EmacsWiki che spiega alcuni problemi con copia e incolla sotto X e come configurarlo per funzionare.


C'è una voce wiki di emacs da copiare e incollare. Ecco quanto è brutto.
nicolas

4

Funziona con M-wsu Mac OSX. Basta aggiungere al tuo file .emacs .

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

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


1

Il codice seguente, ispirato alla risposta di @ RussellStewart sopra, aggiunge il supporto per x-PRIMARY e x-SECONDARY, sostituisce region-active-pcon use-region-pper coprire il caso di una regione vuota, non ritorna silenziosamente se xsel non è stato installato (restituisce un messaggio di errore), e include una funzione "cut" (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)

Ci sono motivi per non sovrascrivere le associazioni di tasti standard?
Paul Brodersen

@Paul: Le 'combinazioni di tasti standard' sono per gli 'appunti interni di emacs', che sono diversi dagli X-clipboard. Ho citato il termine "appunti interni di emacs" perché la terminologia di emacs è diversa - fare riferimento all'eccellente spiegazione di Chris Conway, sopra.
user1404316

1

Uso quanto segue, in base alle altre risposte qui, per fare C-x C-wed C-x C-yessere copia e incolla sia su Mac che su Linux (se qualcuno conosce la versione per Windows, sentiti libero di aggiungerla). Nota che su Linux dovrai installare xsel e xclip con il tuo gestore di pacchetti.

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

1
In realtà, puoi usare anche xclipper incollare il contenuto degli appunti usando xclip -o. Questo può essere utile per le persone che hanno già xclipe non vogliono installare un altro programma per fare sia la copia che l'incolla.
Amin NAIRI,

0

Hmm, quale piattaforma e quale versione di emacs stai usando? Con GNU Emacs 22.1.1 su Windows Vista, funziona bene per me.

Se, per caso, lo stai facendo da Windows a Linux tramite un visualizzatore RealVNC, assicurati di eseguire prima "vncconfig -iconic" sulla macchina Linux .....


0

Uso sempre l'incolla rapida: trascina la selezione in emacs, premi il pulsante centrale del mouse nella finestra di destinazione.

(Dal riferimento a Kate, presumo che tu sia su Linux o simili e probabilmente usi emacs in X in un modo o nell'altro.)


0

Potresti voler specificare quale piattaforma stai utilizzando. È su linux, unix, macosx, windows, ms-dos?

Credo che per Windows dovrebbe funzionare. Per MacOSX verrà aggiunto agli appunti di x-windows, che non è la stessa cosa degli appunti di macosx. Per Linux, dipende dal tipo di window manager, ma credo che x-windows lo gestisca in modo carino sulla maggior parte di essi.

Quindi, per favore specifica.


-1

Quello che faccio è utilizzare un buon strumento di terminale (PuTTY su Windows, Konsole o Terminal su Linux) con funzionalità di copia integrate.

In PuTTY, evidenzi il testo che desideri con il mouse e poi lo incolli altrove. Facendo clic con il tasto destro in una finestra di PuTTY si incolla il contenuto del buffer di copia / incolla di Windows.

In Konsole o Terminal su Linux, evidenzia ciò che desideri, quindi premi Maiusc + Ctrl + C per copiare e Maiusc + Ctrl + V per incollare.

Nella compilazione win32 di emacs, l'estrazione del testo lo mette nel buffer di copia / incolla .. la maggior parte delle volte.

Su Mac OS X, i chortcuts del tasto Apple funzionano bene, perché Terminal li intrappola.

Non esiste un modo diretto per farlo sulla riga di comando perché la shell non mantiene un buffer di copia / incolla per ciascuna applicazione. bash fa mantenere una copia / incolla tampone per se stessa, e, per default, emacs ^ k / ^ y collegamenti lavoro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.