Copy/paste with emacs in terminal
Posted by Hugo Heden on March 8, 2009
I often run emacs in a terminal window. The following is a way to get copy-paste “working” to and from other applications. Note that it requires xsel, “a command-line program for getting and setting the contents of the X selection”. See also http://shreevatsa.wordpress.com/2006/10/22/emacs-copypaste-and-x/
;; http://hugoheden.wordpress.com/2009/03/08/copypaste-with-emacs-in-terminal/ ;; I prefer using the "clipboard" selection (the one the ;; typically is used by c-c/c-v) before the primary selection ;; (that uses mouse-select/middle-button-click) (setq x-select-enable-clipboard t) ;; If emacs is run in a terminal, the clipboard- functions have no ;; effect. Instead, we use of xsel, see ;; http://www.vergenet.net/~conrad/software/xsel/ -- "a command-line ;; program for getting and setting the contents of the X selection" (unless window-system ;; Callback for when user cuts (defun xsel-cut-function (text &optional push) ;; Insert text to temp-buffer, and "send" content to xsel stdin (with-temp-buffer (insert text) ;; I prefer using the "clipboard" selection (the one the ;; typically is used by c-c/c-v) before the primary selection ;; (that uses mouse-select/middle-button-click) (call-process-region (point-min) (point-max) "xsel" nil 0 nil "--clipboard" "--input"))) ;; Call back for when user pastes (defun xsel-paste-function() ;; Find out what is current selection by xsel. If it is different ;; from the top of the kill-ring (car kill-ring), then return ;; it. Else, nil is returned, so whatever is in the top of the ;; kill-ring will be used. (let ((xsel-output (shell-command-to-string "xsel --clipboard --output"))) (unless (string= (car kill-ring) xsel-output) xsel-output ))) ;; Attach callbacks to hooks (setq interprogram-cut-function 'xsel-cut-function) (setq interprogram-paste-function 'xsel-paste-function) ;; Idea from ;; http://shreevatsa.wordpress.com/2006/10/22/emacs-copypaste-and-x/ ;; http://www.mail-archive.com/help-gnu-emacs@gnu.org/msg03577.html )
Thanks to Nikolaj Schumacher and Miles Bader on the help-gnu-emacs mailing list for helping out.
robinzoni said
This is a great hack and it works perfectly. I’ve been looking for similar solution for months. Thank you so much for sharing it. You made my day.
Cheers,
rbz
Emacs copy/paste and X « The Lumber Room said
[...] clipboard into Emacs. In some of the comments below, Richard Lewis had the idea of using xsel, and Hugo Heden completed it further. Possibly related posts: (automatically generated)Using EmacsclientEditing TEXTAREAs in an external [...]
Tim said
Thanks, I’ve been looking for this for a long time, very nice. I suppose the correct way of loading the functions is by putting a line in my `.emacs’ file, this worked for me:
(load "~/copypaste/copypaste.el")Hugo Heden said
Yes, thanks for mentioning that, that looks reasonable. (You could also just paste the whole piece of code into .emacs, but your version seems cleaner.) More about loading files: http://www.gnu.org/software/emacs/emacs-lisp-intro/html_node/Loading-Files.html