Adicionar área de transferência do sistema operacional para eliminar o anel

25

Muitas vezes me pego copiando um trecho de código da área de transferência do meu sistema operacional da Internet. Depois, dou os seguintes passos simples:

  1. Mudar para a minha janela do Emacs
  2. Encontre o local onde quero colar o código
  3. Use C-y( yank) para inserir o texto copiado.

No entanto, às vezes acho (para minha grande decepção) que involuntariamente usei alguma forma de comando de matar (como kill-wordou kill-line) enquanto estava na etapa 2. Nesses casos, o texto copiado da "área de transferência" nunca entra na matança anel.

Existe uma maneira de garantir que o texto copiado de outros aplicativos sempre chegue ao meu anel de morte?

Trabalho no Linux com mais frequência, mas também uso o Emacs regularmente no Windows e no Mac OS X, portanto, é preferível uma resposta independente do SO.

nispio
fonte
Posso sugerir este link ? navegar toda a página, você verá lotes de maneira diferente de copiar / colar de / para o clipboard
Nsukami _
@Nsukami_ Thanks. Vou tentar digeri-lo, mas a página vinculada é um excelente exemplo de por que me canso de procurar respostas no EmacsWiki. Muitos dos hackers da elisp parecem pensar que o código elisp é auto-documentado e não requer comentários nem explicações sobre função ou uso. Normalmente, não tenho tempo para fazer engenharia reversa do código apenas para decidir se ele faz o que eu quero ou não.
Nispio 7/10
haha, eu entendo;)
Nsukami _

Respostas:

31

Você precisa personalizar save-interprogram-paste-before-killpara t. Isso empurrará sua área de transferência para o matador, caso você mate algo no emacs antes de colar a área de transferência. Uma personalização relacionada é a yank-pop-change-selectionque empurra seu puxão atual no emacs para a área de transferência. Para que ambos funcionem, você precisa x-select-enable-clipboard(substituído pelo gui-select-enable-clipboardemacs 25.1) ser o tpadrão.

A razão pela qual isso é desativado por padrão é impedir o envio acidental de grande quantidade de dados para a eliminação que persiste durante toda a sessão, diferentemente da área de transferência que é facilmente substituída.

Vamsi
fonte
11
Ainda mais limpo e fácil do que eu esperava. save-interprogram-paste-before-killparece fazer exatamente o que eu quero!
Nispio 7/10
Estou no emacs 26 e gui-select-enable-clipboardé chamado just select-enable-clipboard.
Rune Kaagaard 10/04
3

outra solução é usar a ferramenta cli, se possível,

  • pbcopy / pbpaste no Mac

  • getclip / putclip no Cygwin

  • xsel no Linux
  • x-clipboard na GUI Emacs (como outros mencionados, você precisa ativar o sinalizador x-select-enable-clipboard).

A vantagem desta solução é que a área de transferência é sempre utilizável (por exemplo, quando você faz o ssh remoto).

Minha resposta tem duas partes. a primeira parte apresenta algumas ferramentas úteis para manipular a área de transferência. a parte dois responderá à sua pergunta original (guarde a área de transferência no anel de morte).

PARTE UM

Insira o código abaixo em seu ~ / .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)

PARTE DOIS

insira o código abaixo no seu ~ / .emacs e, a partir de agora, use "Mx colar-da-área de transferência-e-cc-matar-anel" para colar:

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