From: Philipp Stephani <p.stephani2@gmail.com>
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: Emacs developers <emacs-devel@gnu.org>,
Yuri Khan <yuri.v.khan@gmail.com>
Subject: Re: X selection access in xterm (OSC 52)
Date: Wed, 08 Apr 2015 21:04:29 +0000 [thread overview]
Message-ID: <CAArVCkQ7OWv1krmO0EdiYd0pXTBY1qyOFKusgv9wgW+K_GWskw@mail.gmail.com> (raw)
In-Reply-To: <jwvr3seawqb.fsf-monnier+emacs@gnu.org>
[-- Attachment #1.1: Type: text/plain, Size: 814 bytes --]
Stefan Monnier <monnier@iro.umontreal.ca> schrieb am Di., 24. März 2015 um
22:55 Uhr:
> > Sorry for the delay. I've tried implementing this, but I'm a bit at a
> loss
> > here: If I understand the GUI method code correctly, it only works for
> real
> > GUIs, not terminal emulators that happen to be GUI
> > applications, right?
>
> No, they work for text terminals as well.
>
> > At least the window-system variable, which gui-method apparently uses,
> > is always nil in my tests with hterm. Should this be something
> > like 'xterm?
>
> No, it will be nil. Of course, it will apply to all terminals, so
> you'll then have to check whether the current text terminal is an xterm.
>
>
OK, here's another patch. I've done some lightweight testing, it works in
hterm with or without screen.
[-- Attachment #1.2: Type: text/html, Size: 1135 bytes --]
[-- Attachment #2: 0001-Implement-OSC-52-functionality-for-setting-the-X-sel.patch --]
[-- Type: application/octet-stream, Size: 6395 bytes --]
From affef6455cdcbb879b5063859deec3641312b0fd Mon Sep 17 00:00:00 2001
From: Philipp Stephani <phst@google.com>
Date: Wed, 8 Apr 2015 18:53:47 +0200
Subject: [PATCH] Implement OSC-52 functionality for setting the X selection
---
lisp/term/xterm.el | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 89 insertions(+), 4 deletions(-)
diff --git a/lisp/term/xterm.el b/lisp/term/xterm.el
index 519f691..f4d1a84 100644
--- a/lisp/term/xterm.el
+++ b/lisp/term/xterm.el
@@ -37,7 +37,8 @@ If a list, assume that the listed features are supported, without checking.
The relevant features are:
modifyOtherKeys -- if supported, more key bindings work (e.g., \"\\C-,\")
- reportBackground -- if supported, Xterm reports its background color"
+ reportBackground -- if supported, Xterm reports its background color
+ setSelection -- if supported, Xterm saves yanked text to the X selection"
:version "24.1"
:group 'xterm
:type '(choice (const :tag "No" nil)
@@ -45,7 +46,24 @@ The relevant features are:
;; NOTE: If you add entries here, make sure to update
;; `terminal-init-xterm' as well.
(set (const :tag "modifyOtherKeys support" modifyOtherKeys)
- (const :tag "report background" reportBackground))))
+ (const :tag "report background" reportBackground)
+ (const :tag "set X selection" setSelection))))
+
+(defcustom xterm-max-cut-length 100000
+ "Maximum number of bytes to cut into xterm using the OSC 52 sequence.
+
+The OSC 52 sequence requires a terminator byte. Some terminals will ignore or
+mistreat a terminated sequence that is longer than a certain size, usually to
+protect users from runaway sequences.
+
+This variable allows you to tweak the maximum number of bytes that will be sent
+using the OSC 52 sequence.
+
+If you select a region larger than this size, it won't be copied to your system
+clipboard. Since clipboard data is base 64 encoded, the actual number of
+string bytes that can be copied is 3/4 of this value."
+ :group 'xterm
+ :type 'integer)
(defconst xterm-paste-ending-sequence "\e[201~"
"Characters send by the terminal to end a bracketed paste.")
@@ -620,7 +638,13 @@ The relevant features are:
;; introduced) or higher, initialize the
;; modifyOtherKeys support.
(when (>= version 216)
- (terminal-init-xterm-modify-other-keys))))))
+ (terminal-init-xterm-modify-other-keys))
+ ;; In version 203 support for accessing the X selection was
+ ;; added. Hterm reports itself as version 256 and supports it
+ ;; as well. gnome-terminal doesn't and is excluded by this
+ ;; test.
+ (when (>= version 203)
+ (terminal-init-xterm-activate-set-selection))))))
(defun xterm--query (query handlers)
"Send QUERY string to the terminal and watch for a response.
@@ -699,7 +723,10 @@ We run the first FUNCTION whose STRING matches the input events."
'(("\e]11;" . xterm--report-background-handler))))
(when (memq 'modifyOtherKeys xterm-extra-capabilities)
- (terminal-init-xterm-modify-other-keys)))
+ (terminal-init-xterm-modify-other-keys))
+
+ (when (memq 'setSelection xterm-extra-capabilities)
+ (terminal-init-xterm-activate-set-selection)))
;; Unconditionally enable bracketed paste mode: terminals that don't
;; support it just ignore the sequence.
@@ -719,6 +746,64 @@ We run the first FUNCTION whose STRING matches the input events."
(push "\e[?2004l" (terminal-parameter nil 'tty-mode-reset-strings))
(push "\e[?2004h" (terminal-parameter nil 'tty-mode-set-strings)))
+(defun terminal-init-xterm-activate-set-selection ()
+ "Terminal initialization for `gui-set-selection'."
+ ;; All text terminals are represented by the nil GUI type. We need
+ ;; to detect XTerm again in `xterm--set-selection' using the
+ ;; terminal parameters.
+ (gui-method-define gui-set-selection nil #'xterm--set-selection))
+
+(defun xterm--set-selection (type data)
+ "Copy DATA to the X selection using the OSC 52 escape sequence.
+
+TYPE specifies which selection to set; it must be either
+`PRIMARY' or `CLIPBOARD'. DATA must be a string.
+
+This can be used as a `gui-set-selection' method for
+xterm-compatible terminal emulators. Then your system clipboard
+will be updated whenever you copy a region of text in Emacs.
+
+If the resulting OSC 52 sequence would be longer than
+`xterm-max-cut-length', then the TEXT is not sent to the system
+clipboard.
+
+This function either sends a raw OSC 52 sequence or wraps the OSC
+52 in a Device Control String sequence. This way, it will work
+on a bare terminal emulators as well as inside the screen
+program. When inside the screen program, this function also
+chops long DCS sequences into multiple smaller ones to avoid
+hitting screen's max DCS length."
+ (let* ((init-function (terminal-parameter nil 'terminal-initted))
+ (xterm (eq init-function 'terminal-init-xterm))
+ (screen (eq init-function 'terminal-init-screen)))
+ ;; Only do something if the current terminal is actually an XTerm
+ ;; or screen.
+ (when (or xterm screen)
+ (let* ((bytes (encode-coding-string data 'utf-8-unix))
+ (base-64 (if screen
+ (replace-regexp-in-string
+ "\n" "\e\\\eP"
+ (base64-encode-string bytes)
+ :fixedcase :literal)
+ (base64-encode-string bytes :no-line-break)))
+ (length (string-bytes base-64)))
+ (if (> length xterm-max-cut-length)
+ (progn
+ (warn "Selection too long to send to terminal: %d bytes" length)
+ (sit-for 2))
+ (send-string-to-terminal
+ (concat
+ (when screen "\eP")
+ "\e]52;"
+ (cond
+ ((eq type 'PRIMARY) "p")
+ ((eq type 'CLIPBOARD) "c")
+ (t (error "Invalid type %S" type)))
+ ";"
+ base-64
+ "\a"
+ (when screen "\e\\"))))))))
+
;; Set up colors, for those versions of xterm that support it.
(defvar xterm-standard-colors
;; The names in the comments taken from XTerm-col.ad in the xterm
--
2.3.5
next prev parent reply other threads:[~2015-04-08 21:04 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-02-08 18:18 X selection access in xterm (OSC 52) Philipp Stephani
2015-02-08 18:43 ` Eli Zaretskii
2015-02-08 18:48 ` Philipp Stephani
2015-02-08 19:00 ` Stefan Monnier
2015-02-09 3:04 ` Yuri Khan
2015-02-09 4:23 ` Stefan Monnier
2015-02-09 16:05 ` Philipp Stephani
2015-02-09 17:12 ` Stefan Monnier
2015-02-10 10:30 ` Philipp Stephani
2015-02-27 19:44 ` Philipp Stephani
2015-03-13 22:08 ` Stefan Monnier
2015-03-15 18:33 ` Philipp Stephani
2015-03-16 13:29 ` Stefan Monnier
2015-03-24 15:14 ` Philipp Stephani
2015-03-24 21:55 ` Stefan Monnier
2015-04-08 21:04 ` Philipp Stephani [this message]
2015-04-09 2:10 ` Stefan Monnier
2015-04-09 15:48 ` Philipp Stephani
2015-04-09 18:47 ` Philipp Stephani
2015-04-09 20:07 ` Philipp Stephani
2015-04-13 14:57 ` Stefan Monnier
2015-04-13 22:17 ` Stefan Monnier
2015-04-17 2:40 ` Stefan Monnier
2015-04-17 6:25 ` Philipp Stephani
2015-04-17 6:29 ` Philipp Stephani
2015-04-17 13:52 ` Stefan Monnier
2015-04-17 14:00 ` Philipp Stephani
2016-03-29 10:15 ` Philipp Stephani
2015-03-28 18:59 ` Olaf Rogalsky
2015-03-29 3:39 ` Stefan Monnier
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAArVCkQ7OWv1krmO0EdiYd0pXTBY1qyOFKusgv9wgW+K_GWskw@mail.gmail.com \
--to=p.stephani2@gmail.com \
--cc=emacs-devel@gnu.org \
--cc=monnier@iro.umontreal.ca \
--cc=yuri.v.khan@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.