Respuestas:
Tengamos cuidado con nuestras definiciones aquí
kill-ring-save
(generalmente vinculado a M-w).yank
(generalmente vinculado a C-y).En mi caso (en GNOME):
Para hacer que la copia del sistema funcione con pegar de Emacs y que la copia de Emacs funcione con pegar del sistema, debe agregar (setq x-select-enable-clipboard t)
a su archivo .emacs
. O tratar
META-X set-variable RET x-select-enable-clipboard RET t
Creo que este es un comportamiento moderno de Unix bastante estándar.
También es importante tener en cuenta (aunque dice que está usando Emacs en una ventana separada) que cuando Emacs se ejecuta en una consola, está completamente divorciado del sistema y de los portapapeles X: cortar y pegar en ese caso está mediado por la terminal . Por ejemplo, "Editar-> Pegar" en la ventana de su terminal debería actuar exactamente como si hubiera escrito el texto del portapapeles en el búfer de Emacs.
META-X set-variable RET select-enable-clipboard RET t
o(setq select-enable-clipboard t)
Inserte lo siguiente en su .emacs
archivo:
(setq x-select-enable-clipboard t)
emacs -nw
, uso los propios atajos de la terminal; Shift-Ctrl-X para cortar (eliminar) el texto y Shift-Ctrl-C para copiar.
emacs -nw
dentro de ventanas tmux divididas horizontalmente.
Pego esto en mi .emacs:
(setq x-select-enable-clipboard t)
(setq interprogram-paste-function 'x-cut-buffer-or-selection-value)
Posteriormente, básicamente no tengo problemas para cortar y pegar hacia adelante y hacia atrás desde cualquier cosa en Emacs a cualquier otra aplicación X11 o Gnome.
Bono: para hacer que estas cosas sucedan en Emacs sin tener que recargar todo su .emacs, haga Cx Ce con el cursor justo después del par de cierre de cada una de esas expresiones en el búfer .emacs.
¡Buena suerte!
Symbol’s function definition is void: x-cut-buffer-or-selection-value
La dificultad de copiar y pegar en Emacs es que desea que funcione independientemente del kill / yank interno, y desea que funcione tanto en la terminal como en la interfaz gráfica de usuario. Existen soluciones robustas para terminal o gui, pero no para ambos. Después de instalar xsel (por ejemplo sudo apt-get install xsel
), esto es lo que hago para copiar y pegar para combinarlos:
(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)
Supongo que por emacs te refieres a Emacs debajo de X (es decir, no dentro de una ventana de terminal).
Hay dos maneras:
Operaciones de portapapeles disponibles:
Hay un artículo de EmacsWiki que explica algunos problemas con copiar y pegar en X y cómo configurarlo para que funcione.
Esto funciona con M-w
Mac OSX. Simplemente agregue a su archivo .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)
El siguiente código, inspirado en la respuesta anterior de @ RussellStewart, agrega soporte para x-PRIMARY y x-SECONDARY, reemplaza region-active-p
con use-region-p
para cubrir el caso de una región vacía, no regresa silenciosamente si xsel no ha sido instalado (devuelve un mensaje de error), e incluye una función de "cortar" (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)
Utilizo lo siguiente, basado en las otras respuestas aquí, para hacer C-x C-w
y C-x C-y
copiar y pegar tanto en Mac como en Linux (si alguien conoce la versión para Windows, no dude en agregarla). Tenga en cuenta que en Linux tendrá que instalar xsel y xclip con su administrador de paquetes.
;; 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
para pegar el contenido del portapapeles usando xclip -o
. Esto puede ser útil para las personas que ya lo han hecho xclip
y no quieren instalar otro programa para copiar y pegar.
Hmm, ¿qué plataforma y qué versión de emacs estás usando? Con GNU Emacs 22.1.1 en Windows Vista, me funciona bien.
Si, por casualidad, está haciendo esto desde Windows a Linux a través de un visor RealVNC, asegúrese de que está ejecutando "vncconfig -iconic" en la caja de Linux primero ...
Es posible que desee especificar qué plataforma está utilizando. ¿Está en linux, unix, macosx, windows, ms-dos?
Creo que para Windows debería funcionar. Para MacOSX, se agregará al portapapeles de x-windows, que no es lo mismo que el portapapeles de macosx. Para Linux, depende de su estilo de administrador de ventanas, pero creo que x-windows lo maneja de una manera agradable en la mayoría de ellos.
Por lo tanto, especifique.
Lo que hago es usar una buena herramienta de terminal (PuTTY en Windows, Konsole o Terminal en Linux) que tiene funciones de copia integradas.
En PuTTY, resalta el texto que desea con el mouse y luego lo pega en otro lugar. Al hacer clic con el botón derecho en una ventana de PuTTY, se pega el contenido del búfer de copiar / pegar de Windows.
En Konsole o Terminal en Linux, resalta lo que desea, luego presione Shift + Ctrl + C para copiar y Shift + Ctrl + V para pegar.
En la compilación win32 de emacs, tirar de texto lo pone en el búfer de copiar / pegar ... la mayor parte del tiempo.
En Mac OS X, las combinaciones de teclas de Apple funcionan bien, porque Terminal las atrapa.
No hay una forma directa de hacerlo en la línea de comandos porque el shell no mantiene un búfer de copiar / pegar para cada aplicación. fiesta hace mantener una copia / pega buffer para sí mismo, y, por defecto, emacs ^ k / ^ y atajos de trabajo.