Como copiar texto do Emacs para outro aplicativo no Linux

113

Quando recorto (mato) texto no Emacs 22.1.1 (em sua própria janela no X, no KDE, no Kubuntu), não consigo colar (arrancar) em qualquer outro aplicativo.

memius
fonte
Eu sugiro que você leia isto: CopyAndPaste-Emacs Wiki . Isso explica muito bem o problema da turnê.
El Borito

Respostas:

122

Vamos ter cuidado com nossas definições aqui

  • Uma cópia do Emacs é o comando kill-ring-save(geralmente vinculado a M-w).
  • Uma cópia do sistema é o que você normalmente obtém pressionando C-c(ou escolhendo "Editar-> Copiar" em uma janela de aplicativo).
  • Uma cópia X está destacando "fisicamente" o texto com o cursor do mouse.
  • Uma pasta Emacs é o comando yank(geralmente vinculado a C-y).
  • Uma colagem do sistema é o que você normalmente obtém pressionando C-v(ou escolhendo "Editar-Colar" em uma janela de aplicativo).
  • Uma pasta X é pressionar o "botão central do mouse" (simulado pressionando os botões esquerdo e direito do mouse juntos).

No meu caso (no GNOME):

  • Tanto o Emacs quanto a cópia do sistema geralmente funcionam com o X paste.
  • A cópia do X geralmente funciona com a colagem do Emacs.
  • Para fazer a cópia do sistema funcionar com a colagem do Emacs e a cópia do Emacs funcionar com a colagem do sistema, você precisa adicionar (setq x-select-enable-clipboard t)ao seu arquivo .emacs. Ou tente

    META-X set-variable RET x-select-enable-clipboard RET t

Eu acho que este é o comportamento do Unix moderno bastante padrão.

Também é importante observar (embora você diga que está usando o Emacs em uma janela separada) que quando o Emacs está sendo executado em um console, ele é completamente divorciado do sistema e da área de transferência do X: cortar e colar nesse caso é mediado pelo terminal . Por exemplo, "Editar-> Colar" na janela do seu terminal deve agir exatamente como se você tivesse digitado o texto da área de transferência no buffer do Emacs.

Chris Conway
fonte
7
Esta é uma terminologia confusa . O nome padrão e menos confuso para o que você chama de “X copiar / colar” é a seleção primária X. O que você chama de “copiar / colar do sistema” é a área de transferência do X.
Gilles 'SO- pare de ser mal'
Obrigado ... parece que a variável foi renomeada desde que isso foi escrito. META-X set-variable RET select-enable-clipboard RET tou(setq select-enable-clipboard t)
David McCorrie
95

Insira o seguinte em seu .emacsarquivo:

(setq x-select-enable-clipboard t)
memius
fonte
3
Não prolixo, diz o que você precisa saber. Excelente resposta.
JasonFruit
Funciona perfeitamente, eu uso o Ubuntu 12.04. Obrigado
zhihong
7
Bom e simples, mas isso não funciona no terminal. Não há razão para que o mesmo atalho não funcione tanto no terminal quanto em uma janela livre, e algumas das respostas abaixo abordam os dois simultaneamente.
RussellStewart
1
Quando corro emacs -nw, uso os próprios atalhos do terminal; Shift-Ctrl-X para cortar (eliminar) texto e Shift-Ctrl-C para copiar.
memius
4
Isso não vai funcionar quando você executar emacs -nwdentro de janelas do tmux divididas horizontalmente.
Sridhar Ratnakumar de
11

Coloco isso no meu .emacs:

