web-dev-qa-db-fra.com

Comment copier du texte depuis Emacs vers une autre application sous Linux

Lorsque 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 (tirer) dans une autre application.

105
memius

Insérez ce qui suit dans votre .emacs fichier:

(setq x-select-enable-clipboard t)
88
memius

Soyons prudents avec nos définitions ici

  • Une copie Emacs est la commande kill-ring-save (généralement lié à M-w).
  • A 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).
  • Un copie X est le texte en surbrillance "physique" avec le curseur de la souris.
  • Un Emacs paste est la commande yank (généralement liée à C-y).
  • Un collage système est ce que vous obtenez généralement en appuyant sur C-v (ou en choisissant "Edit-Paste" dans une fenêtre d'application).
  • Un coller X appuie 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) à ton .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 des presse-papiers X: le copier-coller dans ce cas est médié par le terminal . Par exemple, "Édition-> Coller" dans votre fenêtre de terminal devrait agir exactement comme si vous aviez tapé le texte du presse-papiers dans le tampon Emacs.

118
Chris Conway

Je colle ceci dans mon .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 d'avant en arrière dans Emacs vers toute autre application X11 ou Gnome.

Bonus: pour que ces choses se produisent dans Emacs sans avoir à recharger l'intégralité de votre .emacs, faites C-x C-e avec le curseur juste après la parenthèse fermée de chacune de ces expressions dans le tampon .emacs.

Bonne chance!

10
jfm3

La difficulté du copier-coller dans Emacs est que vous voulez qu'il fonctionne indépendamment du kill/yank interne et que vous vouliez qu'il fonctionne à la fois dans le terminal et dans l'interface graphique. Il existe des solutions robustes existantes 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-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)
10
RussellStewart

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

Il y a deux façons:

  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 coller.
  2. Mettez en surbrillance le texte souhaité puis "M-x clipboard-kill-ring-save" (notez que vous pouvez le lier à une touche plus simple). Ensuite, il suffit de "Modifier-> Coller" dans votre application préférée.

Opérations du presse-papiers disponibles:

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

Il y a n article EmacsWiki qui explique certains problèmes avec le copier-coller sous X et comment le configurer pour qu'il fonctionne.

6
cschol

Cela fonctionne avec M-w sur Mac 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

4
cevaris

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-p avec use-region-p pour couvrir le cas d'une région vide, ne retourne pas silencieusement si xsel n'a pas été installé (retourne un message d'erreur), et inclut une fonction "cut" (emacs C-y, windows C-x).

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

J'utilise ce qui suit, basé sur les autres réponses ici, pour faire C-x C-w et C-x C-y copiez et collez 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)))
0
asmeurer

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

Si, par hasard, vous faites cela de Windows à Linux via un visualiseur RealVNC, assurez-vous que vous exécutez d'abord "vncconfig -iconic" sur la boîte Linux .....

0
kfh

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 dans X d'une manière ou d'une autre.)

0
cannam

Vous voudrez peut-être spécifier la plate-forme que vous utilisez. Est-ce sur linux, unix, macosx, windows, ms-dos?

Je crois que pour les fenêtres, cela devrait fonctionner. 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 de manière agréable sur la plupart d'entre eux.

Alors, précisez.

0
Mats Fredriksson