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)