emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] master b6aee5c: * xclip/xclip.el: Add support for `xsel` and Cygw


From: Stefan Monnier
Subject: [elpa] master b6aee5c: * xclip/xclip.el: Add support for `xsel` and Cygwin's `getclip`
Date: Thu, 23 Aug 2018 14:37:26 -0400 (EDT)

branch: master
commit b6aee5c820cc98d2714d611d3f927e6040105e66
Author: Stefan Monnier <address@hidden>
Commit: Stefan Monnier <address@hidden>

    * xclip/xclip.el: Add support for `xsel` and Cygwin's `getclip`
    
    Move Emacs<25 code to the end.
    (xclip): New group.
    (xclip-program): Change default to depend on
    xclip-use-pbcopy&paste.  Move accordingly.
    (xclip-select-enable-clipboard): Mark as obsolete.
    (xclip-use-pbcopy&paste): Make it into a defvar.  Mark as obsolete.
    (xclip-method): New defcustom.
    (xclip-set-selection, xclip-get-selection): Use it.
    (xclip-mode): Simplify.
---
 packages/xclip/xclip.el | 234 ++++++++++++++++++++++++++++++------------------
 1 file changed, 146 insertions(+), 88 deletions(-)

diff --git a/packages/xclip/xclip.el b/packages/xclip/xclip.el
index 992fd9b..2b8f97c 100644
--- a/packages/xclip/xclip.el
+++ b/packages/xclip/xclip.el
@@ -1,6 +1,6 @@
-;;; xclip.el --- use xclip to copy&paste             -*- lexical-binding: t; 
-*-
+;;; xclip.el --- Copy&paste GUI clipboard from text terminal  -*- 
lexical-binding: t; -*-
 
-;; Copyright (C) 2007, 2012, 2013, 2017  Free Software Foundation, Inc.
+;; Copyright (C) 2007, 2012, 2013, 2017, 2018  Free Software Foundation, Inc.
 
 ;; Author: Leo Liu <address@hidden>
 ;; Keywords: convenience, tools
@@ -22,39 +22,58 @@
 
 ;;; Commentary:
 
-;; 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.
+;; This package allows Emacs to copy to and paste from the GUI clipboard
+;; when running in text terminal.
 ;;
-;; To use: (xclip-mode 1)
+;; It relies on external command-line tools for that, which you may need
+;; to install in order for the package to work.
+;; More specifically, it can use the following tools:
+;; - Under X11: `xclip' or `xsel' (http://xclip.sourceforge.net and
+;;   http://www.vergenet.net/~conrad/software/xsel/ respectively).
+;; - MacOS: `pbpaste/pbcopy'
+;; - Cygwin: `getclip/putclip'
+;;
+;; To use, just add (xclip-mode 1) to your ~/.emacs or do `M-x clip-mode'
+;; after which the usual kill/yank commands will use the GUI selections
+;; according to `select-enable-clipboard/primary'.
 
 ;;; Code:
 
