Copiar texto do Emacs para a área de transferência do OS X

25

Quando executo o Emacs em um terminal de texto em vez do modo normal da GUI, posso copiar no Emacs ativando o início de uma região com C-SPCe, em seguida, selecionar o que quero e fazer M-w.

Existe alguma maneira de obter uma região copiada dessa maneira disponível na área de transferência do OSX para colá-la em uma página da web (exceto executando o Emacs no modo GUI, obviamente)?

Não estou interessado em criar um atalho diferente para fazer isso e, idealmente, não deve exigir a instalação de nenhum módulo.

Eu já vi esse post e tentei a resposta aceita, mas ele não parece funcionar da maneira que espero acima.

Alguma outra ideia?

Galder Zamarreño
fonte
Cara, a questão é quase 3 anos de idade e foi respondida
Galder Zamarreño

Respostas:

33

Copie da área de transferência do Emacs para o OS X:

selecione a região então M-| pbcopy RET

Cole da área de transferência do OS X no Emacs:

C-u M-| pbpaste RET (substitui a região atual, se existir)


Explicação:

M-|é executado shell-command-on-region, como o nome indica canaliza a região atual para um comando shell. C-u M-|faz a mesma coisa, mas substitui a região atual pela stdoutdo comando que está sendo executado.

pbcopye pbpastesão utilitários do OS X para acessar a área de transferência do sistema.

Andrei Simionescu
fonte
1
Além de responder à pergunta, sua resposta me ensinou a executar comandos de shell do emacs, Amazing.
andreskwan
20

O seguinte simplesmente funciona, copiado daqui

(defun copy-from-osx ()
  (shell-command-to-string "pbpaste"))

(defun paste-to-osx (text &optional push)
  (let ((process-connection-type nil))
    (let ((proc (start-process "pbcopy" "*Messages*" "pbcopy")))
      (process-send-string proc text)
      (process-send-eof proc))))

(setq interprogram-cut-function 'paste-to-osx)
(setq interprogram-paste-function 'copy-from-osx)
Galder Zamarreño
fonte
O palavreado aqui parece para trás
Jordon Biondo
1
Com-mode mal, isso quebra o comportamento vimish colando
Felix D.
@FelixD .: xclip-modesofre do mesmo problema?
Stefan
Isso parece estar quebrado no Emacs26 ao copiar e colar caracteres multibyte, conforme descrito em emacs.stackexchange.com/questions/50485/…
silencej
9

Se você usa o Emacs "da maneira normal" (ou seja, como um aplicativo GUI), ele já deve fazer isso por padrão. Se você usa o Emacs dentro de um emulador de terminal, na verdade ele não sabe como fazer isso por padrão, mas você pode instalar o xclippacote do GNU ELPA e ativar o xclip-modeque ensina ao Emacs como fazer isso tanto no GNU / Linux quanto no GNU / Linux. OSX.

Stefan
fonte
Funciona xclipcom OSX? Pelo que tenho visto por aí, parece ser projetado para funcionar com o X11, consulte pós
Galder Zamarreño
1
o xclip.elpacote foi estendido para uso pbpaste.
27615 Stefan
O emacs terminal no modo de servidor (não como uma instância regular) congela quando eu uso o xclip no macOS por algum motivo.
precisa saber é o seguinte
Você poderia denunciá-lo como um bug (diretamente para mim ou via M-x report-emacs-bug?
Stefan
3

Como Stefan disse, os aplicativos gráficos do Emacs devem fazer isso por padrão.

Em um terminal de texto, outra opção é usar funções como esta:

(defun pbcopy ()
  (interactive)
  (let ((deactivate-mark t))
    (call-process-region (point) (mark) "pbcopy")))

(defun pbpaste ()
  (interactive)
  (call-process-region (point) (if mark-active (mark) (point)) "pbpaste" t t))

(defun pbcut ()
  (interactive)
  (pbcopy)
  (delete-region (region-beginning) (region-end)))
nisetama
fonte
exceto quando não. 20 anos depois, mesmo pb no emacs .... Eu realmente gostaria que houvesse alguma comum e terra são, set em pedra em algum lugar
nicolas
1

Aqui está uma função elisp simples que você pode colocar no arquivo .emacs que copia o conteúdo do buffer em que está na área de transferência. Você não precisa selecionar nada, ele copia tudo. O código é curto e bastante auto-explicativo.

(defun xclip ()
(interactive)
(shell-command (concat "cat " (buffer-file-name (window-buffer (minibuffer-selected-window))) " | pbcopy")))
jumar
fonte
Depois de carregar ou recarregar o emacs, chame-o com o Mx xclip.
21718 jumar
O OP não pediu para copiar todo o buffer para a área de transferência, portanto, isso não faz o que foi solicitado. Quanto ao resto, isso parece apenas duplicar o que outros já disseram.
Stefan
Peço desculpas se isso parece fora de tópico. Naveguei para esta página do Google, onde foi o primeiro resultado para "copiar texto para o emacs da área de transferência". A pergunta é intitulada "Copiar texto do Emacs para a área de transferência do OS X", portanto é fácil ver como você pode terminar aqui para esse resultado de pesquisa. Eu acho que é aplicável à maneira como a frase postada é sua pergunta, um superconjunto dela. Eu visitei as respostas do StackExchange antes e fiquei frustrado quando uma resposta simples não estava disponível, especialmente quando eu sabia que milhares de pessoas estavam fazendo a pergunta, então pensei em adicionar a minha para pessoas que poderiam se beneficiar.
jumar
0

Confira clipboard-kill-regione clipboard-yank. Estes vêm menu-bar.el.

Depois que uma região é destacada, você pode usar a área de transferência para matar a região no buffer de colagem e na área de transferência do sistema. clipboard-yank "cola" o que estiver atualmente na área de transferência do sistema.

bitops
fonte
Por favor, expanda sua resposta.
Dan
Tentei copiar algo do emacs usando esses comandos e não estava disponível externamente para copiá-lo em outro lugar fora do Emacs.
Galder Zamarreño 27/04
@ GalderZamarreño funciona para mim no Emacs e estou no OSX.
bitops
0

A resposta de Galder Zamarreño é ótima, no entanto, quebra o putcomportamento do mal no modo do mal. Portanto, adaptei-o um pouco abaixo - tenho certeza de que poderia ser melhor, mas faz o trabalho para mim. Sinta-se livre para sugerir melhorias:

(defun copy-from-osx ()
  (shell-command-to-string "pbpaste"))

(defun paste-to-osx (text &optional push)
  (let ((process-connection-type nil))
    (let ((proc (start-process "pbcopy" "*Messages*" "pbcopy")))
      (process-send-string proc text)
      (process-send-eof proc))))

----> Novo Código

  (defun clipboard-on ()
    (interactive)
    (setq interprogram-cut-function 'paste-to-osx)
    (setq interprogram-paste-function 'copy-from-osx))
  (defun clipboard-off ()
    (interactive)
    (setq interprogram-cut-function 'gui-select-text)
    (setq interprogram-paste-function 'gui-selection-value))
  (global-set-key (kbd "C-c C-p") 'clipboard-on)
  (global-set-key (kbd "C-c C-y") 'clipboard-off))
tcelferact
fonte