Comment copier du texte d'Emacs vers une autre application sous Linux

113

Quand je coupe (tue) du texte dans Emacs 22.1.1 (dans sa propre fenêtre sur X, dans KDE, sur Kubuntu), je ne peux pas le coller (yank) dans une autre application.

memius
la source
Je vous suggère de lire ceci: CopyAndPaste-Emacs Wiki . Cela explique très bien le problème de la tournée.
El borito

Réponses:

122

Soyons prudents avec nos définitions ici

  • Une copie Emacs est la commande kill-ring-save(généralement liée à M-w).
  • Une copie système est ce que vous obtenez généralement en appuyant sur C-c(ou en choisissant "Edition-> Copier" dans une fenêtre d'application).
  • Une copie X met en évidence "physiquement" le texte avec le curseur de la souris.
  • Une pâte Emacs est la commande yank(généralement liée à C-y).
  • Une pâte système est ce que vous obtenez généralement en appuyant sur C-v(ou en choisissant "Edition-Coller" dans une fenêtre d'application).
  • Une pâte X consiste à appuyer sur le "bouton central de la souris" (simulé en appuyant simultanément sur les boutons gauche et droit de la souris).

Dans mon cas (sur GNOME):

  • Emacs et la copie système fonctionnent généralement avec X paste.
  • La copie X fonctionne généralement avec la pâte Emacs.
  • Pour faire fonctionner la copie système avec la pâte Emacs et la copie Emacs avec la pâte système, vous devez ajouter (setq x-select-enable-clipboard t)à votre fichier .emacs. Ou essayez

    META-X set-variable RET x-select-enable-clipboard RET t

Je pense que c'est un comportement Unix moderne assez standard.

Il est également important de noter (bien que vous disiez que vous utilisez Emacs dans une fenêtre séparée) que lorsque Emacs s'exécute dans une console, il est complètement séparé du système et du presse-papiers X: le copier-coller dans ce cas est médiatisé par le terminal . Par exemple, "Edition-> Coller" dans la fenêtre de votre terminal doit agir exactement comme si vous tapiez le texte du presse-papiers dans le tampon Emacs.

Chris Conway
la source
7
C'est une terminologie déroutante . Le nom standard, et moins déroutant, pour ce que vous appelez «X copier / coller» est la sélection primaire X. Ce que vous appelez «copier / coller système» est le presse-papiers X.
Gilles 'SO- arrête d'être diabolique'
Merci ... on dirait que la variable a été renommée depuis que cela a été écrit. META-X set-variable RET select-enable-clipboard RET tou(setq select-enable-clipboard t)
David McCorrie
95

Insérez ce qui suit dans votre .emacsfichier:

(setq x-select-enable-clipboard t)
memius
la source
3
Pas verbeux, vous dit ce que vous devez savoir. Excellente réponse.
JasonFruit
Fonctionne parfaitement, j'utilise Ubuntu 12.04. Merci
zhihong
7
Nice et simple, mais cela ne fonctionne pas dans le terminal. Il n'y a aucune raison pour que le même raccourci ne fonctionne pas à la fois dans le terminal et dans une fenêtre libre, et certaines des réponses ci-dessous traitent les deux simultanément.
RussellStewart
1
Quand je cours emacs -nw, j'utilise les propres raccourcis du terminal; Shift-Ctrl-X pour couper (tuer) le texte et Shift-Ctrl-C pour copier.
memius
4
Cela ne fonctionnera pas lorsque vous exécuterez des emacs -nwfenêtres tmux fractionnées horizontalement.
Sridhar Ratnakumar
11

Je colle ceci dans mes .emacs:

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

Par la suite, je n'ai pratiquement aucun problème à couper et coller de n'importe quoi dans Emacs vers n'importe quelle autre application X11 ou Gnome.

Bonus: pour que ces choses se produisent dans Emacs sans avoir à recharger l'ensemble de vos .emacs, faites Cx Ce avec le curseur juste après le paren de fermeture de chacune de ces expressions dans le tampon .emacs.

Bonne chance!

jfm3
la source
3
Cette solution fonctionne pour emacs dans une fenêtre X, c'est-à-dire qu'emacs s'exécute dans une fenêtre si vous exécutez emacs dans la ligne de commande, ce dont vous avez besoin est: stackoverflow.com/questions/5288213/…
elviejo79
Symbol’s function definition is void: x-cut-buffer-or-selection-value
alper le
10

La difficulté avec le copier-coller dans Emacs est que vous voulez qu'il fonctionne indépendamment du kill / yank interne, et que vous voulez qu'il fonctionne à la fois dans le terminal et dans l'interface graphique. Il existe des solutions robustes pour le terminal ou l'interface graphique, mais pas les deux. Après avoir installé xsel (par exemple sudo apt-get install xsel), voici ce que je fais pour copier et coller pour les combiner:

(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)
RussellStewart
la source
Car je reçois une erreur car il n'y a pas de paramètres. J'ai besoin de changer la première ligne "(defun copy-to-clipboard ()" en "(defun copy-from-ubuntu (text & optional push)". Cela fonctionne pour moi: D
Renato Cassino
Cela fonctionne mais l'opération de collage est assez lente, pourrait-elle être transmise au réseau?
alper le
7

Je suppose que par emacs vous voulez dire Emacs sous X (c'est-à-dire pas dans une fenêtre de terminal).

Il y a deux manières:

  1. (S'applique uniquement aux systèmes d'exploitation Unix) Mettez en surbrillance le texte souhaité avec votre souris (cela le copie dans le presse-papiers X), puis cliquez avec le bouton central pour le coller.
  2. Mettez en surbrillance le texte souhaité, puis «Mx clipboard-kill-ring-save» (notez que vous pouvez lier ceci à une touche plus simple). Ensuite, il suffit de "Modifier-> Coller" dans votre application préférée.

Opérations de presse-papiers disponibles:

  • clipboard-kill-ring-save - copie la sélection d'Emacs vers le presse-papier
  • clipboard-kill-region - coupe la sélection d'Emacs au presse-papiers
  • clipboard-yank - coller du presse-papiers vers Emacs
pdq
la source
7

Il existe un article d'EmacsWiki qui explique certains problèmes de copier-coller sous X et comment le configurer pour qu'il fonctionne.

cschol
la source
Il existe une entrée de wiki emacs à copier et coller. C'est à quel point c'est mauvais.
nicolas
4

Cela fonctionne avec M-wMac OSX. Ajoutez simplement à votre fichier .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)

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

cevaris
la source
1

Le code ci-dessous, inspiré de la réponse de @ RussellStewart ci-dessus, ajoute la prise en charge de x-PRIMARY et x-SECONDARY, remplace region-active-ppar use-region-ppour couvrir le cas d'une région vide, ne retourne pas silencieusement si xsel n'a pas été installé (renvoie un message d'erreur), et inclut une fonction "cut" (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)
user1404316
la source
Y a-t-il des raisons de ne pas écraser les raccourcis clavier standard?
Paul Brodersen
@Paul: Les «raccourcis clavier standard» sont pour le «presse-papiers interne emacs», qui est différent du X-clipboard. J'ai cité le terme «presse-papiers interne emacs» parce que la terminologie emacs est différente - référez-vous à l'excellente explication de Chris Conway, ci-dessus.
user1404316
1

J'utilise ce qui suit, basé sur les autres réponses ici, pour créer C-x C-wet C-x C-ycopier et coller à la fois sur Mac et Linux (si quelqu'un connaît la version pour Windows, n'hésitez pas à l'ajouter). Notez que sous Linux, vous devrez installer xsel et xclip avec votre gestionnaire de paquets.

;; 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)))
asmeureur
la source
1
En fait, vous pouvez également utiliser xclippour coller le contenu du presse-papiers en utilisant xclip -o. Cela peut être utile pour les personnes qui ont déjà xclipet ne veulent pas installer un autre programme pour faire à la fois le copier et le coller.
Amin NAIRI le
0