-(defcustom xclip-program "xclip"
-  "Name of the xclip program."
-  :type 'string
+(defgroup xclip ()
+  "Copy&paste GUI clipboard from text terminal."
   :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."
-  :type 'boolean
-  :group 'killing)
+  :type 'boolean)
+(make-obsolete 'xclip-select-enable-clipboard
+               'select-enable-clipboard "Emacs-25")
 
-(defcustom xclip-use-pbcopy&paste (and xclip-select-enable-clipboard
-                                       (eq system-type 'darwin)
-                                       (executable-find "pbcopy")
-                                       t)
+(defvar xclip-use-pbcopy&paste (and (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.")
-
-(defvar xclip-last-selected-text-primary nil
-  "The value of the PRIMARY X selection from xclip.")
+If non-nil `xclip-program' is ignored.")
+(make-obsolete 'xclip-use-pbcopy&paste 'xclip-method "xclip-1.5")
+
+(defcustom xclip-method
+   (if xclip-use-pbcopy&paste 'pbpaste
+     (or
+      (and (executable-find "xclip") 'xclip)
+      (and (executable-find "xsel") 'xsel)
+      (and (eq system-type 'cygwin) (executable-find "getclip") 'getclip)
+      'xclip))
+  "Method to use to access the GUI's clipboard.
+Can be one of `pbpaste' for MacOS, `xclip' or `xsel' for X11,
+and `getclip' under Cygwin."
+  :type '(choice
+          (const :tag "MacOS: pbcopy/pbpaste" pbpaste)
+          (const :tag "X11: xclip" xclip)))
+
+(defcustom xclip-program (symbol-name xclip-method)
+  "Name of the clipboard access command."
+  :type 'string)
 
 ;;;; Core functions.
 
@@ -63,12 +82,33 @@ If non-nil `xclip-program' is ignored."
 
 See also `x-set-selection'."
   (let* ((process-connection-type nil)
-         (proc (cond
-                ((and xclip-use-pbcopy&paste (memq type '(clipboard 
CLIPBOARD)))
-                 (start-file-process "pbcopy" nil "pbcopy"))
-                ((getenv "DISPLAY")
-                 (start-file-process "xclip" nil xclip-program
-                                     "-selection" (symbol-name type))))))
+         (proc
+          (pcase xclip-method
+            ('pbpaste
+             (when (memq type '(clipboard CLIPBOARD))
+               (start-file-process
+                "pbcopy" nil
+                (replace-regexp-in-string "\\(.*\\)pbpaste" "\\1pbcopy"
+                                          xclip-program 'fixedcase))))
+            ('getclip
+             (when (memq type '(clipboard CLIPBOARD))
+               (start-file-process
+                "putclip" nil
+                (replace-regexp-in-string "\\(.*\\)getclip" "\\1putclip"
+                                          xclip-program 'fixedcase))))
+            ('xclip
+             (when (getenv "DISPLAY")
+               (start-file-process "xclip" nil xclip-program
+                                   "-selection" (symbol-name type))))
+            ('xsel
+             (when (and (getenv "DISPLAY")
+                        (memq type '(clipboard CLIPBOARD
+                                     primary PRIMARY
+                                     secondary SECONDARY)))
+               (start-file-process
+                "xsel" nil xclip-program
+                "-i" (concat "--" (downcase (symbol-name type))))))
+            (method (error "Unknown `xclip-method': %S" method)))))
     (when proc
       (process-send-string proc data)
       (process-send-eof proc))
@@ -77,12 +117,25 @@ See also `x-set-selection'."
 (defun xclip-get-selection (type)
   "TYPE is a symbol: primary, secondary and clipboard."
   (with-output-to-string
-    (cond
-     ((and xclip-use-pbcopy&paste (memq type '(clipboard CLIPBOARD)))
-      (process-file "pbpaste" nil standard-output nil))
-     ((getenv "DISPLAY")
-      (process-file xclip-program nil standard-output nil
-                    "-o" "-selection" (symbol-name type))))))
+    (pcase xclip-method
+      ('pbpaste
+       (when (memq type '(clipboard CLIPBOARD))
+         (process-file xclip-program nil standard-output nil "-Prefer" "txt")))
+      ('getclip
+       (when (memq type '(clipboard CLIPBOARD))
+         (process-file xclip-program nil standard-output nil)))
+      ('xclip
+       (when (getenv "DISPLAY")
+         (process-file xclip-program nil standard-output nil
+                       "-o" "-selection" (symbol-name type))))
+      ('xsel
+       (when (and (getenv "DISPLAY")
+                  (memq type '(clipboard CLIPBOARD
+                               primary PRIMARY
+                               secondary SECONDARY)))
+         (process-file xclip-program nil standard-output nil
+                       "-o" (concat "--" (downcase (symbol-name type))))))
+      (method (error "Unknown `xclip-method': %S" method)))))
 
 ;;;###autoload
 (define-minor-mode xclip-mode
@@ -90,8 +143,7 @@ See also `x-set-selection'."
   :global t
   (remove-hook 'terminal-init-xterm-hook #'xclip--setup)
   (when xclip-mode
-    (unless (or xclip-use-pbcopy&paste
-               (executable-find xclip-program))
+    (unless (executable-find xclip-program)
       (setq xclip-mode nil)
       (signal 'file-error (list "Searching for program"
                                xclip-program "no such file")))
@@ -99,56 +151,6 @@ See also `x-set-selection'."
       ;; NOTE: See `tty-run-terminal-initialization' and term/README
       (add-hook 'terminal-init-xterm-hook #'xclip--setup))))
 
-;;;; Glue code for Emacs < 25
-
-(defun xclip-select-text (text)
-  "See `x-select-text'."
-  (xclip-set-selection 'primary text)
-  (setq xclip-last-selected-text-primary text)
-  (when xclip-select-enable-clipboard
-    (xclip-set-selection 'clipboard text)
-    (setq xclip-last-selected-text-clipboard text)))
-
-(defun xclip-selection-value ()
-  "See `x-selection-value'."
-  (let ((clip-text (when xclip-select-enable-clipboard
-                     (xclip-get-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 xclip--setup ()
-  (setq interprogram-cut-function #'xclip-select-text)
-  (setq interprogram-paste-function #'xclip-selection-value))
-
-
 ;;;; Glue code for Emacs ≥ 25
 
 (eval-when-compile
@@ -206,5 +208,61 @@ emacs 24.1 and is then later run by emacs 24.5."
      ;; Try again!
      (gui-backend-set-selection selection-symbol value))))
 
+;;;; Glue code for Emacs < 25
+
+(defvar xclip-last-selected-text-clipboard nil
+  "The value of the CLIPBOARD X selection from xclip.")
+
+(defvar xclip-last-selected-text-primary nil
+  "The value of the PRIMARY X selection from xclip.")
+
+(defun xclip-select-text (text)
+  "See `x-select-text'."
+  (xclip-set-selection 'primary text)
+  (setq xclip-last-selected-text-primary text)
+  (when xclip-select-enable-clipboard
+    (xclip-set-selection 'clipboard text)
+    (setq xclip-last-selected-text-clipboard text)))
+
+(defun xclip-selection-value ()
+  "See `x-selection-value'."
+  (let ((clip-text (when xclip-select-enable-clipboard
+                     (xclip-get-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 (memq xclip-method '(xsel xclip)) (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 xclip--setup ()
+  (setq interprogram-cut-function #'xclip-select-text)
+  (setq interprogram-paste-function #'xclip-selection-value))
+
+
 (provide 'xclip)
 ;;; xclip.el ends here



reply via email to

[Prev in Thread] Current Thread [Next in Thread]