Copie el texto de Emacs al portapapeles de OS X

25

Cuando ejecuto Emacs en un terminal de texto en lugar del modo GUI normal, puedo copiar en Emacs activando el inicio de una región con C-SPC, y luego seleccionar lo que quiero y luego hacer M-w.

¿Hay alguna forma de que una región copiada de esta manera esté disponible en el portapapeles OSX para pegarla, por ejemplo, en una página web (aparte de ejecutar Emacs en su modo GUI, obviamente)?

No estoy interesado en crear un acceso directo diferente para hacerlo, e idealmente no debería requerir la instalación de ningún módulo.

He visto esta publicación y probé la respuesta aceptada, pero parece que no funciona de la manera que esperaba arriba.

¿Alguna otra idea?

Galder Zamarreño
fuente
Amigo, la pregunta tiene casi 3 años y ha sido respondida
Galder Zamarreño

Respuestas:

33

Copie de Emacs al portapapeles OS X:

seleccione región entonces M-| pbcopy RET

Pegar desde el portapapeles OS X a Emacs:

C-u M-| pbpaste RET (reemplaza la región actual si existe)


Explicación:

M-|se ejecuta shell-command-on-region, lo que como su nombre implica canaliza la región actual a un comando de shell. C-u M-|hace lo mismo, pero reemplaza la región actual con la stdoutdel comando que se está ejecutando.

pbcopyy pbpasteson utilidades de OS X para acceder al portapapeles del sistema.

Andrei Simionescu
fuente
1
Además de responder la pregunta, su respuesta me enseñó cómo ejecutar comandos de shell desde emacs, increíble.
andreskwan
20

Lo siguiente simplemente funciona, copiado desde aquí

(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)
Galder Zamarreño
fuente
La palabrería aquí parece al revés
Jordon Biondo
1
Con el modo malvado, esto rompe el comportamiento de pegar vimish
Felix D.
@FelixD .: ¿ xclip-modesufre el mismo problema?
Stefan
Esto parece roto en Emacs26 al copiar y pegar caracteres multibyte, como se describe en emacs.stackexchange.com/questions/50485/…
silencej
9

Si usa Emacs "de la manera normal" (es decir, como una aplicación GUI), entonces ya debería hacerlo de forma predeterminada. Si usa Emacs dentro de un emulador de terminal, entonces no sabe cómo hacerlo de manera predeterminada, pero puede instalar el xclippaquete desde GNU ELPA y luego habilitar el xclip-modeque le enseña a Emacs cómo hacerlo tanto para GNU / Linux como para OSX

Stefan
fuente
¿ xclipFunciona con OSX? Por lo que he visto por ahí, parece estar diseñado para funcionar con X11, ver post
Galder Zamarreño
1
El xclip.elpaquete ha sido extendido para su uso pbpaste.
Stefan
El terminal emacs en modo servidor (no como instancia regular) se congela cuando uso xclip en macOS por alguna razón.
rien333
¿Podría informarlo como un error (directamente a mí o a través de él M-x report-emacs-bug?)
Stefan
3

Como dijo Stefan, las aplicaciones gráficas de Emacs deberían hacerlo por defecto.

En una terminal de texto, otra opción es usar funciones como esta:

(defun pbcopy ()
  (interactive)
  (let ((deactivate-mark t))
    (call-process-region (point) (mark) "pbcopy")))

(defun pbpaste ()
  (interactive)
  (call-process-region (point) (if mark-active (mark) (point)) "pbpaste" t t))

(defun pbcut ()
  (interactive)
  (pbcopy)
  (delete-region (region-beginning) (region-end)))
nisetama
fuente
excepto cuando no lo hace. 20 años después, el mismo pb en emacs ... Realmente desearía que hubiera algún terreno común y sensato, incrustado en piedra en alguna parte
nicolas
1

Aquí hay una función simple de elisp que puede poner en su archivo .emacs que copia el contenido del búfer en el que se encuentra en el portapapeles. No tiene que seleccionar nada, lo copia todo. El código es corto y bastante claro.

(defun xclip ()
(interactive)
(shell-command (concat "cat " (buffer-file-name (window-buffer (minibuffer-selected-window))) " | pbcopy")))
jumar
fuente
Después de cargar o volver a cargar emacs, llámelo con Mx xclip.
jumar
El OP no solicitó copiar todo el búfer al portapapeles, por lo que esto no hace lo que se le pidió. En cuanto al resto, esto parece duplicar lo que otros ya han dicho.
Stefan
Pido disculpas si esto parece fuera de tema. Navegué a esta página desde Google, donde fue el primer resultado para "copiar texto al portapapeles emacs". La pregunta se titula "Copiar texto de Emacs al portapapeles de OS X", por lo que es fácil ver cómo puede terminar aquí para ese resultado de búsqueda. Creo que es aplicable a la forma en que la frase publicada es su pregunta, un superconjunto de la misma. Visité las respuestas de StackExchange antes y me sentí frustrado cuando no estaba disponible una respuesta simple, especialmente cuando sabía que miles de personas hacían la pregunta, así que pensé en agregar la mía para las personas que podrían beneficiarse.
jumar
0

Echa un vistazo clipboard-kill-regiony clipboard-yank. Estos provienen de menu-bar.el.

Una vez que se resalta una región, puede usar el portapapeles-kill-region para matar la región tanto al búfer de pegado como al portapapeles del sistema. clipboard-yank "pega" lo que esté actualmente en el portapapeles del sistema.

bitops
fuente
Por favor amplíe su respuesta.
Dan
Intenté copiar algo de emacs usando esos comandos, y no estaba disponible externamente para copiarlo en otro lugar fuera de Emacs.
Galder Zamarreño
@ GalderZamarreño funciona para mí en Emacs y estoy en OSX.
bitops
0

La respuesta de Galder Zamarreño es genial, sin embargo, rompe el putcomportamiento maligno en modo maligno. Por lo tanto, lo he adaptado un poco más abajo: estoy seguro de que podría ser mejor, pero hace el trabajo por mí. Siéntase libre de sugerir mejoras:

(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))))

----> Nuevo código

  (defun clipboard-on ()
    (interactive)
    (setq interprogram-cut-function 'paste-to-osx)
    (setq interprogram-paste-function 'copy-from-osx))
  (defun clipboard-off ()
    (interactive)
    (setq interprogram-cut-function 'gui-select-text)
    (setq interprogram-paste-function 'gui-selection-value))
  (global-set-key (kbd "C-c C-p") 'clipboard-on)
  (global-set-key (kbd "C-c C-y") 'clipboard-off))
tcelferact
fuente