1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-15 18:40:39 -08:00

Revert "Disable bracketed paste in a terminal in char mode"

This change causes regressions, and besides, disabling BPM frame-wide
for the sake of one buffer is the wrong solution.

This reverts commit cf566b46a6.
This commit is contained in:
Daniel Colascione 2016-11-02 21:17:48 -07:00
parent 722e7989fa
commit e5cdb5ce7d
2 changed files with 9 additions and 88 deletions

View file

@ -1247,11 +1247,6 @@ intervention from Emacs, except for the escape character (usually C-c)."
(end-of-line)
(term-send-input))
(setq term-input-sender save-input-sender))))
;; Turn off XTerm bracketed paste (Bug#24639).
(when (fboundp 'xterm-inhibit-bracketed-paste-mode)
(xterm-inhibit-bracketed-paste-mode))
(term-update-mode-line)))
(defun term-line-mode ()
@ -1261,8 +1256,6 @@ you type \\[term-send-input] which sends the current line to the inferior."
(interactive)
(when (term-in-char-mode)
(use-local-map term-old-mode-map)
(when (fboundp 'xterm-inhibit-bracketed-paste-mode)
(xterm-inhibit-bracketed-paste-mode 0))
(term-update-mode-line)))
(defun term-update-mode-line ()

View file

@ -24,8 +24,6 @@
;;; Code:
(require 'cl-lib)
(defgroup xterm nil
"XTerm support."
:version "24.1"
@ -767,78 +765,6 @@ We run the first FUNCTION whose STRING matches the input events."
basemap
(make-composed-keymap map (keymap-parent basemap))))
(define-minor-mode xterm-inhibit-bracketed-paste-mode
"Toggle whether XTerm bracketed paste should be allowed in this buffer.
With a prefix argument ARG, forbid bracketed paste if ARG is
positive, and allow it otherwise. If called from Lisp, forbid
bracketed paste if ARG is omitted or nil, and toggle the state of
ARG is `toggle'. If XTerm bracketed paste is allowed (the
default), it will be used to paste text from an X selection upon
reception of the `xterm-paste' event. Otherwise the selection
will be inserted character by character, which is much slower.
Therefore, bracketed paste should only be disabled in buffers
that can't deal with the `xterm-paste' event, such as terminal
emulation buffers."
:group xterm
;; Update the bracketed paste flag in all terminals that display the
;; current buffer.
(mapc #'xterm--update-bracketed-paste (xterm--buffer-terminals)))
(defun xterm--buffer-terminals (&optional buffer)
"Return all terminals that contain a window that displays BUFFER.
BUFFER defaults to the current buffer."
(cl-delete-duplicates
(cl-loop for window in (get-buffer-window-list buffer nil t)
for terminal = (frame-terminal (window-frame window))
collect terminal)
:test 'eq))
(defun xterm--update-bracketed-paste (&optional terminal)
"Enable or disable bracketed paste for TERMINAL.
TERMINAL must be a live terminal; it defaults to the terminal
displaying the selected frame. If any buffer displayed on the
frames of TERMINAL inhibits bracketed paste by enabling
`xterm-inhibit-bracketed-paste-mode', disable bracketed paste for
TERMINAL. If there is no such buffer, enable bracketed paste."
(unless terminal (setq terminal (frame-terminal)))
(cl-check-type terminal terminal-live)
(when (xterm--is-xterm terminal)
(cl-symbol-macrolet
((enabled-param (terminal-parameter terminal 'xterm--bracketed-paste))
(set-strings-param (terminal-parameter terminal 'tty-mode-set-strings))
(reset-strings-param
(terminal-parameter terminal 'tty-mode-reset-strings)))
(let ((is-enabled enabled-param)
(should-enable (xterm--bracketed-paste-possible terminal))
(enable-seq "\e[?2004h")
(disable-seq "\e[?2004l"))
(cond
;; Unconditionally send terminal sequences: terminals that
;; don't support bracketed paste just ignore the sequences.
((and (not is-enabled) should-enable)
(send-string-to-terminal enable-seq terminal)
(push disable-seq reset-strings-param)
(push enable-seq set-strings-param)
(setq enabled-param t))
((and is-enabled (not should-enable))
(send-string-to-terminal disable-seq)
(cl-callf2 delete disable-seq reset-strings-param)
(cl-callf2 delete enable-seq set-strings-param)
(setq enabled-param nil)))))))
(defun xterm--bracketed-paste-possible (terminal)
"Return non-nil if bracketed paste could be enabled on TERMINAL.
If any buffer displayed on the frames of TERMINAL inhibits
bracketed paste by enabling `xterm-inhibit-bracketed-paste-mode',
return nil. If there is no such buffer, return non-nil."
(cl-check-type terminal terminal-live)
(cl-loop for frame being the frames
if (eq (frame-terminal frame) terminal)
always (cl-loop
for window being the windows of frame
never (buffer-local-value 'xterm-inhibit-bracketed-paste-mode
(window-buffer window)))))
(defun terminal-init-xterm ()
"Terminal initialization function for xterm."
;; rxvt terminals sometimes set the TERM variable to "xterm", but
@ -876,8 +802,9 @@ return nil. If there is no such buffer, return non-nil."
(when (memq 'setSelection xterm-extra-capabilities)
(xterm--init-activate-set-selection)))
(add-hook 'window-configuration-change-hook #'xterm--update-bracketed-paste)
(xterm--update-bracketed-paste)
;; Unconditionally enable bracketed paste mode: terminals that don't
;; support it just ignore the sequence.
(xterm--init-bracketed-paste-mode)
(run-hooks 'terminal-init-xterm-hook))
@ -887,6 +814,12 @@ return nil. If there is no such buffer, return non-nil."
(push "\e[>4m" (terminal-parameter nil 'tty-mode-reset-strings))
(push "\e[>4;1m" (terminal-parameter nil 'tty-mode-set-strings)))
(defun xterm--init-bracketed-paste-mode ()
"Terminal initialization for bracketed paste mode."
(send-string-to-terminal "\e[?2004h")
(push "\e[?2004l" (terminal-parameter nil 'tty-mode-reset-strings))
(push "\e[?2004h" (terminal-parameter nil 'tty-mode-set-strings)))
(defun xterm--init-activate-get-selection ()
"Terminal initialization for `gui-get-selection'."
(set-terminal-parameter nil 'xterm--get-selection t))
@ -1067,11 +1000,6 @@ versions of xterm."
(set-terminal-parameter nil 'background-mode 'dark)
t))
(defun xterm--is-xterm (&optional terminal)
"Return non-nil if TERMINAL is an XTerm-like terminal.
TERMINAL defaults to the terminal of the selected frame."
(eq (terminal-parameter terminal 'terminal-initted) 'terminal-init-xterm))
(provide 'xterm) ;Backward compatibility.
(provide 'term/xterm)
;;; xterm.el ends here