diff options
| -rw-r--r-- | vterm-module.c | 38 | ||||
| -rw-r--r-- | vterm-module.h | 5 | ||||
| -rw-r--r-- | vterm.el | 10 |
3 files changed, 45 insertions, 8 deletions
diff --git a/vterm-module.c b/vterm-module.c index 201c9b2..02daed5 100644 --- a/vterm-module.c +++ b/vterm-module.c @@ -2,9 +2,11 @@ #include "elisp.h" #include "utf8.h" #include <assert.h> +#include <fcntl.h> #include <limits.h> #include <stdio.h> #include <string.h> +#include <termios.h> #include <unistd.h> #include <vterm.h> @@ -526,7 +528,16 @@ static void term_flush_output(Term *term, emacs_env *env) { static void term_process_key(Term *term, unsigned char *key, size_t len, VTermModifier modifier) { if (is_key(key, len, "<return>")) { - vterm_keyboard_key(term->vt, VTERM_KEY_ENTER, modifier); + if (term->pty_fd > 0) { + struct termios keys; + tcgetattr(term->pty_fd, &keys); + if (keys.c_iflag & ICRNL) + vterm_keyboard_unichar(term->vt, 10, modifier); + else + vterm_keyboard_unichar(term->vt, 13, modifier); + } else { + vterm_keyboard_key(term->vt, VTERM_KEY_ENTER, modifier); + } } else if (is_key(key, len, "<start_paste>")) { vterm_keyboard_start_paste(term->vt); } else if (is_key(key, len, "<end_paste>")) { @@ -601,6 +612,10 @@ void term_finalize(void *object) { term->title = NULL; } + if (term->pty_fd > 0) { + close(term->pty_fd); + } + free(term->sb_buffer); vterm_free(term->vt); free(term); @@ -630,6 +645,7 @@ emacs_value Fvterm_new(emacs_env *env, ptrdiff_t nargs, emacs_value args[], term->invalid_end = rows; term->width = cols; term->height = rows; + term->pty_fd = -1; term->title = NULL; term->is_title_changed = false; @@ -703,6 +719,22 @@ emacs_value Fvterm_set_size(emacs_env *env, ptrdiff_t nargs, emacs_value args[], return Qnil; } + +emacs_value Fvterm_set_pty_name(emacs_env *env, ptrdiff_t nargs, + emacs_value args[], void *data) { + Term *term = env->get_user_ptr(env, args[0]); + + if (nargs > 1) { + ptrdiff_t len = string_bytes(env, args[1]); + char filename[len]; + + env->copy_string_contents(env, args[1], filename, &len); + + term->pty_fd = open(filename, O_RDONLY); + } + return Qnil; +} + int emacs_module_init(struct emacs_runtime *ert) { emacs_env *env = ert->get_environment(ert); @@ -785,6 +817,10 @@ int emacs_module_init(struct emacs_runtime *ert) { "Sets the size of the terminal.", NULL); bind_function(env, "vterm--set-size", fun); + fun = env->make_function(env, 2, 2, Fvterm_set_pty_name, + "Sets the name of the pty.", NULL); + bind_function(env, "vterm--set-pty-name", fun); + provide(env, "vterm-module"); return 0; diff --git a/vterm-module.h b/vterm-module.h index 7f599b4..0eb2f6c 100644 --- a/vterm-module.h +++ b/vterm-module.h @@ -60,6 +60,8 @@ typedef struct Term { bool is_title_changed; int width, height; + + int pty_fd; } Term; static bool compare_cells(VTermScreenCell *a, VTermScreenCell *b); @@ -90,6 +92,9 @@ emacs_value Fvterm_write_input(emacs_env *env, ptrdiff_t nargs, emacs_value args[], void *data); emacs_value Fvterm_set_size(emacs_env *env, ptrdiff_t nargs, emacs_value args[], void *data); +emacs_value Fvterm_set_pty_name(emacs_env *env, ptrdiff_t nargs, + emacs_value args[], void *data); + int emacs_module_init(struct emacs_runtime *ert); #endif /* VTERM_MODULE_H */ @@ -158,13 +158,14 @@ for different shell" :coding 'no-conversion :connection-type 'pty :filter #'vterm--filter - :sentinel (when vterm-exit-functions #'vterm--sentinel))))) + :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 [backspace] #'vterm--self-insert) (define-key vterm-mode-map [M-backspace] #'vterm--self-insert) -(define-key vterm-mode-map [return] #'vterm-send-return) +(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) @@ -223,11 +224,6 @@ for different shell" (interactive) (vterm-send-key "_" nil nil t)) -(defun vterm-send-return () - "Sends C-m to the libvterm." - (interactive) - (process-send-string vterm--process "\C-m")) - (defun vterm-yank () "Implementation of `yank' (paste) in vterm." (interactive) |
