Faça o emacs copiar explicitamente para / dos buffers de seleção e de área de transferência do X11?

2

Em vim você pode copiar / colar explicitamente para / do buffer de seleção X11 e do buffer da área de transferência usando "*y e "+y , respectivamente.

Meu emacs é (aparentemente - não é intencional da minha parte) configurado para usar o buffer de seleção para C-w , C-y e amigos.

Existem funções que eu posso chamar, análogo a kill-region e yank que usam o buffer da área de transferência?

Para ser claro, quero acesso seletivo aos dois buffers ao mesmo tempo. Com base em algumas pesquisas rápidas na Web, parece que há variáveis de configuração que posso definir, que alterarão globalmente yank para usar um buffer ou outro. Eu quero ser capaz de selecionar, assim como os registros de * e + do vim permitem.

(Espero ter obtido a terminologia correta: quando eu digo "buffer de seleção", quero dizer o buffer onde você pode destacar o texto com o mouse e meio-clique para colar. Quando eu digo "buffer da área de transferência" , Quero dizer o lugar onde o texto vai quando copiado por ctrl - c em aplicativos que não são emacs.)

Editar : a resposta do bzg é muito próxima.

No gnome-terminal, eu seleciono ~ / projects com o mouse, então mouse direito - > cópia de. Então eu seleciono / home. Ainda no gnome-terminal, quando eu faço:

  • meio-mouse: / home
  • botão direito do mouse - > cole: ~ / projetos

Quando eu entro no emacs e faço:

  • meio-mouse: / home
  • M-y (yank): / home
  • C-S-y (meu-yank): ~ / projetos

Ótimo! yank usa o buffer de seleção e my-yank usa a área de transferência.

Agora, ainda no emacs, eu faço:

  • C-SPC M-f M-f C-w (torna a região "regular kill" e mata)

depois vá para o gnome-terminal e faça:

  • médio-mouse: "matar regularmente"
  • botão direito do mouse - > cole: ~ / projetos

Ótimo! Apenas o buffer de seleção foi alterado, não a área de transferência.

Então, de volta ao emacs, eu faço:

  • C-SPC M-f M-f C-S-w (torna a região "my kill" e mata)

depois vá para o gnome-terminal e faça:

  • meio-mouse: matar regularmente
  • botão direito do mouse - > cole: ~ / projetos

Isso está errado, o buffer da área de transferência deve conter "minha morte".

Meu interprogram-cut-function é x-select-text . Meu x-select-enable-clipboard é nil .

    
por bstpierre 02.05.2012 / 22:58

3 respostas

1

A resposta de bzg chega bem perto, mas a alternância de interprogram-cut-function não é suficiente - acredito que ela acaba em nil porque essa variável tem um valor quando a função é iniciada.

Esse conjunto revisado de funções faz exatamente o que eu quero, definindo explicitamente a área de transferência / primária ativa em cada uma delas. Grande dica de chapéu para bzg para me pegar no caminho certo!

(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)
    
por 03.05.2012 / 14:59
3

Este código mapeará C-S-y e C-S-w para versões customizadas de yank e kill-region que irão alternar temporariamente o uso da área de transferência:

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

Então, se você copiou algo no X e não o deseja quando faz o yanking no Emacs, use C-S-y . Se você matar algo no Emacs e não o quiser na área de transferência do X, use C-S-w .

Tudo isso supondo que você está usando os valores padrão para x-select-enable-clipboard' and interprogram-cut-function ', é claro.

    
por 03.05.2012 / 06:38
0

O Emacs fornece algumas funções úteis em menu-bar.el , de todos os lugares. Então eu tenho:

 (global-set-key [(control shift ?w)] 'clipboard-kill-ring-save)
 (global-set-key [(control shift ?y)] 'clipboard-yank)
    
por 04.05.2015 / 15:01