vis

a vi-like editor based on Plan 9's structural regular expressions

git clone https://9o.is/git/vis.git

commit 34058a79885e0572260460b9f45580802dc0cb01
parent d23ca2b878d33c5797583a5771031a1074a0155f
Author: Marc André Tanner <mat@brain-dump.org>
Date:   Wed, 20 Apr 2016 19:13:48 +0200

vis: handle termination from within win_open event gracefully

Diffstat:
Msam.c | 19++++++++++---------
Mvis.c | 5++---
2 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/sam.c b/sam.c @@ -768,16 +768,17 @@ enum SamError sam_cmd(Vis *vis, const char *s) { Filerange range = text_range_empty(); sam_execute(vis, vis->win, cmd, NULL, &range); - bool completed = true; - for (Cursor *c = view_cursors(vis->win->view); c; c = view_cursors_next(c)) { - Filerange sel = view_cursors_selection_get(c); - if (text_range_valid(&sel)) { - completed = false; - break; + if (vis->win) { + bool completed = true; + for (Cursor *c = view_cursors(vis->win->view); c; c = view_cursors_next(c)) { + Filerange sel = view_cursors_selection_get(c); + if (text_range_valid(&sel)) { + completed = false; + break; + } } + vis_mode_switch(vis, completed ? VIS_MODE_NORMAL : VIS_MODE_VISUAL); } - - vis_mode_switch(vis, completed ? VIS_MODE_NORMAL : VIS_MODE_VISUAL); command_free(cmd); return err; } @@ -950,7 +951,7 @@ static bool cmd_select(Vis *vis, Win *win, Command *cmd, const char *argv[], Cur break; } - if (view == vis->win->view && primary != view_cursors_primary_get(view)) + if (vis->win && vis->win->view == view && primary != view_cursors_primary_get(view)) view_cursors_primary_set(view_cursors(view)); return ret; } diff --git a/vis.c b/vis.c @@ -280,7 +280,6 @@ bool vis_window_new(Vis *vis, const char *filename) { return false; } - vis_window_name(win, filename); vis_draw(vis); return true; @@ -849,7 +848,7 @@ static void vis_args(Vis *vis, int argc, char *argv[]) { } } - if (!vis->windows) { + if (!vis->windows && vis->running) { if (!strcmp(argv[argc-1], "-")) { if (!vis_window_new(vis, NULL)) vis_die(vis, "Can not create empty buffer\n"); @@ -877,6 +876,7 @@ static void vis_args(Vis *vis, int argc, char *argv[]) { } int vis_run(Vis *vis, int argc, char *argv[]) { + vis->running = true; vis_args(vis, argc, argv); struct timespec idle = { .tv_nsec = 0 }, *timeout = NULL; @@ -884,7 +884,6 @@ int vis_run(Vis *vis, int argc, char *argv[]) { sigset_t emptyset; sigemptyset(&emptyset); vis_draw(vis); - vis->running = true; vis->exit_status = EXIT_SUCCESS; sigsetjmp(vis->sigbus_jmpbuf, 1);