[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master 33141b51c3: Allow term-mode to send function keys to the underlyi
From: |
Lars Ingebrigtsen |
Subject: |
master 33141b51c3: Allow term-mode to send function keys to the underlying shell |
Date: |
Sun, 8 May 2022 09:04:42 -0400 (EDT) |
branch: master
commit 33141b51c3121b93f625c76b996b17ec8de97419
Author: Lars Ingebrigtsen <larsi@gnus.org>
Commit: Lars Ingebrigtsen <larsi@gnus.org>
Allow term-mode to send function keys to the underlying shell
* lisp/term.el (term-bind-function-keys): New user option.
(term-raw-map): Bind f keys.
(term-send-function-key): Send the function key to the underlying
shell (bug#29920).
---
etc/NEWS | 5 +++++
lisp/term.el | 31 +++++++++++++++++++++++++++++++
2 files changed, 36 insertions(+)
diff --git a/etc/NEWS b/etc/NEWS
index ee7a127af0..5c13b72c29 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1137,6 +1137,11 @@ filters and displayed with the specified color.
** term-mode
+---
+*** New user option 'term-bind-function-keys'.
+If non-nil, 'term-mode' will pass the function keys on to the
+underlying shell instead of using the normal Emacs bindings.
+
---
*** Support for ANSI 256-color and 24-bit colors, italic and other fonts.
Term-mode can now display 256-color and 24-bit color codes. It can
diff --git a/lisp/term.el b/lisp/term.el
index 3e05d529cd..640478b59a 100644
--- a/lisp/term.el
+++ b/lisp/term.el
@@ -918,6 +918,13 @@ is buffer-local."
:type 'integer
:version "27.1")
+(defcustom term-bind-function-keys nil
+ "If nil, don't alter <f1>, <f2> and so on.
+If non-nil, bind these keys in `term-mode' and send them to the
+underlying shell."
+ :type 'boolean
+ :version "29.1")
+
;; Set up term-raw-map, etc.
@@ -958,6 +965,10 @@ is buffer-local."
(define-key map [next] 'term-send-next)
(define-key map [xterm-paste] #'term--xterm-paste)
(define-key map [?\C-/] #'term-send-C-_)
+
+ (when term-bind-function-keys
+ (dotimes (key 21)
+ (keymap-set map (format "<f%d>" key) #'term-send-function-key)))
map)
"Keyboard map for sending characters directly to the inferior process.")
@@ -1411,6 +1422,26 @@ Entry to this mode runs the hooks on `term-mode-hook'."
(defun term-send-del () (interactive) (term-send-raw-string "\e[3~"))
(defun term-send-backspace () (interactive) (term-send-raw-string "\C-?"))
(defun term-send-C-_ () (interactive) (term-send-raw-string "\C-_"))
+
+(defun term-send-function-key ()
+ "If bound to a function key, this will send that key to the underlying
shell."
+ (interactive)
+ (let ((key (this-command-keys-vector)))
+ (when (and (= (length key) 1)
+ (symbolp (elt key 0)))
+ (let ((name (symbol-name (elt key 0))))
+ (when (string-match "\\`f\\([0-9]++\\)\\'" name)
+ (let* ((num (string-to-number (match-string 1 name)))
+ (ansi
+ (cond
+ ((<= num 5) (+ num 10))
+ ((<= num 10) (+ num 11))
+ ((<= num 14) (+ num 12))
+ ((<= num 16) (+ num 13))
+ ((<= num 20) (+ num 14)))))
+ (when ansi
+ (term-send-raw-string (format "\e[%d~" ansi)))))))))
+
(defun term-char-mode ()
"Switch to char (\"raw\") sub-mode of term mode.
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- master 33141b51c3: Allow term-mode to send function keys to the underlying shell,
Lars Ingebrigtsen <=