aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjixiuf <jixiuf@qq.com>2022-10-19 12:02:42 +0800
committerjixiuf <jixiuf@qq.com>2022-10-19 12:03:07 +0800
commite9bfe56ca264e1b692a9c33fa8edb369e728a0c9 (patch)
treee348e66dc69e7517acbba84ce5aae633e6521328
parentd6fcd38b9544dd4d05dbe5db10e950043b68de9c (diff)
fix #632 Meta/Alt not working in terminal/non-graphical mode
-rw-r--r--vterm.el39
1 files changed, 23 insertions, 16 deletions
diff --git a/vterm.el b/vterm.el
index 8ba8866..07a255c 100644
--- a/vterm.el
+++ b/vterm.el
@@ -563,20 +563,20 @@ Exceptions are defined by `vterm-keymap-exceptions'."
for key = (format "<f%i>" number)
unless (member key exceptions)
collect key))
- (mapc (lambda (key)
- (define-key map (kbd key) #'vterm--self-insert))
- (cl-loop for prefix in '("C-" "M-" "C-S-" )
- append (cl-loop for char from ?a to ?z
- for key = (format "%s%c" prefix char)
- unless (member key exceptions)
- collect key)))
- (mapc (lambda (key)
- (define-key map (kbd key) 'ignore))
- (cl-loop for prefix in '("C-M-" "C-M-S-")
- append (cl-loop for char from ?a to ?z
- for key = (format "%s%c" prefix char)
- unless (member key exceptions)
- collect key))))
+ (let ((esc-map (lookup-key map "\e"))
+ (i 0)
+ key)
+ (unless esc-map (setq esc-map (make-keymap)))
+ (while (< i 128)
+ (setq key (make-string 1 i))
+ (unless (member (key-description key) exceptions)
+ (define-key map key 'vterm--self-insert))
+ ;; Avoid O and [. They are used in escape sequences for various keys.
+ (unless (or (eq i ?O) (eq i 91))
+ (unless (member (key-description key "\e") exceptions)
+ (define-key esc-map key 'vterm--self-insert-meta)))
+ (setq i (1+ i)))
+ (define-key map "\e" esc-map)))
(defun vterm-xterm-paste (event)
"Handle xterm paste EVENT in vterm."
@@ -877,6 +877,13 @@ will invert `vterm-copy-exclude-prompt' for that call."
;;; Commands
+(defun vterm--self-insert-meta ()
+ (interactive)
+ (when vterm--term
+ (dolist (key (vterm--translate-event-to-args
+ last-command-event :meta))
+ (apply #'vterm-send-key key))))
+
(defun vterm--self-insert ()
"Send invoking key to libvterm."
(interactive)
@@ -1194,7 +1201,7 @@ Return count of moved characeters."
"A wrapper for `delete-char'."
(funcall vterm--delete-char-function n killflag))
-(defun vterm--translate-event-to-args (event)
+(defun vterm--translate-event-to-args (event &optional meta)
"Translate EVENT as list of args for `vterm-send-key'.
When some input method is enabled, one key may generate
@@ -1202,7 +1209,7 @@ several characters, so the result of this function is a list,
looks like: ((\"m\" :shift ))"
(let* ((modifiers (event-modifiers event))
(shift (memq 'shift modifiers))
- (meta (memq 'meta modifiers))
+ (meta (or meta (memq 'meta modifiers)))
(ctrl (memq 'control modifiers))
(raw-key (event-basic-type event))
(ev-keys) keys)