X-Git-Url: https://code.delx.au/gnu-emacs-elpa/blobdiff_plain/a5433b904ffc3b1cb51cc108e24a9d6bd6ca6bc6..30a24f9ee1c67f5e21744f87ce5adee9408aad1d:/packages/xclip/xclip.el diff --git a/packages/xclip/xclip.el b/packages/xclip/xclip.el index 27512f3f0..fd1a74885 100644 --- a/packages/xclip/xclip.el +++ b/packages/xclip/xclip.el @@ -1,11 +1,11 @@ -;;; xclip.el --- Emacs Interface to XClip +;;; xclip.el --- use xclip to copy&paste -*- lexical-binding: t; -*- -;; Copyright (C) 2007, 2012 Free Software Foundation, Inc. +;; Copyright (C) 2007, 2012, 2013 Free Software Foundation, Inc. ;; Author: Leo Liu ;; Keywords: convenience, tools ;; Created: 2007-12-30 -;; Version: 1.0 +;; Version: 1.3 ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by @@ -22,17 +22,33 @@ ;;; Commentary: -;; This code provides an Emacs interface to the tool with the same -;; name on http://people.debian.org/~kims/xclip/. -;; Just add (xclip-mode 1) to your ~/.emacs. +;; This package allows emacs to copy to and paste from the X clipboard +;; when running in xterm. It uses the external command-line tool xclip +;; found on http://xclip.sourceforge.net. +;; +;; To use: (xclip-mode 1) ;;; Code: -(defvar xclip-program "xclip" - "Name of XClip program tool.") -(defvar xclip-select-enable-clipboard t +(defcustom xclip-program "xclip" + "Name of the xclip program." + :type 'string + :group 'killing) + +(defcustom xclip-select-enable-clipboard t "Non-nil means cutting and pasting uses the clipboard. -This is in addition to, but in preference to, the primary selection.") +This is in addition to, but in preference to, the primary selection." + :type 'boolean + :group 'killing) + +(defcustom xclip-use-pbcopy&paste (and xclip-select-enable-clipboard + (eq system-type 'darwin) + (executable-find "pbcopy") + t) + "Non-nil means using pbcopy and pbpaste instead of xclip. +If non-nil `xclip-program' is ignored." + :type 'boolean + :group 'killing) (defvar xclip-last-selected-text-clipboard nil "The value of the CLIPBOARD X selection from xclip.") @@ -43,15 +59,20 @@ This is in addition to, but in preference to, the primary selection.") (defun xclip-set-selection (type data) "TYPE is a symbol: primary, secondary and clipboard. -See `x-set-selection'." - (when (and (executable-find xclip-program) (getenv "DISPLAY")) - (let* ((process-connection-type nil) - (proc (start-process "xclip" nil xclip-program - "-selection" (symbol-name type)))) +See also `x-set-selection'." + (let* ((process-connection-type nil) + (proc (cond + (xclip-use-pbcopy&paste + (start-file-process "pbcopy" nil "pbcopy")) + ((getenv "DISPLAY") + (start-file-process "xclip" nil xclip-program + "-selection" (symbol-name type)))))) + (when proc (process-send-string proc data) - (process-send-eof proc)))) + (process-send-eof proc)) + data)) -(defun xclip-select-text (text &optional push) +(defun xclip-select-text (text) "See `x-select-text'." (xclip-set-selection 'primary text) (setq xclip-last-selected-text-primary text) @@ -60,53 +81,62 @@ See `x-set-selection'." (setq xclip-last-selected-text-clipboard text))) (defun xclip-selection-value () - "See `x-cut-buffer-or-selection-value'." - (when (and (executable-find xclip-program) (getenv "DISPLAY")) - (let (clip-text primary-text) - (when xclip-select-enable-clipboard - (setq clip-text (shell-command-to-string - (concat (shell-quote-argument xclip-program) - " -o -selection clipboard"))) - (setq clip-text - (cond ;; check clipboard selection - ((or (not clip-text) (string= clip-text "")) - (setq xclip-last-selected-text-primary nil)) - ((eq clip-text xclip-last-selected-text-clipboard) nil) - ((string= clip-text xclip-last-selected-text-clipboard) - ;; Record the newer string, - ;; so subsequent calls can use the `eq' test. - (setq xclip-last-selected-text-clipboard clip-text) - nil) - (t (setq xclip-last-selected-text-clipboard clip-text))))) - (setq primary-text (shell-command-to-string - (concat (shell-quote-argument xclip-program) " -o"))) - (setq primary-text - (cond ;; check primary selection - ((or (not primary-text) (string= primary-text "")) - (setq xclip-last-selected-text-primary nil)) - ((eq primary-text xclip-last-selected-text-primary) nil) - ((string= primary-text xclip-last-selected-text-primary) - ;; Record the newer string, - ;; so subsequent calls can use the `eq' test. - (setq xclip-last-selected-text-primary primary-text) - nil) - (t (setq xclip-last-selected-text-primary primary-text)))) - (or clip-text primary-text)))) + "See `x-selection-value'." + (let ((clip-text (when xclip-select-enable-clipboard + (with-output-to-string + (cond + (xclip-use-pbcopy&paste + (process-file "pbpaste" nil standard-output nil)) + ((getenv "DISPLAY") + (process-file xclip-program nil standard-output nil + "-o" "-selection" "clipboard"))))))) + (setq clip-text + (cond ; Check clipboard selection. + ((or (not clip-text) (string= clip-text "")) + (setq xclip-last-selected-text-clipboard nil)) + ((eq clip-text xclip-last-selected-text-clipboard) + nil) + ((string= clip-text xclip-last-selected-text-clipboard) + ;; Record the newer string so subsequent calls can use the + ;; `eq' test. + (setq xclip-last-selected-text-clipboard clip-text) + nil) + (t (setq xclip-last-selected-text-clipboard clip-text)))) + (or clip-text + (when (and (not xclip-use-pbcopy&paste) (getenv "DISPLAY")) + (let ((primary-text (with-output-to-string + (process-file xclip-program nil + standard-output nil "-o")))) + (setq primary-text + (cond ; Check primary selection. + ((or (not primary-text) (string= primary-text "")) + (setq xclip-last-selected-text-primary nil)) + ((eq primary-text xclip-last-selected-text-primary) + nil) + ((string= primary-text xclip-last-selected-text-primary) + ;; Record the newer string so subsequent calls can + ;; use the `eq' test. + (setq xclip-last-selected-text-primary primary-text) + nil) + (t (setq xclip-last-selected-text-primary primary-text)))) + primary-text))))) (defun turn-on-xclip () (setq interprogram-cut-function 'xclip-select-text) (setq interprogram-paste-function 'xclip-selection-value)) -(defun turn-off-xclip () - (setq interprogram-cut-function nil) - (setq interprogram-paste-function nil)) - ;;;###autoload (define-minor-mode xclip-mode "Minor mode to use the `xclip' program to copy&paste." :global t (if xclip-mode - (add-hook 'terminal-init-xterm-hook 'turn-on-xclip) + (progn + (or xclip-use-pbcopy&paste + (executable-find xclip-program) + (signal 'file-error (list "Searching for program" + xclip-program "no such file"))) + ;; NOTE: See `tty-run-terminal-initialization' and term/README + (add-hook 'terminal-init-xterm-hook 'turn-on-xclip)) (remove-hook 'terminal-init-xterm-hook 'turn-on-xclip))) (provide 'xclip)