aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md5
-rw-r--r--elisp.c1
-rw-r--r--vterm-module.c7
-rw-r--r--vterm.el125
4 files changed, 116 insertions, 22 deletions
diff --git a/README.md b/README.md
index 308621b..2746558 100644
--- a/README.md
+++ b/README.md
@@ -58,6 +58,11 @@ Open a terminal in the current window.
Open a terminal in another window.
+## `vterm-copy-mode`
+When you enable `vterm-copy-mode`,the terminal buffer would behave like a normal
+`read-only` text buffer. Then you can search in the output terminal, copy text,
+etc. the default keybinding is `C-c C-t`.
+
# Customization
## `vterm-shell`
diff --git a/elisp.c b/elisp.c
index 9483692..beaf5d6 100644
--- a/elisp.c
+++ b/elisp.c
@@ -108,7 +108,6 @@ void set_cursor_type(emacs_env *env, emacs_value QCursorType) {
env->funcall(env, Fset, 2, (emacs_value[]){Qcursor_type, QCursorType});
}
-
emacs_value vterm_get_color(emacs_env *env, int index) {
emacs_value idx = env->make_integer(env, index);
return env->funcall(env, Fvterm_get_color, 1, (emacs_value[]){idx});
diff --git a/vterm-module.c b/vterm-module.c
index edf8237..4ec78dc 100644
--- a/vterm-module.c
+++ b/vterm-module.c
@@ -540,13 +540,18 @@ static void term_process_key(Term *term, unsigned char *key, size_t len,
} else {
vterm_keyboard_key(term->vt, VTERM_KEY_ENTER, modifier);
}
+ } else if (is_key(key, len, "<start>")) {
+ tcflow(term->pty_fd, TCOON);
+ } else if (is_key(key, len, "<stop>")) {
+ tcflow(term->pty_fd, TCOOFF);
} else if (is_key(key, len, "<start_paste>")) {
vterm_keyboard_start_paste(term->vt);
} else if (is_key(key, len, "<end_paste>")) {
vterm_keyboard_end_paste(term->vt);
} else if (is_key(key, len, "<tab>")) {
vterm_keyboard_key(term->vt, VTERM_KEY_TAB, modifier);
- } else if (is_key(key, len, "<backtab>") || is_key(key, len, "<iso-lefttab>")) {
+ } else if (is_key(key, len, "<backtab>") ||
+ is_key(key, len, "<iso-lefttab>")) {
vterm_keyboard_key(term->vt, VTERM_KEY_TAB, VTERM_MOD_SHIFT);
} else if (is_key(key, len, "<backspace>")) {
vterm_keyboard_key(term->vt, VTERM_KEY_BACKSPACE, modifier);
diff --git a/vterm.el b/vterm.el
index 1c9e8f4..4a4069b 100644
--- a/vterm.el
+++ b/vterm.el
@@ -242,26 +242,6 @@ If nil, never delay")
:sentinel (when vterm-exit-functions #'vterm--sentinel))))
(vterm--set-pty-name vterm--term (process-tty-name vterm--process)))
-;; Keybindings
-(define-key vterm-mode-map [tab] #'vterm--self-insert)
-(define-key vterm-mode-map [backtab] #'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 [remap yank] #'vterm-yank)
-(define-key vterm-mode-map (kbd "C-c C-y") #'vterm--self-insert)
-(define-key vterm-mode-map (kbd "C-c C-c") #'vterm-send-ctrl-c)
-(define-key vterm-mode-map (kbd "C-_") #'vterm--self-insert)
-(define-key vterm-mode-map (kbd "C-SPC") #'vterm--self-insert)
-(define-key vterm-mode-map (kbd "C-/") #'vterm-undo)
;; Function keys and most of C- and M- bindings
(mapc (lambda (key)
@@ -276,6 +256,51 @@ If nil, never delay")
unless (member key vterm-keymap-exceptions)
collect key))))
+;; Keybindings
+(define-key vterm-mode-map [tab] #'vterm-send-tab)
+(define-key vterm-mode-map (kbd "TAB") #'vterm-send-tab)
+(define-key vterm-mode-map [backtab] #'vterm--self-insert)
+(define-key vterm-mode-map [backspace] #'vterm-send-backspace)
+(define-key vterm-mode-map (kbd "DEL") #'vterm-send-backspace)
+(define-key vterm-mode-map [M-backspace] #'vterm-send-meta-backspace)
+(define-key vterm-mode-map (kbd "M-DEL") #'vterm-send-meta-backspace)
+(define-key vterm-mode-map [return] #'vterm-send-return)
+(define-key vterm-mode-map (kbd "RET") #'vterm-send-return)
+(define-key vterm-mode-map [left] #'vterm-send-left)
+(define-key vterm-mode-map [right] #'vterm-send-right)
+(define-key vterm-mode-map [up] #'vterm-send-up)
+(define-key vterm-mode-map [down] #'vterm-send-down)
+(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 yank] #'vterm-yank)
+(define-key vterm-mode-map (kbd "C-SPC") #'vterm--self-insert)
+(define-key vterm-mode-map (kbd "C-_") #'vterm--self-insert)
+(define-key vterm-mode-map (kbd "C-/") #'vterm-undo)
+(define-key vterm-mode-map (kbd "M-.") #'vterm-send-meta-dot)
+(define-key vterm-mode-map (kbd "M-,") #'vterm-send-meta-comma)
+(define-key vterm-mode-map (kbd "C-c C-y") #'vterm--self-insert)
+(define-key vterm-mode-map (kbd "C-c C-c") #'vterm-send-ctrl-c)
+(define-key vterm-mode-map [remap self-insert-command] #'vterm--self-insert)
+
+(define-key vterm-mode-map (kbd "C-c C-t") #'vterm-copy-mode)
+
+(defvar vterm-copy-mode-map (make-sparse-keymap)
+ "Minor mode map for `vterm-copy-mode'.")
+(define-key vterm-copy-mode-map (kbd "C-c C-t") #'vterm-copy-mode)
+
+(define-minor-mode vterm-copy-mode
+ "Toggle vterm copy mode."
+ :group 'vterm
+ :lighter " VTermCopy"
+ :keymap vterm-copy-mode-map
+ (if vterm-copy-mode
+ (progn ;enable vterm-copy-mode
+ (use-local-map nil)
+ (vterm-send-stop))
+ (use-local-map vterm-mode-map)
+ (vterm-send-start)))
+
(defun vterm--self-insert ()
"Sends invoking key to libvterm."
(interactive)
@@ -296,6 +321,66 @@ If nil, never delay")
(setq key (upcase key)))
(vterm--update vterm--term key shift meta ctrl))))
+(defun vterm-send-start ()
+ "Output from the system is started when the system receives START."
+ (interactive)
+ (vterm-send-key "<start>"))
+
+(defun vterm-send-stop ()
+ "Output from the system is stopped when the system receives STOP."
+ (interactive)
+ (vterm-send-key "<stop>"))
+
+(defun vterm-send-return ()
+ "Sends `<return>' to the libvterm."
+ (interactive)
+ (vterm-send-key "<return>"))
+
+(defun vterm-send-tab ()
+ "Sends `<tab>' to the libvterm."
+ (interactive)
+ (vterm-send-key "<tab>"))
+
+(defun vterm-send-backspace ()
+ "Sends `<backspace>' to the libvterm."
+ (interactive)
+ (vterm-send-key "<backspace>"))
+
+(defun vterm-send-meta-backspace ()
+ "Sends `M-<backspace>' to the libvterm."
+ (interactive)
+ (vterm-send-key "<backspace>" nil t))
+
+(defun vterm-send-up ()
+ "Sends `<up>' to the libvterm."
+ (interactive)
+ (vterm-send-key "<up>"))
+
+(defun vterm-send-down ()
+ "Sends `<down>' to the libvterm."
+ (interactive)
+ (vterm-send-key "<down>"))
+
+(defun vterm-send-left()
+ "Sends `<left>' to the libvterm."
+ (interactive)
+ (vterm-send-key "<left>"))
+
+(defun vterm-send-right()
+ "Sends `<right>' to the libvterm."
+ (interactive)
+ (vterm-send-key "<right>"))
+
+(defun vterm-send-meta-dot()
+ "Sends `M-.' to the libvterm."
+ (interactive)
+ (vterm-send-key "." nil t))
+
+(defun vterm-send-meta-comma()
+ "Sends `M-,' to the libvterm."
+ (interactive)
+ (vterm-send-key "," nil t))
+
(defun vterm-send-ctrl-c ()
"Sends `C-c' to the libvterm."
(interactive)