aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjixiuf <jixiuf@qq.com>2019-07-12 01:01:04 +0800
committerjixiuf <jixiuf@qq.com>2019-07-12 01:01:04 +0800
commit46233c00713c95ae5647179f8d98426bfa24a736 (patch)
tree7802718dc21e72f1b15af8edaa81b8a0951895d9
parent2422c3858b6a41c07c12d3c9482dd0d6bb821f84 (diff)
When a command keep print outputs, the buffer can auto scroll now even the vterm window is not activated.
should fix #84
-rw-r--r--elisp.c6
-rw-r--r--elisp.h5
-rw-r--r--vterm-module.c7
3 files changed, 18 insertions, 0 deletions
diff --git a/elisp.c b/elisp.c
index 30e8a52..5cb5bdf 100644
--- a/elisp.c
+++ b/elisp.c
@@ -77,6 +77,12 @@ void delete_lines(emacs_env *env, int linenum, int count, bool del_whole_line) {
void recenter(emacs_env *env, emacs_value pos) {
env->funcall(env, Frecenter, 1, (emacs_value[]){pos});
}
+emacs_value point(emacs_env *env) { return env->funcall(env, Fpoint, 0, NULL); }
+
+void set_window_point(emacs_env *env, emacs_value win, emacs_value point) {
+ env->funcall(env, Fset_window_point, 2, (emacs_value[]){win, point});
+}
+
bool eq(emacs_env *env, emacs_value e1, emacs_value e2) {
emacs_value Qeq = env->funcall(env, Feq, 2, (emacs_value[]){e1, e2});
return env->is_not_nil(env, Qeq);
diff --git a/elisp.h b/elisp.h
index 91461c9..774b681 100644
--- a/elisp.h
+++ b/elisp.h
@@ -37,6 +37,9 @@ emacs_value Fgoto_line;
emacs_value Fdelete_lines;
emacs_value Fbuffer_line_number;
emacs_value Frecenter;
+emacs_value Fset_window_point;
+emacs_value Fpoint;
+
emacs_value Fput_text_property;
emacs_value Fset;
emacs_value Fvterm_face_color_hex;
@@ -69,6 +72,8 @@ emacs_value get_hex_color_fg(emacs_env *env, emacs_value face);
emacs_value get_hex_color_bg(emacs_env *env, emacs_value face);
emacs_value buffer_line_number(emacs_env *env);
void recenter(emacs_env *env, emacs_value pos);
+void set_window_point(emacs_env *env, emacs_value win, emacs_value point);
+emacs_value point(emacs_env *env);
bool eq(emacs_env *env, emacs_value e1, emacs_value e2);
void forward_char(emacs_env *env, emacs_value n);
emacs_value get_buffer_window(emacs_env *env);
diff --git a/vterm-module.c b/vterm-module.c
index e971884..92fa4ef 100644
--- a/vterm-module.c
+++ b/vterm-module.c
@@ -310,6 +310,10 @@ static void adjust_topline(Term *term, emacs_env *env, long added) {
} else {
recenter(env, env->make_integer(env, pos.row));
}
+ }else{
+ if (env->is_not_nil(env, window)) {
+ set_window_point(env, window, point(env));
+ }
}
}
@@ -763,6 +767,9 @@ int emacs_module_init(struct emacs_runtime *ert) {
Fdelete_lines =
env->make_global_ref(env, env->intern(env, "vterm--delete-lines"));
Frecenter = env->make_global_ref(env, env->intern(env, "recenter"));
+ Fset_window_point =
+ env->make_global_ref(env, env->intern(env, "set-window-point"));
+ Fpoint = env->make_global_ref(env, env->intern(env, "point"));
Fforward_char = env->make_global_ref(env, env->intern(env, "forward-char"));
Fblink_cursor_mode =
env->make_global_ref(env, env->intern(env, "blink-cursor-mode"));