Agregue el portapapeles del sistema operativo para matar el anillo

25

A menudo me encuentro copiando un fragmento de código en el portapapeles de mi sistema operativo desde Internet. Luego, sigo los siguientes pasos simples:

  1. Cambiar a mi ventana de Emacs
  2. Encuentra el lugar donde quiero pegar el código
  3. Use C-y( yank) para insertar el texto copiado.

Sin embargo, a veces encuentro (para mi gran decepción) que involuntariamente utilicé alguna forma de comando de matar (como kill-wordo kill-line) mientras estaba en el paso 2. En tales casos, el texto copiado del "portapapeles" nunca llega al asesinato anillo.

¿Hay alguna manera de asegurarme de que el texto copiado de otras aplicaciones siempre llegue a mi círculo de asesinatos?

Trabajo en Linux con mayor frecuencia, pero también uso Emacs regularmente en Windows y Mac OS X, por lo que se prefiere una respuesta independiente del sistema operativo.

nispio
fuente
¿Puedo sugerir este enlace ? navegando por toda la página, verá muchas formas diferentes de copiar / pegar desde / al portapapeles
Nsukami _
@Nsukami_ Gracias. Intentaré digerirlo, pero la página vinculada es un excelente ejemplo de por qué me canso de buscar respuestas en EmacsWiki. Muchos de los piratas informáticos de Elisp parecen pensar que el código de Elisp es autodocumentado y no requiere comentarios ni explicaciones sobre la función o el uso. Por lo general, no tengo tiempo para realizar ingeniería inversa del código solo para decidir si hace lo que quiero o no.
nispio
jaja, entiendo;)
Nsukami _

Respuestas:

31

Necesita personalizar save-interprogram-paste-before-killa t. Esto empujará su portapapeles hacia el asesinato en caso de que mate algo en emacs antes de pegar el portapapeles. Una personalización relacionada es la yank-pop-change-selectionque empuja tu tirón actual en emacs al portapapeles. Para que ambos funcionen, necesita x-select-enable-clipboard(reemplazado por gui-select-enable-clipboarden emacs 25.1) ser tel predeterminado.

La razón por la que esto está desactivado de forma predeterminada es para evitar la inserción accidental de una gran cantidad de datos en el asesinato que persiste durante la sesión a diferencia del portapapeles que se reemplaza fácilmente.

Vamsi
fuente
1
Incluso más limpio y fácil de lo que esperaba. save-interprogram-paste-before-killparece hacer exactamente lo que quiero!
nispio
Estoy en emacs 26, y gui-select-enable-clipboardse llama just select-enable-clipboard.
Runa Kaagaard
3

otra solución es usar la herramienta cli si es posible,

  • pbcopy / pbpaste en Mac

  • getclip / putclip en Cygwin

  • xsel en Linux
  • x-clipboard en GUI Emacs (como otros mencionaron, debe activar el indicador x-select-enable-clipboard).

La ventaja de esta solución es que el portapapeles siempre es utilizable (por ejemplo, cuando ssh remoto).

Mi respuesta tiene dos partes. la primera parte presenta algunas herramientas útiles para manipular el portapapeles. la segunda parte responderá a su pregunta original (guarde el portapapeles en el anillo de eliminación).

PARTE UNO

Inserte el siguiente código en su ~ / .emacs:

(setq *is-a-mac* (eq system-type 'darwin))
(setq *cygwin* (eq system-type 'cygwin) )
(setq *linux* (or (eq system-type 'gnu/linux) (eq system-type 'linux)) )
(defun copy-to-x-clipboard ()
  (interactive)
  (if (region-active-p)
      (progn
        (cond
         ((and (display-graphic-p) x-select-enable-clipboard)
          (x-set-selection 'CLIPBOARD (buffer-substring (region-beginning) (region-end))))
         (t (shell-command-on-region (region-beginning) (region-end)
                                     (cond
                                      (*cygwin* "putclip")
                                      (*is-a-mac* "pbcopy")
                                      (*linux* "xsel -ib")))
            ))
        (message "Yanked region to clipboard!")
        (deactivate-mark))
        (message "No region active; can't yank to clipboard!")))

(defun paste-from-x-clipboard()
  (interactive)
  (cond
   ((and (display-graphic-p) x-select-enable-clipboard)
    (insert (x-selection 'CLIPBOARD)))
   (t (shell-command
       (cond
        (*cygwin* "getclip")
        (*is-a-mac* "pbpaste")
        (t "xsel -ob"))
       1))
   ))

(defun my/paste-in-minibuffer ()
  (local-set-key (kbd "M-y") 'paste-from-x-clipboard)
  )

(add-hook 'minibuffer-setup-hook 'my/paste-in-minibuffer)

LA SEGUNDA PARTE

inserte el código a continuación en su ~ / .emacs, y de ahora en adelante, use "Mx paste-from-clipboard-and-cc-kill-ring" para pegar:

(defun paste-from-clipboard-and-cc-kill-ring ()
  "paste from clipboard and cc the content into kill ring"
  (interactive)
  (let (str)
    (with-temp-buffer
      (paste-from-x-clipboard)
      (setq str (buffer-string)))
    ;; finish the paste
    (insert str)
    ;; cc the content into kill ring at the same time
    (kill-new str)
    ))
Chen Bin
fuente