Ajouter le presse-papiers du système d'exploitation pour tuer l'anneau

25

Souvent, je me retrouve à copier un extrait de code dans le presse-papiers de mon système d'exploitation à partir d'Internet. Ensuite, je prends les étapes simples suivantes:

  1. Passer à ma fenêtre Emacs
  2. Trouvez l'endroit où je veux coller le code
  3. Utilisez C-y( yank) pour insérer le texte copié.

Cependant, parfois je trouve (à ma grande déception) que j'ai involontairement utilisé une certaine forme de commande kill (comme kill-wordou kill-line) pendant que j'étais à l'étape 2. Dans de tels cas, le texte copié du "presse-papiers" ne parvient jamais au kill bague.

Existe-t-il un moyen de s'assurer que le texte copié à partir d'autres applications arrive toujours dans mon kill ring?

Je travaille le plus souvent sous Linux, mais j'utilise également Emacs régulièrement sur Windows et Mac OS X, donc une réponse indépendante du système d'exploitation est préférable.

nispio
la source
Puis-je suggérer ce lien ? parcourant toute la page, vous verrez de nombreuses façons différentes de copier / coller depuis / vers le presse
Nsukami _
@Nsukami_ Merci. Je vais essayer de le digérer, mais la page liée est un excellent exemple de pourquoi je me lasse de chercher des réponses sur EmacsWiki. De nombreux hackers elisp semblent penser que le code elisp est auto-documenté et ne nécessite aucun commentaire ni explication sur la fonction ou l'utilisation. Je n'ai généralement pas le temps de faire de l'ingénierie inverse du code juste pour décider s'il fait ce que je veux ou non.
nispio
haha, je comprends;)
Nsukami _

Réponses:

31

Vous devez personnaliser save-interprogram-paste-before-killpour t. Cela poussera votre presse-papiers sur le killring au cas où vous tueriez quelque chose dans emacs avant de coller le presse-papiers. Une personnalisation associée est celle yank-pop-change-selectionqui pousse votre yank actuel dans emacs dans le presse-papiers. Pour que ces deux éléments fonctionnent, vous devez x-select-enable-clipboard(remplacé par gui-select-enable-clipboarddans emacs 25.1) être celui tqui est par défaut.

La raison pour laquelle cette option est désactivée par défaut est d'empêcher la transmission involontaire d'une grande quantité de données sur le killring qui persiste tout au long de la session, contrairement au presse-papiers qui est facilement remplacé.

Vamsi
la source
1
Encore plus propre et plus facile que ce à quoi je m'attendais. save-interprogram-paste-before-killsemble faire exactement ce que je veux!
nispio
Je suis sur emacs 26, et je m'appelle gui-select-enable-clipboardjuste select-enable-clipboard.
Rune Kaagaard
3

une autre solution consiste simplement à utiliser l'outil cli si possible,

  • pbcopy / pbpaste sur Mac

  • getclip / putclip sur Cygwin

  • xsel sur Linux
  • x-clipboard dans GUI Emacs (comme d'autres l'ont mentionné, vous devez activer le drapeau x-select-enable-clipboard).

L'avantage de cette solution est que le presse-papiers est toujours utilisable (par exemple, lorsque vous distant ssh).

Ma réponse comporte deux parties. la première partie présente quelques outils pratiques pour manipuler le presse-papiers. la deuxième partie répondra à votre question initiale (rangez le presse-papiers dans le kill ring).

PARTIE UN

Insérez le code ci-dessous dans votre ~ / .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)

DEUXIÈME PARTIE

insérez le code ci-dessous dans votre ~ / .emacs, et à partir de maintenant, utilisez "Mx paste-from-clipboard-and-cc-kill-ring" pour coller:

(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
la source