Hmm, quelle plateforme et quelle version d'emacs utilisez-vous? Avec GNU Emacs 22.1.1 sous Windows Vista, cela fonctionne très bien pour moi.

Si, par hasard, vous faites cela de Windows à Linux via une visionneuse RealVNC, assurez-vous que vous exécutez d'abord "vncconfig -iconic" sur la machine Linux .....

kfh
la source
0

J'utilise toujours le collage rapide - faites glisser la sélection dans emacs, appuyez sur le bouton central de la souris dans la fenêtre cible.

(D'après la référence à kate, je suppose que vous êtes sous Linux ou similaire et que vous utilisez probablement emacs sous X d'une manière ou d'une autre.)

cannam
la source
0

Vous souhaiterez peut-être spécifier la plate-forme que vous utilisez. Est-ce sous Linux, Unix, MacOSX, Windows, MS-DOS?

Je pense que cela devrait fonctionner pour les fenêtres. Pour MacOSX, il sera ajouté au presse-papiers x-windows, ce qui n'est pas la même chose que le presse-papiers macosx. Pour Linux, cela dépend de votre saveur de gestionnaire de fenêtres, mais je crois que x-windows le gère d'une manière agréable sur la plupart d'entre eux.

Alors, veuillez préciser.

Mats Fredriksson
la source
-1

Ce que je fais, c'est utiliser un bon outil de terminal (PuTTY sous Windows, Konsole ou Terminal sous Linux) doté de fonctions de copie intégrées.

Dans PuTTY, vous mettez en surbrillance le texte souhaité avec la souris, puis vous le collez ailleurs. Un clic droit dans une fenêtre PuTTY colle le contenu du tampon copier / coller de Windows.

Dans Konsole ou Terminal sous Linux, vous mettez en surbrillance ce que vous voulez, puis appuyez sur Maj + Ctrl + C pour copier et Maj + Ctrl + V pour coller.

Dans la compilation win32 d'emacs, le texte copié le place dans le tampon copier / coller .. la plupart du temps.

Sur Mac OS X, les raccourcis Apple-key fonctionnent correctement, car Terminal les piège.

Il n'y a pas de moyen direct de le faire sur la ligne de commande car le shell ne maintient pas de tampon copier / coller pour chaque application. bash ne conserve une copie / coller du tampon pour lui - même, et, par défaut, emacs ^ k / ^ travail des raccourcis y.

garenne
la source