aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--vterm-module.c38
-rw-r--r--vterm-module.h5
-rw-r--r--vterm.el10
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 */
diff --git a/vterm.el b/vterm.el
index 63ff177..43cd4e8 100644
--- a/vterm.el
+++ b/vterm.el
@@ -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)