diff options
| author | jixiuf <jixiuf@qq.com> | 2019-08-03 18:48:22 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-08-03 18:48:22 +0800 |
| commit | 54d53da48e57b7bb5a296975b7361e108dc7b49d (patch) | |
| tree | c04797aad25c70a7eae7db2caa2f8614776ef145 | |
| parent | ee07b5a1e798a8b45c242de2bcdabc009ff055be (diff) | |
| parent | 05263d0db3f5a3e58123a92fd1b1181562f21597 (diff) | |
Merge pull request #108 from jixiuf/support-vterm-copy-mode
support vterm-copy-mode
| -rw-r--r-- | README.md | 5 | ||||
| -rw-r--r-- | elisp.c | 1 | ||||
| -rw-r--r-- | vterm-module.c | 7 | ||||
| -rw-r--r-- | vterm.el | 125 |
4 files changed, 116 insertions, 22 deletions
@@ -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` @@ -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); @@ -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) |
