From: Glenn Morris <rgm@gnu.org>
To: emacs-devel@gnu.org
Cc: Stefan Monnier <monnier@iro.umontreal.ca>
Subject: Re: master 2b2fd39: xterm.el: Implement OSC-52 functionality for setting the X selection
Date: Fri, 17 Apr 2015 12:04:53 -0400 [thread overview]
Message-ID: <2yvbguvize.fsf@fencepost.gnu.org> (raw)
In-Reply-To: <E1Yhffb-0001ET-AW@vcs.savannah.gnu.org> (Stefan Monnier's message of "Mon, 13 Apr 2015 14:49:03 +0000")
This is not a small change, but I see no corresponding entry in copyright.list.
Stefan Monnier wrote:
> branch: master
> commit 2b2fd3965f8c096b39de7e0418d37433269a1dce
> Author: Philipp Stephani <p.stephani2@gmail.com>
> Commit: Stefan Monnier <monnier@iro.umontreal.ca>
>
> xterm.el: Implement OSC-52 functionality for setting the X selection
>
> * lisp/term/xterm.el (xterm-max-cut-length): New var.
> (xterm--set-selection, terminal-init-xterm-activate-set-selection): New funs.
> (terminal-init-xterm, xterm--version-handler): Use them.
> ---
> lisp/term/xterm.el | 93 +++++++++++++++++++++++++++++++++++++++++++++++++--
> 1 files 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
>
> _______________________________________________
> Emacs-diffs mailing list
> Emacs-diffs@gnu.org
> https://lists.gnu.org/mailman/listinfo/emacs-diffs
next parent reply other threads:[~2015-04-17 16:04 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20150413144903.4697.38336@vcs.savannah.gnu.org>
[not found] ` <E1Yhffb-0001ET-AW@vcs.savannah.gnu.org>
2015-04-17 16:04 ` Glenn Morris [this message]
2015-04-17 18:05 ` master 2b2fd39: xterm.el: Implement OSC-52 functionality for setting the X selection Stefan Monnier
2015-04-18 21:16 ` Glenn Morris
2015-04-19 3:12 ` Stefan Monnier
2015-04-19 6:35 ` Philipp Stephani
2015-04-22 17:34 ` Glenn Morris
2015-04-23 19:04 ` Richard Stallman
2015-04-24 1:38 ` Stephen J. Turnbull
2015-04-24 18:25 ` Glenn Morris
2015-04-25 17:02 ` Richard Stallman
2015-04-19 6:34 ` Philipp Stephani
2015-05-25 21:07 ` 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
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=2yvbguvize.fsf@fencepost.gnu.org \
--to=rgm@gnu.org \
--cc=emacs-devel@gnu.org \
--cc=monnier@iro.umontreal.ca \
/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 public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).