Respostas:
Vamos ter cuidado com nossas definições aqui
kill-ring-save
(geralmente vinculado a M-w).yank
(geralmente vinculado a C-y).No meu caso (no GNOME):
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.
META-X set-variable RET select-enable-clipboard RET t
ou(setq select-enable-clipboard t)
Insira o seguinte em seu .emacs
arquivo:
(setq x-select-enable-clipboard t)
emacs -nw
, uso os próprios atalhos do terminal; Shift-Ctrl-X para cortar (eliminar) texto e Shift-Ctrl-C para copiar.
emacs -nw
dentro de janelas do tmux divididas horizontalmente.
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!
Symbol’s function definition is void: x-cut-buffer-or-selection-value
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)
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:
Operações da área de transferência disponíveis:
Há um artigo EmacsWiki que explica alguns problemas com copiar e colar no X e como configurá-lo para funcionar.
Isso funciona com M-w
no 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)
O código abaixo, inspirado pela resposta da @ RussellStewart acima, adiciona suporte para x-primário e x-secundário, substitui region-active-p
com use-region-p
para 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)
Eu uso o seguinte, com base nas outras respostas aqui, para fazer C-x C-w
e C-x C-y
ser 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)))
xclip
para colar o conteúdo da área de transferência usando xclip -o
. Isso pode ser útil para pessoas que já xclip
instalaram e não desejam instalar outro programa para copiar e colar.
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 .....
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.
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.