Copy/paste with emacs in terminalPosted: 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/
;; https://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 (when (getenv "DISPLAY") ;; 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://firstname.lastname@example.org/msg03577.html ))
Thanks to Nikolaj Schumacher and Miles Bader on the help-gnu-emacs mailing list for helping out.