Copier du texte d'Emacs dans le presse-papiers OS X


25

Lorsque j'exécute Emacs dans un terminal texte au lieu du mode GUI normal, je peux copier dans Emacs en activant le début d'une région avec C-SPC, puis sélectionner ce que je veux, puis faire M-w.

Existe-t-il un moyen de copier une région de cette manière dans le presse-papiers OSX pour la coller, par exemple dans une page Web (autrement qu'en exécutant Emacs en mode GUI, évidemment)?

Je ne suis pas intéressé à créer un raccourci différent pour cela, et idéalement, cela ne devrait pas nécessiter l'installation de modules.

J'ai vu ce post et essayé la réponse acceptée, mais cela ne fonctionne pas semble fonctionner comme je m'y attendais ci-dessus.

D'autres idées?


Mec, la question a presque 3 ans et il a été répondu
Galder Zamarreño

Réponses:


33

Copie d'Emacs dans le presse-papiers OS X:

sélectionnez la région puis M-| pbcopy RET

Coller du presse-papiers OS X vers Emacs:

C-u M-| pbpaste RET (remplace la région actuelle si elle existe)


Explication:

M-|s'exécute shell-command-on-region, ce qui, comme son nom l'indique, dirige la région actuelle vers une commande shell. C-u M-|fait la même chose, mais remplace la région actuelle par stdoutla commande en cours d'exécution.

pbcopyet pbpastesont des utilitaires OS X pour accéder au presse-papiers du système.


1
En plus de répondre à la question, votre réponse m'a appris à exécuter des commandes shell à partir d'emacs, Amazing.
andreskwan

20

Ce qui suit fonctionne, copié d' ici

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

Le verbiage ici semble à l'envers
Jordon Biondo

1
Avec le mode diabolique, cela brise le comportement de collage vimish
Felix D.

@FelixD .: xclip-modesouffre-t-il du même problème?
Stefan

Cela semble rompu dans Emacs26 lors de la copie et du collage de caractères multi-octets, comme décrit dans emacs.stackexchange.com/questions/50485/…
silencej

9

Si vous utilisez Emacs "de façon normale" (c'est-à-dire comme une application GUI), il devrait déjà le faire par défaut. Si vous utilisez Emacs dans un émulateur de terminal, alors il ne sait pas comment le faire par défaut, mais vous pouvez installer le xclippackage à partir de GNU ELPA puis activer le xclip-modequi enseigne à Emacs comment le faire à la fois pour GNU / Linux et pour OSX.


Fonctionne xclipavec OSX? D'après ce que j'ai vu là-bas, il semble être conçu pour fonctionner avec X11, voir post
Galder Zamarreño

1
le xclip.elpackage a été étendu à l'utilisation pbpaste.
Stefan

emacs terminal en mode serveur (pas en tant qu'instance régulière) se bloque lorsque j'utilise xclip sous macOS pour une raison quelconque.
rien333

Pourriez-vous le signaler en tant que bogue (soit directement à moi ou via M-x report-emacs-bug?
Stefan

3

Comme l'a dit Stefan, les applications graphiques Emacs devraient le faire par défaut.

Dans un terminal texte, une autre option consiste à utiliser des fonctions comme celle-ci:

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

sauf quand ce n'est pas le cas. 20 ans plus tard, même pb dans emacs .... Je souhaite vraiment qu'il y ait un terrain commun et sain d'esprit, quelque part en pierre
Nicolas

1

Voici une fonction elisp simple que vous pouvez placer dans votre fichier .emacs qui copie le contenu du tampon dans lequel vous vous trouvez dans le presse-papiers. Vous n'avez rien à sélectionner, il copie tout. Le code est court et assez explicite.

(defun xclip ()
(interactive)
(shell-command (concat "cat " (buffer-file-name (window-buffer (minibuffer-selected-window))) " | pbcopy")))

Après avoir chargé ou rechargé emacs, appelez-le avec Mx xclip.
jumar

L'OP n'a pas demandé de copier la totalité du tampon dans le presse-papiers, donc cela ne fait pas ce qui a été demandé. Quant au reste, cela semble simplement reproduire ce que d'autres ont déjà dit.
Stefan

Je m'excuse si cela semble hors sujet. J'ai accédé à cette page à partir de Google, où c'était le premier résultat pour "copier du texte dans le presse-papiers emacs". La question est intitulée "Copier le texte d'Emacs dans le presse-papiers OS X", il est donc facile de voir comment vous pouvez vous retrouver ici pour ce résultat de recherche. Je pense que cela s'applique à la façon dont la phrase affichée est leur question, un sur-ensemble de celle-ci. J'ai déjà visité les réponses StackExchange et j'étais frustré lorsqu'une réponse simple n'était pas disponible, surtout quand je savais que des milliers de personnes posaient la question, j'ai donc pensé ajouter la mienne pour les personnes qui pourraient en bénéficier.
jumar

0

Découvrez clipboard-kill-regionet clipboard-yank. Ils viennent de menu-bar.el.

Une fois qu'une région est mise en surbrillance, vous pouvez utiliser clipboard-kill-region pour tuer la région à la fois dans votre tampon de collage et dans le presse-papiers du système. clipboard-yank "colle" tout ce qui se trouve actuellement dans le presse-papiers du système.


Veuillez développer votre réponse.
Dan

J'ai essayé de copier quelque chose depuis emacs en utilisant ces commandes, et je n'étais pas disponible en externe pour le copier ailleurs en dehors d'Emacs.
Galder Zamarreño

@ GalderZamarreño ça marche pour moi dans Emacs et je suis sur OSX.
bitops

0

La réponse de Galder Zamarreño est excellente, cependant, elle brise le putcomportement diabolique en mode diabolique. Je l'ai donc adapté un peu plus bas - je suis sûr que ça pourrait être mieux, mais ça fait le boulot pour moi. N'hésitez pas à suggérer des améliorations:

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

----> Nouveau code

  (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))
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.