(setq x-select-enable-clipboard t)
(setq interprogram-paste-function 'x-cut-buffer-or-selection-value)

Subseqüentemente, basicamente não tenho problemas para recortar e colar de qualquer coisa no Emacs para qualquer outro aplicativo X11 ou Gnome.

Bônus: para fazer essas coisas acontecerem no Emacs sem ter que recarregar todo o seu .emacs, faça Cx Ce com o cursor logo após o parêntese de fechamento de cada uma dessas expressões no buffer .emacs.

Boa sorte!

jfm3
fonte
3
Esta solução funciona para o emacs em uma janela X, ou seja, o emacs está sendo executado dentro de uma janela, se você estiver executando o emacs na linha de comando, o que você precisa é: stackoverflow.com/questions/5288213/…
elviejo79
Symbol’s function definition is void: x-cut-buffer-or-selection-value
sempre
10

A dificuldade de copiar e colar no Emacs é que você deseja que funcione independentemente do kill / yank interno e que funcione tanto no terminal quanto na interface do usuário. Existem soluções robustas para terminal ou gui, mas não para ambos. Depois de instalar o xsel (por exemplo sudo apt-get install xsel), aqui está o que eu faço para copiar e colar para combiná-los:

(defun copy-to-clipboard ()
  (interactive)
  (if (display-graphic-p)
      (progn
        (message "Yanked region to x-clipboard!")
        (call-interactively 'clipboard-kill-ring-save)
        )
    (if (region-active-p)
        (progn
          (shell-command-on-region (region-beginning) (region-end) "xsel -i -b")
          (message "Yanked region to clipboard!")
          (deactivate-mark))
      (message "No region active; can't yank to clipboard!")))
  )

(defun paste-from-clipboard ()
  (interactive)
  (if (display-graphic-p)
      (progn
        (clipboard-yank)
        (message "graphics active")
        )
    (insert (shell-command-to-string "xsel -o -b"))
    )
  )

(global-set-key [f8] 'copy-to-clipboard)
(global-set-key [f9] 'paste-from-clipboard)
RussellStewart
fonte
Pois estou recebendo erro porque não há params. Eu preciso mudar a primeira linha "(defun copy-to-clipboard ()" para "(defun copy-from-ubuntu (texto & push opcional)". Isso funciona para mim: D
Renato Cassino
Funciona, mas a operação de colagem é muito lenta. Isso poderia ser relacionado à rede?
sempre
7

Presumo que por emacs você está se referindo a Emacs sob X (ou seja, não dentro de uma janela de terminal).

Existem duas maneiras:

  1. (Aplica-se apenas a sistemas operacionais unix) Realce o texto desejado com o mouse (isso o copia para a área de transferência do X) e clique com o botão do meio para colar.
  2. Selecione o texto desejado e, em seguida, "Mx clipboard-kill-ring-save" (note que você pode vincular isso a uma tecla mais fácil). Em seguida, basta "Editar-> Colar" em seu aplicativo favorito.

Operações da área de transferência disponíveis:

  • clipboard-kill-ring-save - copia a seleção do Emacs para a área de transferência
  • área de eliminação da área de transferência - corta a seleção do Emacs para a área de transferência
  • clipboard-yank - colar da área de transferência para o Emacs
PDQ
fonte
7

um artigo EmacsWiki que explica alguns problemas com copiar e colar no X e como configurá-lo para funcionar.

cschol
fonte
Há uma entrada no wiki do emacs para copiar e colar. Isso é muito ruim.
Nicolas
4

Isso funciona com M-wno Mac OSX. Basta adicionar ao seu arquivo .emacs .

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

Fonte https://gist.github.com/the-kenny/267162

cevaris
fonte
1

O código abaixo, inspirado pela resposta da @ RussellStewart acima, adiciona suporte para x-primário e x-secundário, substitui region-active-pcom use-region-ppara cobrir o caso de uma região vazia, não retorna silenciosamente se XSEL não foi instalado (retorna uma mensagem de erro), e inclui uma função "cortar" (emacs Cy, windows Cx).

(defun my-copy-to-xclipboard(arg)
  (interactive "P")
  (cond
    ((not (use-region-p))
      (message "Nothing to yank to X-clipboard"))
    ((and (not (display-graphic-p))
         (/= 0 (shell-command-on-region
                 (region-beginning) (region-end) "xsel -i -b")))
      (error "Is program `xsel' installed?"))
    (t
      (when (display-graphic-p)
        (call-interactively 'clipboard-kill-ring-save))
      (message "Yanked region to X-clipboard")
      (when arg
        (kill-region  (region-beginning) (region-end)))
      (deactivate-mark))))

(defun my-cut-to-xclipboard()
  (interactive)
  (my-copy-to-xclipboard t))

(defun my-paste-from-xclipboard()
  "Uses shell command `xsel -o' to paste from x-clipboard. With
one prefix arg, pastes from X-PRIMARY, and with two prefix args,
pastes from X-SECONDARY."
  (interactive)
  (if (display-graphic-p)
    (clipboard-yank)
   (let*
     ((opt (prefix-numeric-value current-prefix-arg))
      (opt (cond
       ((=  1 opt) "b")
       ((=  4 opt) "p")
       ((= 16 opt) "s"))))
    (insert (shell-command-to-string (concat "xsel -o -" opt))))))

(global-set-key (kbd "C-c C-w") 'my-cut-to-xclipboard)
(global-set-key (kbd "C-c M-w") 'my-copy-to-xclipboard)
(global-set-key (kbd "C-c C-y") 'my-paste-from-xclipboard)
user1404316
fonte
Há algum motivo para não sobrescrever os atalhos de teclado padrão?
Paul Brodersen
@Paul: Os 'atalhos de teclado padrão' são para a 'área de transferência interna do emacs', que é diferente da área de transferência do X. Citei o termo 'área de transferência interna do emacs' porque a terminologia do emacs é diferente - consulte a excelente explicação de Chris Conway, acima.
user1404316
1

Eu uso o seguinte, com base nas outras respostas aqui, para fazer C-x C-we C-x C-yser copiado e colado no Mac e no Linux (se alguém souber a versão para Windows, sinta-se à vontade para adicioná-la). Observe que no Linux você terá que instalar o xsel e o xclip com seu gerenciador de pacotes.

;; Commands to interact with the clipboard

(defun osx-copy (beg end)
  (interactive "r")
  (call-process-region beg end  "pbcopy"))

(defun osx-paste ()
  (interactive)
  (if (region-active-p) (delete-region (region-beginning) (region-end)) nil)
  (call-process "pbpaste" nil t nil))

(defun linux-copy (beg end)
  (interactive "r")
  (call-process-region beg end  "xclip" nil nil nil "-selection" "c"))

(defun linux-paste ()
  (interactive)
  (if (region-active-p) (delete-region (region-beginning) (region-end)) nil)
  (call-process "xsel" nil t nil "-b"))

(cond
 ((string-equal system-type "darwin") ; Mac OS X
  (define-key global-map (kbd "C-x C-w") 'osx-copy)
  (define-key global-map (kbd "C-x C-y") 'osx-paste))
 ((string-equal system-type "gnu/linux") ; linux
  (define-key global-map (kbd "C-x C-w") 'linux-copy)
  (define-key global-map (kbd "C-x C-y") 'linux-paste)))
asmeurer
fonte
1
Na verdade, você também pode usar xclippara colar o conteúdo da área de transferência usando xclip -o. Isso pode ser útil para pessoas que já xclipinstalaram e não desejam instalar outro programa para copiar e colar.
Amin NAIRI
0

Hmm, qual plataforma e qual versão do emacs você está usando? Com o GNU Emacs 22.1.1 no Windows Vista, ele funciona bem para mim.

Se, por acaso, você estiver fazendo isso do Windows para o Linux através de um visualizador RealVNC, certifique-se de que está executando "vncconfig -iconic" na máquina do Linux primeiro .....

kfh
fonte
0

Eu sempre uso colar rápido - selecionar arrastar no emacs, apertar o botão do meio do mouse na janela de destino.

(Pela referência a kate, suponho que você esteja no Linux ou semelhante e provavelmente usando emacs no X de uma forma ou de outra.)

Cannam
fonte
0

Você pode querer especificar a plataforma que está usando. É no linux, unix, macosx, windows, ms-dos?

Eu acredito que para windows deve funcionar. Para MacOSX, ele será adicionado à área de transferência do x-windows, que não é a mesma coisa que a área de transferência do macosx. Para o Linux, depende do seu tipo de gerenciador de janelas, mas acredito que o x-windows lida com isso de uma maneira agradável na maioria deles.

Portanto, especifique.

Mats Fredriksson
fonte
-1

O que eu faço é usar uma boa ferramenta de terminal (PuTTY no Windows, Konsole ou Terminal no Linux) que possui recursos de cópia integrados.

No PuTTY, você destaca o texto desejado com o mouse e, a seguir, cola-o em outro lugar. Clicar com o botão direito em uma janela PuTTY cola o conteúdo do buffer de copiar / colar do Windows.

No Konsole ou Terminal no Linux, você realça o que deseja e pressiona Shift + Ctrl + C para copiar e Shift + Ctrl + V para colar.

Na compilação win32 do emacs, arrancar texto o coloca no buffer de copiar / colar .. na maioria das vezes.

No Mac OS X, os atalhos da tecla Apple funcionam bem, porque o Terminal os intercepta.

Não há uma maneira direta de fazer isso na linha de comando porque o shell não mantém um buffer de copiar / colar para cada aplicativo. festa faz manter um copy / paste tampão por si, e, por padrão, emacs ^ k / ^ y atalhos trabalho.

Warren
fonte