aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Fürmetz <fuermetz@mailbox.org>2018-11-11 20:39:29 +0100
committerLukas Fürmetz <fuermetz@mailbox.org>2018-11-11 21:23:48 +0100
commitf577d6131d1855581fd88b990e204e7d56be0212 (patch)
treeb84630e5360fe46dfb5bf6d7fd8b5c19885a8d85
parent3ff58ef1417c4a38270996d1265e423976b4fe17 (diff)
Bind all necessary keys in vterm-mode-map
-rw-r--r--README.md12
-rw-r--r--vterm.el74
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-<char>` and `M-<char>` keys, `<f1>` through `<f12>` and some special keys
+like `<backspace>` and `<return>`. 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 "<backspace>") #'vterm--self-insert)
-(define-key vterm-mode-map (kbd "M-<backspace>") #'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 "<f%i>" 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."