Cómo copiar texto de Emacs a otra aplicación en Linux
copy-paste (12)
Cuando corté (eliminé) texto en Emacs 22.1.1 (en su propia ventana en X, en KDE, en Kubuntu), no puedo pegarlo (arrastrarlo) en ninguna otra aplicación.
El siguiente código, inspirado en la respuesta de @ RussellStewart anterior, 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 retorna silenciosamente si xsel tiene no se ha instalado (devuelve un mensaje de error), e incluye una función de "corte" (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)
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 macosx. Para Linux, depende de tu gusto de administrador de ventanas, pero creo que x-windows lo maneja de una manera agradable en la mayoría de ellos.
Por lo tanto, por favor especifique.
Esto funciona con Mw
en Mac OSX. Solo 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)
Hay un artículo de EmacsWiki que explica algunos problemas con copiar y pegar en X y cómo configurarlo para que funcione.
Hmm, ¿qué plataforma y qué versión de emacs estás usando? Con GNU Emacs 22.1.1 en Windows Vista, funciona bien para mí.
Si, por casualidad, estás haciendo esto desde Windows a Linux a través de un visor RealVNC, asegúrate de que estás ejecutando "vncconfig -iconic" en el cuadro de Linux primero .....
Inserta lo siguiente en tu archivo .emacs
:
(setq x-select-enable-clipboard t)
La dificultad de copiar y pegar en Emacs es que quieres que funcione independientemente del kill / yank interno, y quieres que funcione tanto en la terminal como en la interfaz gráfica de usuario. Existen soluciones sólidas existentes para terminal o GUI, pero no para ambas. 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)
Lo que hago es usar una buena herramienta de terminal (PuTTY en Windows, Konsole o Terminal en Linux) que tenga incorporadas las herramientas de copia.
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, resalte lo que desea y luego presione Mayús + Ctrl + C para copiar y Mayús + Ctrl + V para pegar.
En la compilación win32 de emacs, arrastrar texto lo pone en el búfer de copiar / pegar ... la mayoría de las veces.
En Mac OS X, los chortcuts Apple-key funcionan bien, porque el terminal los atrapa.
No hay una forma directa de hacerlo en la línea de comandos porque el shell no mantiene un buffer de copiar / pegar para cada aplicación. bash mantiene un buffer de copiar / pegar y, de forma predeterminada, funcionan los atajos de ^ ^ / ^ y.
Pego esto en mis .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 de cualquier cosa en Emacs a cualquier otra aplicación X11 o Gnome.
Bonificación: para que estas cosas sucedan en Emacs sin tener que volver a cargar tus archivos .emacs completos, haz Cx Ce con el cursor justo después de la paren cercana de cada una de esas expresiones en el búfer de .emacs.
¡Buena suerte!
Siempre utilizo la función de pegar rápido - arrastrar en emacs, pulso el botón central del mouse en la ventana de destino.
(De la referencia a Kate, supongo que estás en Linux o similar y probablemente uses emacs en X de una forma u otra).
Supongo por emacs que estás significando Emacs bajo X (es decir, no dentro de una ventana de terminal).
Hay dos maneras:
- (Se aplica únicamente al sistema operativo Unix) Resalte el texto deseado con el mouse (esto lo copia al portapapeles X) y luego haga clic con el botón central para pegar.
- Resalte el texto deseado y luego "Mx clipboard-kill-ring-save" (tenga en cuenta que puede vincular esto a una tecla más fácil). Luego simplemente "Editar-> Pegar" en tu aplicación favorita.
Operaciones del portapapeles disponibles:
- clipboard-kill-ring-save - copia la selección de Emacs al portapapeles
- tagboard-kill-region - selección de corte de Emacs al portapapeles
- clipboard-yank - pegar desde el portapapeles a Emacs
Tengamos cuidado con nuestras definiciones aquí
- Una copia de Emacs es el comando
kill-ring-save
(generalmente vinculado a Mw ). - Una copia del sistema es lo que normalmente obtiene presionando Cc (o seleccionando "Editar-> Copiar" en una ventana de la aplicación).
- Una copia X está resaltando "físicamente" el texto con el cursor del mouse.
- Una pegada de Emacs es el comando
yank
(usualmente ligado a Cy ). - Una pasta de sistema es lo que normalmente obtiene presionando Cv (o eligiendo "Editar-Pegar" en una ventana de la aplicación).
- Una X pega está presionando el "botón central del mouse" (simulado al presionar los botones izquierdo y derecho del mouse juntos).
En mi caso (en GNOME):
- Tanto Emacs como la copia del sistema generalmente funcionan con X paste.
- La copia X generalmente funciona con Emacs paste.
Para que la copia del sistema funcione con Emacs paste y Emacs copy work con system paste, necesita agregar
(setq x-select-enable-clipboard t)
a su.emacs
. O tratarMETA-X set-variable RET x-select-enable-clipboard RET t
Creo que este es el comportamiento moderno estándar de Unix.
También es importante tener en cuenta (aunque dices que estás usando Emacs en una ventana separada) que cuando Emacs se ejecuta en una consola, está completamente divorciado del sistema y los portapapeles X: cortar y pegar en ese caso está mediado por la terminal . Por ejemplo, "Editar-> Pegar" en la ventana de su terminal debe actuar exactamente como si hubiera tecleado el texto del portapapeles en el búfer de Emacs.