From d0225168a726144e699f6b049e98e167daf0705f Mon Sep 17 00:00:00 2001 From: jixiuf Date: Thu, 1 Aug 2019 11:04:43 +0800 Subject: add 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-cC-t`. --- README.md | 4 ++++ vterm.el | 18 +++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 308621b..8dc78c6 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,10 @@ Open a terminal in the current window. ## `vterm-other-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-cC-t`. # Customization diff --git a/vterm.el b/vterm.el index 1c9e8f4..da80143 100644 --- a/vterm.el +++ b/vterm.el @@ -232,7 +232,7 @@ If nil, never delay") :name "vterm" :buffer (current-buffer) :command `("/bin/sh" "-c" - ,(format "stty -nl sane iutf8 erase ^? rows %d columns %d >/dev/null && exec %s" + ,(format "stty -nl sane ixon iutf8 erase ^? rows %d columns %d >/dev/null && exec %s" (window-body-height) (window-body-width) vterm-shell)) @@ -262,6 +262,7 @@ If nil, never delay") (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) +(define-key vterm-mode-map (kbd "C-c C-t") #'vterm-copy-mode) ;; Function keys and most of C- and M- bindings (mapc (lambda (key) @@ -276,6 +277,21 @@ If nil, never delay") unless (member key vterm-keymap-exceptions) collect key)))) +(defvar vterm-copy-map (make-sparse-keymap)) +(define-key vterm-copy-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-map + (if vterm-copy-mode + (progn ;enable vterm-copy-mode + (use-local-map nil) + (vterm-send-key "s" nil nil t)) + (use-local-map vterm-mode-map) + (vterm-send-key "q" nil nil t))) + (defun vterm--self-insert () "Sends invoking key to libvterm." (interactive) -- cgit v1.0 From 26b6aba78469147c5a75ab9ad94e17305f24e76c Mon Sep 17 00:00:00 2001 From: jixiuf Date: Thu, 1 Aug 2019 23:13:50 +0800 Subject: replace `ctrl-s` and `ctrl-q` with tcflow(term->pty_fd,TCOON/TCOOFF); --- vterm-module.c | 4 ++++ vterm.el | 15 +++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/vterm-module.c b/vterm-module.c index edf8237..6ad3a6f 100644 --- a/vterm-module.c +++ b/vterm-module.c @@ -540,6 +540,10 @@ 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, "")) { + tcflow(term->pty_fd, TCOON); + } else if (is_key(key, len, "")) { + tcflow(term->pty_fd, TCOOFF); } else if (is_key(key, len, "")) { vterm_keyboard_start_paste(term->vt); } else if (is_key(key, len, "")) { diff --git a/vterm.el b/vterm.el index da80143..70a4a8b 100644 --- a/vterm.el +++ b/vterm.el @@ -288,9 +288,9 @@ If nil, never delay") (if vterm-copy-mode (progn ;enable vterm-copy-mode (use-local-map nil) - (vterm-send-key "s" nil nil t)) + (vterm-send-stop)) (use-local-map vterm-mode-map) - (vterm-send-key "q" nil nil t))) + (vterm-send-start))) (defun vterm--self-insert () "Sends invoking key to libvterm." @@ -312,6 +312,17 @@ 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 "")) + +(defun vterm-send-stop () + "Output from the system is stopped when the system receives STOP." + (interactive) + (vterm-send-key "")) + + (defun vterm-send-ctrl-c () "Sends `C-c' to the libvterm." (interactive) -- cgit v1.0 From af96708e6ba91c2000b151b539ac28b7b7527bc8 Mon Sep 17 00:00:00 2001 From: jixiuf Date: Thu, 1 Aug 2019 13:44:24 +0800 Subject: order keybindings,no code change --- vterm.el | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/vterm.el b/vterm.el index 70a4a8b..e91b3a9 100644 --- a/vterm.el +++ b/vterm.el @@ -242,6 +242,20 @@ If nil, never delay") :sentinel (when vterm-exit-functions #'vterm--sentinel)))) (vterm--set-pty-name vterm--term (process-tty-name vterm--process))) + +;; Function keys and most of C- and M- bindings +(mapc (lambda (key) + (define-key vterm-mode-map (kbd key) #'vterm--self-insert)) + (append (cl-loop for number from 1 to 12 + for key = (format "" number) + unless (member key vterm-keymap-exceptions) + collect key) + (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)))) + ;; Keybindings (define-key vterm-mode-map [tab] #'vterm--self-insert) (define-key vterm-mode-map [backtab] #'vterm--self-insert) @@ -263,20 +277,6 @@ If nil, never delay") (define-key vterm-mode-map (kbd "C-SPC") #'vterm--self-insert) (define-key vterm-mode-map (kbd "C-/") #'vterm-undo) (define-key vterm-mode-map (kbd "C-c C-t") #'vterm-copy-mode) - -;; Function keys and most of C- and M- bindings -(mapc (lambda (key) - (define-key vterm-mode-map (kbd key) #'vterm--self-insert)) - (append (cl-loop for number from 1 to 12 - for key = (format "" number) - unless (member key vterm-keymap-exceptions) - collect key) - (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)))) - (defvar vterm-copy-map (make-sparse-keymap)) (define-key vterm-copy-map (kbd "C-c C-t") #'vterm-copy-mode) -- cgit v1.0 From c73b60a1491506af395cb5358cee30083a5cec63 Mon Sep 17 00:00:00 2001 From: jixiuf Date: Thu, 1 Aug 2019 14:35:16 +0800 Subject: add missing keybind and make the keybinding work for emacs -nw --- vterm.el | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 63 insertions(+), 8 deletions(-) diff --git a/vterm.el b/vterm.el index e91b3a9..e4b1d5b 100644 --- a/vterm.el +++ b/vterm.el @@ -257,18 +257,23 @@ If nil, never delay") collect key)))) ;; Keybindings -(define-key vterm-mode-map [tab] #'vterm--self-insert) +(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--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 [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 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) @@ -276,6 +281,8 @@ If nil, never delay") (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) +(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-t") #'vterm-copy-mode) (defvar vterm-copy-map (make-sparse-keymap)) (define-key vterm-copy-map (kbd "C-c C-t") #'vterm-copy-mode) @@ -322,6 +329,54 @@ If nil, never delay") (interactive) (vterm-send-key "")) +(defun vterm-send-return () + "Sends `' to the libvterm." + (interactive) + (vterm-send-key "")) + +(defun vterm-send-tab () + "Sends `' to the libvterm." + (interactive) + (vterm-send-key "")) + +(defun vterm-send-backspace () + "Sends `' to the libvterm." + (interactive) + (vterm-send-key "")) +(defun vterm-send-meta-backspace () + "Sends `M-' to the libvterm." + (interactive) + (vterm-send-key "" nil t)) + +(defun vterm-send-up () + "Sends `' to the libvterm." + (interactive) + (vterm-send-key "")) + +(defun vterm-send-down () + "Sends `' to the libvterm." + (interactive) + (vterm-send-key "")) + +(defun vterm-send-left() + "Sends `' to the libvterm." + (interactive) + (vterm-send-key "")) + +(defun vterm-send-right() + "Sends `' to the libvterm." + (interactive) + (vterm-send-key "")) + +(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." -- cgit v1.0 From d74b7e41f9aeca3ece4d7de0cc54d8b6a6034733 Mon Sep 17 00:00:00 2001 From: jixiuf Date: Thu, 1 Aug 2019 23:20:37 +0800 Subject: run clang-format --- elisp.c | 1 - vterm-module.c | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) 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 6ad3a6f..4ec78dc 100644 --- a/vterm-module.c +++ b/vterm-module.c @@ -550,7 +550,8 @@ static void term_process_key(Term *term, unsigned char *key, size_t len, vterm_keyboard_end_paste(term->vt); } else if (is_key(key, len, "")) { vterm_keyboard_key(term->vt, VTERM_KEY_TAB, modifier); - } else if (is_key(key, len, "") || is_key(key, len, "")) { + } else if (is_key(key, len, "") || + is_key(key, len, "")) { vterm_keyboard_key(term->vt, VTERM_KEY_TAB, VTERM_MOD_SHIFT); } else if (is_key(key, len, "")) { vterm_keyboard_key(term->vt, VTERM_KEY_BACKSPACE, modifier); -- cgit v1.0 From 05263d0db3f5a3e58123a92fd1b1181562f21597 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20F=C3=BCrmetz?= Date: Sat, 3 Aug 2019 12:04:01 +0200 Subject: Formatting --- README.md | 7 ++++--- vterm.el | 21 ++++++++++++--------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 8dc78c6..2746558 100644 --- a/README.md +++ b/README.md @@ -57,10 +57,11 @@ Open a terminal in the current window. ## `vterm-other-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-cC-t`. +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 diff --git a/vterm.el b/vterm.el index e4b1d5b..4a4069b 100644 --- a/vterm.el +++ b/vterm.el @@ -232,7 +232,7 @@ If nil, never delay") :name "vterm" :buffer (current-buffer) :command `("/bin/sh" "-c" - ,(format "stty -nl sane ixon iutf8 erase ^? rows %d columns %d >/dev/null && exec %s" + ,(format "stty -nl sane iutf8 erase ^? rows %d columns %d >/dev/null && exec %s" (window-body-height) (window-body-width) vterm-shell)) @@ -273,25 +273,27 @@ If nil, never delay") (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--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-map (make-sparse-keymap)) -(define-key vterm-copy-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-map + :keymap vterm-copy-mode-map (if vterm-copy-mode (progn ;enable vterm-copy-mode (use-local-map nil) @@ -343,6 +345,7 @@ If nil, never delay") "Sends `' to the libvterm." (interactive) (vterm-send-key "")) + (defun vterm-send-meta-backspace () "Sends `M-' to the libvterm." (interactive) -- cgit v1.0