From f577d6131d1855581fd88b990e204e7d56be0212 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20F=C3=BCrmetz?= Date: Sun, 11 Nov 2018 20:39:29 +0100 Subject: Bind all necessary keys in vterm-mode-map --- README.md | 12 +++++------ vterm.el | 74 ++++++++++++++++++++++++++++++--------------------------------- 2 files changed, 41 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index 9dbe396..0264547 100644 --- a/README.md +++ b/README.md @@ -77,9 +77,13 @@ Open a terminal in another window. Shell to run in a new vterm. Defaults to `$SHELL`. -## `vterm-keymap-exceptions` +# Keybindings -List of keys, which should be processed by emacs and not by the terminal. +If you want a key to be send to the terminal bind it to `vterm--self-insert`, +otherwise remove it from `vterm-mode-map`. By default vterm.el binds most of the +`C-` and `M-` keys, `` through `` and some special keys +like `` and ``. Sending a keyboard interrupt is by default +bound to `C-c C-c`. ## Colors @@ -95,7 +99,3 @@ color you like: - vterm-color-magenta - vterm-color-cyan - vterm-color-white - -# Limitations - -- Mouse support is non-existing diff --git a/vterm.el b/vterm.el index 58c7a79..64ce9a1 100644 --- a/vterm.el +++ b/vterm.el @@ -45,7 +45,7 @@ :type 'number :group 'vterm) -(defcustom vterm-keymap-exceptions '("C-x" "C-u" "C-g" "C-h" "M-x" "M-o" "C-v" "M-v") +(defcustom vterm-keymap-exceptions '("C-c" "C-x" "C-u" "C-g" "C-h" "M-x" "M-o" "C-v" "M-v") "Exceptions for vterm-keymap. If you use a keybinding with a prefix-key that prefix-key cannot @@ -129,33 +129,30 @@ be send to the terminal." :sentinel #'ignore)))) ;; Keybindings -;; (define-key vterm-mode-map [t] #'vterm--self-insert) -(define-key vterm-mode-map [mouse-1] nil) -(define-key vterm-mode-map [mouse-2] nil) -(define-key vterm-mode-map [mouse-3] nil) -(define-key vterm-mode-map [mouse-4] #'ignore) -(define-key vterm-mode-map [mouse-5] #'ignore) -(define-key vterm-mode-map [(tab)] #'vterm--self-insert) -(define-key vterm-mode-map (kbd "TAB") #'vterm--self-insert) -(define-key vterm-mode-map (kbd "") #'vterm--self-insert) -(define-key vterm-mode-map (kbd "M-") #'vterm--self-insert) -(define-key vterm-mode-map [left] #'vterm--self-insert) -(define-key vterm-mode-map [right] #'vterm--self-insert) -(define-key vterm-mode-map [up] #'vterm--self-insert) -(define-key vterm-mode-map [down] #'vterm--self-insert) -(define-key vterm-mode-map [home] #'vterm--self-insert) -(define-key vterm-mode-map [end] #'vterm--self-insert) -(define-key vterm-mode-map [escape] 'vterm--self-insert) -(define-key vterm-mode-map [remap self-insert-command] 'vterm--self-insert) - -(dolist (prefix '("M-" "C-")) - (dolist (char (cl-loop for char from ?a to ?z - collect char)) - (let ((key (concat prefix (char-to-string char)))) - (unless (cl-member key vterm-keymap-exceptions) - (define-key vterm-mode-map (kbd key) #'vterm--self-insert))))) -(dolist (exception vterm-keymap-exceptions) - (define-key vterm-mode-map (kbd exception) nil)) +(define-key vterm-mode-map [tab] #'vterm--self-insert) +(define-key vterm-mode-map [backspace] #'vterm--self-insert) +(define-key vterm-mode-map [M-backspace] #'vterm--self-insert) +(define-key vterm-mode-map [return] #'vterm--self-insert) +(define-key vterm-mode-map [left] #'vterm--self-insert) +(define-key vterm-mode-map [right] #'vterm--self-insert) +(define-key vterm-mode-map [up] #'vterm--self-insert) +(define-key vterm-mode-map [down] #'vterm--self-insert) +(define-key vterm-mode-map [home] #'vterm--self-insert) +(define-key vterm-mode-map [end] #'vterm--self-insert) +(define-key vterm-mode-map [escape] #'vterm--self-insert) +(define-key vterm-mode-map [remap self-insert-command] #'vterm--self-insert) +(define-key vterm-mode-map (kbd "C-c C-c") #'vterm-send-ctrl-c) + +;; Function keys and most of C- and M- bindings +(mapcar (lambda (key) + (define-key vterm-mode-map (kbd key) #'vterm--self-insert)) + (append (cl-loop for number from 1 to 12 + collect (format "" number)) + (cl-loop for prefix in '("C-" "M-") + append (cl-loop for char from ?a to ?z + for key = (format "%s%c" prefix char) + unless (member key vterm-keymap-exceptions) + collect key)))) (defun vterm--self-insert () "Sends invoking key to libvterm." @@ -165,24 +162,23 @@ be send to the terminal." (shift (memq 'shift modifiers)) (meta (memq 'meta modifiers)) (ctrl (memq 'control modifiers))) - (when-let ((key (key-description (vector (event-basic-type last-input-event)))) - (inhibit-redisplay t) - (inhibit-read-only t)) - (when (equal modifiers '(shift)) - (setq key (upcase key))) - (vterm--update vterm--term key shift meta ctrl))))) - + (when-let ((key (key-description (vector (event-basic-type last-input-event))))) + (vterm-send-key key shift meta ctrl))))) (defun vterm-send-key (key &optional shift meta ctrl) - "Sends key to libvterm." + "Sends KEY to libvterm with optional modifiers SHIFT, META and CTRL." (when vterm--term - (let* ((inhibit-redisplay t) - (inhibit-read-only t) - (key key)) + (let ((inhibit-redisplay t) + (inhibit-read-only t)) (when (and shift (not meta) (not ctrl)) (setq key (upcase key))) (vterm--update vterm--term key shift meta ctrl)))) +(defun vterm-send-ctrl-c () + "Sends C-c to the libvterm." + (interactive) + (vterm-send-key "c" nil nil t)) + ;;;###autoload (defun vterm () "Create a new vterm." -- cgit v1.0