Question Faire emacs explicitement copier vers / depuis la sélection X11 et les tampons du Presse-papiers?


Dans vim vous pouvez explicitement copier / coller vers / depuis le tampon de sélection X11 et le tampon du presse-papiers en utilisant "*y et "+y, respectivement.

Mon emacs est (apparemment - ce n'est pas intentionnel de ma part) mis en place pour utiliser le tampon de sélection pour C-w, C-y, et amis.

Existe-t-il des fonctions que je peux appeler, analogues à kill-region et yank qui utilise le tampon du presse-papier?

Pour être clair, je veux un accès sélectif aux deux tampons en même temps. Sur la base de quelques recherches rapides sur le Web, il semble que des variables de configuration puissent être configurées pour changer globalement yank utiliser un tampon ou l'autre. Je veux pouvoir sélectionner, tout comme vim's * et + les registres permettent.

(J'espère que j'ai bien compris la terminologie: quand je dis "tampon de sélection", je veux dire le tampon où vous pouvez surligner le texte avec la souris et cliquer dessus pour coller. Quand je dis "tampon du presse-papier", le texte est copié par ctrl-c dans les applications non-emacs.)

modifier: la réponse de bzg est vraiment proche.

Dans gnome-terminal, je sélectionne ~ / projects avec la souris, puis souris droite -> copier. Puis je sélectionne / home. Toujours dans gnome-terminal, quand je fais:

  • souris du milieu: / home
  • droit de la souris -> coller: ~ / projets

Lorsque je me déplace dans emacs et que je fais:

  • souris du milieu: / home
  • M-y (yank): / home
  • C-S-y (my-yank): ~ / projets

Génial! yank utilise le tampon de sélection et my-yank utilise le presse-papier.

Maintenant, toujours dans emacs, je fais:

  • C-SPC M-f M-f C-w (fait que la région "tue régulièrement" et tue)

puis allez à gnome-terminal et faites:

  • middle-mouse: "tuer régulièrement"
  • droit de la souris -> coller: ~ / projets

Génial! Seul le tampon de sélection a été modifié, pas le presse-papier.

Puis, de retour à emacs, je fais:

  • C-SPC M-f M-f C-S-w (faire de la région "mon kill", et le tuer)

puis allez à gnome-terminal et faites:

  • middle-mouse: tuer régulièrement
  • droit de la souris -> coller: ~ / projets

C'est faux, le tampon du presse-papiers devrait contenir "my kill".

ma interprogram-cut-function est x-select-text. ma x-select-enable-clipboard est nil.


2
2018-05-02 20:58


origine




Réponses:


Ce code cartographiera C-S-y et C-S-w vers des versions personnalisées de yank et kill-region cela va temporairement basculer l'utilisation du presse-papiers:

(defun my-yank (&optional arg)
  (interactive "*P")
  (let ((x-select-enable-clipboard (not x-select-enable-clipboard)))
    (yank arg)))

(defun my-kill-region (beg end)
  (interactive "r")
  (let ((interprogram-cut-function
     (when (not (eq interprogram-cut-function 'x-select-text))
       'x-select-text)))
    (kill-region beg end)))

(define-key global-map (kbd "C-S-w") 'my-kill-region)
(define-key global-map (kbd "C-S-y") 'my-yank)

Donc, si vous avez copié quelque chose dans X et que vous ne le voulez pas lorsque vous arrivez à Emacs, utilisez C-S-y. Si vous tuez quelque chose dans Emacs et que vous ne le voulez pas dans le presse-papier X, utilisez C-S-w.

Tout cela en supposant que vous utilisez les valeurs par défaut pour x-select-enable-clipboard' andinterprogram-cut-function ', bien sûr.


3
2018-05-03 04:38



Merci beaucoup! Vous m'avez orienté dans la bonne direction. Si vous voyez la modification de ma question, l’un des cas de test échoue. Votre my-kill-regionne met rien dans le presse-papiers. Voir ma réponse avec des révisions de vos fonctions pour une version de travail. - bstpierre


La réponse de bzg est vraiment proche, mais le basculement de interprogram-cut-function ne fait pas tout à fait le tour - je crois que ça finit nil car cette variable a une valeur lorsque la fonction démarre.

Cet ensemble de fonctions révisé fait exactement ce que je veux, en définissant explicitement le presse-papier / primaire active dans chacun. Astuce pour bzg de me mettre sur la bonne voie!

(defun my-yank (&optional arg)
  "Yank from the clipboard, not the primary selection."
  (interactive "*P")
  (let ((x-select-enable-clipboard t)
        (x-select-enable-primary nil))
    (yank arg)))

(defun my-kill-region (beg end)
  "Kill to the clipboard, not the primary selection."
  (interactive "r")
  (let ((x-select-enable-clipboard t)
        (x-select-enable-primary nil))
    (kill-region beg end)))

(defun my-kill-ring-save (beg end)
  "Save to the clipboard, not the primary selection."
  (interactive "r")
  (let ((x-select-enable-clipboard t)
        (x-select-enable-primary nil))
    (kill-ring-save beg end)))

(define-key global-map (kbd "C-S-w") 'my-kill-region)
(define-key global-map (kbd "C-M-S-w") 'my-kill-ring-save)
(define-key global-map (kbd "C-S-y") 'my-yank)

1
2018-05-03 12:59



my-kill-region devrait être (interactive "*r") - car kill-region modifie le tampon. - Toby Speight


Emacs fournit des fonctions utiles dans menu-bar.el, de tous les lieux Donc j'ai:

 (global-set-key [(control shift ?w)] 'clipboard-kill-ring-save)
 (global-set-key [(control shift ?y)] 'clipboard-yank)

0
2018-05-04 13:01