Cómo copiar texto de Emacs a otra aplicación en Linux


113

Cuando corto (elimino) texto en Emacs 22.1.1 (en su propia ventana en X, en KDE, en Kubuntu), no puedo pegarlo (tirar de él) en ninguna otra aplicación.


Le sugiero que lea esto: CopyAndPaste-Emacs Wiki . Esto explica muy bien el problema de la gira.
El borito

Respuestas:


122

Tengamos cuidado con nuestras definiciones aquí

  • Una copia de Emacs es el comando kill-ring-save(generalmente vinculado a M-w).
  • Una copia del sistema es lo que normalmente se obtiene al presionar C-c(o al elegir "Editar-> Copiar" en la ventana de una aplicación).
  • Una copia X es resaltar "físicamente" el texto con el cursor del mouse.
  • Una pasta de Emacs es el comando yank(generalmente vinculado a C-y).
  • Un pegado del sistema es lo que normalmente se obtiene al presionar C-v(o al elegir "Editar-Pegar" en la ventana de una aplicación).
  • Una X paste es presionar el "botón central del mouse" (simulado al presionar los botones izquierdo y derecho del mouse al mismo tiempo).

En mi caso (en GNOME):

  • Tanto Emacs como la copia del sistema suelen funcionar con X paste.
  • X copy normalmente funciona con Emacs paste.
  • 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.


7
Esta es una terminología confusa . El nombre estándar, y menos confuso, para lo que llama "X copiar / pegar" es la selección primaria X. Lo que usted llama "copiar / pegar del sistema" es el portapapeles X.
Gilles 'SO- deja de ser malvado'

Gracias ... parece que la variable ha cambiado de nombre desde que se escribió esto. META-X set-variable RET select-enable-clipboard RET to(setq select-enable-clipboard t)
David McCorrie

95

Inserte lo siguiente en su .emacsarchivo:

(setq x-select-enable-clipboard t)

3
No es prolijo, le dice lo que necesita saber. Excelente respuesta.
JasonFruit

Funciona perfectamente, uso Ubuntu 12.04. Gracias
zhihong

7
Agradable y simple, pero esto no funciona en la terminal. No hay ninguna razón por la que el mismo atajo no debería funcionar tanto en la terminal como en una ventana libre, y algunas de las respuestas a continuación abordan ambos simultáneamente.
RussellStewart

1
Cuando corro emacs -nw, uso los propios atajos de la terminal; Shift-Ctrl-X para cortar (eliminar) el texto y Shift-Ctrl-C para copiar.
memius

4
Eso no funcionará cuando se ejecute emacs -nwdentro de ventanas tmux divididas horizontalmente.
Sridhar Ratnakumar

11

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!


3
Esta solución funciona para emacs en una ventana X, es decir, emacs se ejecuta dentro de una ventana si está ejecutando emacs en la línea de comando, lo que necesita es: stackoverflow.com/questions/5288213/…
elviejo79

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

10

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)

Porque recibo un error porque no hay parámetros. Necesito cambiar la primera línea "(defun copy-to-clipboard ()" a "(defun copy-from-ubuntu (texto y empuje opcional)". Esto me funciona: D
Renato Cassino

Funciona pero la operación de pegado es bastante lenta, ¿podría estar relacionada con la red?
alper

7

Supongo que por emacs te refieres a Emacs debajo de X (es decir, no dentro de una ventana de terminal).

Hay dos maneras:

  1. (Se aplica solo a sistemas operativos Unix) Resalte el texto deseado con el mouse (esto lo copia en el portapapeles X) y luego haga clic con el botón central para pegarlo.
  2. Resalte el texto deseado y luego "Mx clipboard-kill-ring-save" (tenga en cuenta que puede vincularlo a una tecla más fácil). Luego, simplemente "Editar-> Pegar" en su aplicación favorita.

Operaciones de portapapeles disponibles:

  • clipboard-kill-ring-save - copia la selección de Emacs al portapapeles
  • clipboard-kill-region - cortar la selección de Emacs al portapapeles
  • clipboard-yank - pegar desde el portapapeles a Emacs


4

Esto funciona con M-wMac 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)

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


1

El siguiente código, inspirado en la respuesta anterior de @ RussellStewart, agrega soporte para x-PRIMARY y x-SECONDARY, reemplaza region-active-pcon use-region-ppara 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)

¿Hay alguna razón para no sobrescribir las combinaciones de teclas estándar?
Paul Brodersen

@Paul: Las 'combinaciones de teclas estándar' son para el 'portapapeles interno de emacs', que es diferente del portapapeles X. Cité el término 'portapapeles interno de emacs' porque la terminología de emacs es diferente; consulte la excelente explicación de Chris Conway, más arriba.
user1404316

1

Utilizo lo siguiente, basado en las otras respuestas aquí, para hacer C-x C-wy C-x C-ycopiar 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)))

1
En realidad, también puede usar xclippara pegar el contenido del portapapeles usando xclip -o. Esto puede ser útil para las personas que ya lo han hecho xclipy no quieren instalar otro programa para copiar y pegar.
Amin NAIRI

0

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 ...


0

Siempre uso el pegado rápido: arrastre la selección en emacs, presione 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 estás usando emacs en X de una forma u otra).


0

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.


-1

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.