Risposte:
Stiamo attenti con le nostre definizioni qui
kill-ring-save
(solitamente associato a M-w).yank
(solitamente associato a C-y).Nel mio caso (su GNOME):
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.
META-X set-variable RET select-enable-clipboard RET t
oppure(setq select-enable-clipboard t)
Inserisci quanto segue nel tuo .emacs
file:
(setq x-select-enable-clipboard t)
emacs -nw
, utilizzo le scorciatoie del terminale; Maiusc-Ctrl-X per tagliare (uccidere) il testo e Maiusc-Ctrl-C per copiare.
emacs -nw
all'interno di finestre tmux divise orizzontalmente.
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!
Symbol’s function definition is void: x-cut-buffer-or-selection-value
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)
Presumo che per emacs tu intenda Emacs sotto X (cioè non all'interno di una finestra di terminale).
Ci sono due modi:
Operazioni disponibili negli appunti:
C'è un articolo EmacsWiki che spiega alcuni problemi con copia e incolla sotto X e come configurarlo per funzionare.
Funziona con M-w
su 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)
Il codice seguente, ispirato alla risposta di @ RussellStewart sopra, aggiunge il supporto per x-PRIMARY e x-SECONDARY, sostituisce region-active-p
con use-region-p
per 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)
Uso quanto segue, in base alle altre risposte qui, per fare C-x C-w
ed C-x C-y
essere 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)))
xclip
per incollare il contenuto degli appunti usando xclip -o
. Questo può essere utile per le persone che hanno già xclip
e non vogliono installare un altro programma per fare sia la copia che l'incolla.
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.
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.