2010-07-09 25 views
29

Tengo (modo cua-t) en mis archivos .emacs, de modo que Cc es copiar y Cv se pega como la mayoría de los otros programas en mi escritorio (Ubuntu, Gnome, Linux) . Sin embargo, Emacs parece no compartir el buffer del portapapeles/copia con otros programas.Integrar copia/pegar Emacs con copiar/pegar sistema

Por ejemplo, si C-c en Firefox puedo pegar S-C-v en un terminal o C-v para pegarlo en gedit. Sin embargo, si C-v (o C-y) en emacs, no obtengo lo que copié de Firefox.

¿Hay alguna manera de que esto funcione? ¿Hay algún otro comando que pueda usar para acceder al buffer de copiar y pegar del sistema?

+0

Por cierto, comparte un portapapeles con sistema, pero solo la selección del mouse (es decir, lo que puede pegar con un clic central en otro lugar). – doublep

+0

¿No debería ser esto en superuser.com? –

+1

Las preguntas de Vim y Emacs generalmente se consideran correctas para SO, ya que son herramientas del programador. Vea las diferentes discusiones que ya tuvieron lugar sobre esto en meta. – jamessan

Respuesta

8

Esto funciona en mi máquina:

;; CUA OS copypasta even in ncurses mode 
(case system-type 
    ('darwin (unless window-system 
      (setq interprogram-cut-function 
        (lambda (text &optional push) 
        (let* ((process-connection-type nil) 
          (pbproxy (start-process "pbcopy" "pbcopy" "/usr/bin/pbcopy"))) 
         (process-send-string pbproxy text) 
         (process-send-eof pbproxy)))))) 
    ('gnu/linux (progn 
       (setq x-select-enable-clipboard t) 
       (defun xsel-cut-function (text &optional push) 
        (with-temp-buffer 
        (insert text) 
        (call-process-region (point-min) (point-max) "xsel" nil 0 nil "--clipboard" "--input"))) 
       (defun xsel-paste-function() 

        (let ((xsel-output (shell-command-to-string "xsel --clipboard --output"))) 
        (unless (string= (car kill-ring) xsel-output) 
         xsel-output))) 
       (setq interprogram-cut-function 'xsel-cut-function) 
       (setq interprogram-paste-function 'xsel-paste-function)))) 
+0

¡Agradable! Esto funciona para C-c/C-x/C-v, pero ahora el medio clic ya no se comparte con el sistema. ¿El medio clic todavía funciona para ti? – sligocki

+0

esto solo funciona en el modo ventana de emacs en lugar del modo terminal (-nw), ¿verdad? – galactica

+0

en mac esto funciona para mí en modo terminal – mwag

15

Consulte clipboard-yank y clipboard-kill-region en la sección clipboard del manual.

+0

+1 por haber sido el primero. – danlei

+1

Genial, eso es exactamente lo que estaba buscando. Agregué (x-select-enable-clipboard t) a mi archivo .emacs y todo está funcionando como esperaba. Gracias. – sligocki

+0

Hm, en realidad, esto no es exactamente correcto. Esto pegará de las selecciones X11. Pero es mucho mejor de lo que era. – sligocki

4

Quizás esta página EmacsWiki ayudará, especialmente la sección donde se mencionan clipboard-kill-region, clipboard-kill-ring-save y clipboard-yank.

+0

Gracias @danlei, el wiki tenía algunos consejos útiles. – sligocki

+0

De nada. EmacsWiki es una gran fuente para todo lo relacionado con Emacs. – danlei

27

Tuve el mismo problema. He añadido esto a mi archivo .emacs:

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

Ahora Ctrl-C y Ctrl-V entre Emacs y otras aplicaciones funcionen bien. Fuente: Ubuntu Forums

+0

Ah, aún mejor. Solo tuve el primer comando. Pero el segundo ayuda con un problema que tuve, donde seleccionar texto y hacer clic en medio en emacs no se copió correctamente. ¡Gracias! – sligocki

+0

Soy novato. Creé ~/.emacs por primera vez. Agregué tu código a ~/.emacs y funciona. Gracias. –

+1

Esto no parece funcionar para Mac OSX; Obteniendo este error 'current-kill: la definición de función del símbolo es nula: x-cut-buffer-or-selection-value' – cevaris

0

puedo solucionar este problema autocutsel, que trabaja con emacs y el resto de mi sistema Ubuntu también.

autocutsel - keep the X clipboard and the cutbuffer in sync 

utilizo los siguientes comandos (ejecutar una vez, por lo general invocada por el mecanismo de "arranque" de mi gestor de ventanas, o ~/.xsession):

autocutsel -fork 
autocutsel -fork -selection PRIMARY 

La primera instancia de autocutsel hace lo siguiente :

autocutsel realiza un seguimiento de los cambios en el servidor de corte [X11] y el portapapeles del servidor selección. Cuando el portapapeles ha cambiado , actualiza el buffer de corte. Cuando se cambia el buffer de cut, posee la selección del portapapeles. La selección del portapapeles y el portapapeles siempre están sincronizados.

Sin embargo por lo general hay una tercera portapapeles, llamado PRIMARY, que se utiliza la segunda instancia de autocutsel para sincronizar con los otros dos.

Las ventajas de esto son que los tres portapapeles principales están unificados, de modo que pegar la selección actual mediante un clic medio o copiar/pegar de estilo CUA con CTRL-C y CTRL-V funcionan todos juntos. La principal desventaja de este enfoque es que cualquier resaltado automático de texto (como hacer doble clic para resaltar una palabra en emacs o hacer clic en el icono BlockQuote en un campo de edición StackOverflow) borrará instantáneamente el búfer de copia.Para solucionar este problema, utilizo un grabador de historial del portapapeles, como glipper, que también graba convenientemente todo el contenido del portapapeles y me permite recuperar los contenidos perdidos del portapapeles en tales circunstancias. Puede tomar un poco acostumbrarse y funciona bien para mí. Como alternativa, puede experimentar con la opción -pause, que espera un período de tiempo antes de tomar la selección, que puede ser lo suficientemente larga como para anular la selección o eliminar cualquier texto seleccionado automáticamente. Sin embargo, no pude obtener resultados que funcionaran lo suficientemente bien para mí.

Tenga en cuenta que esta solución no requiere ninguna configuración especial emacs, que utilizo con cua-mode habilitado.