diff --git a/vis-lua.c b/vis-lua.c index 4d783c5de..81b221113 100644 --- a/vis-lua.c +++ b/vis-lua.c @@ -2058,6 +2058,9 @@ static int window_newindex(lua_State *L) { } lua_pop(L, 1); return ret; + } else if (strcmp(key, "file") == 0 && lua_isstring(L, 3)) { + const char* filename = lua_tostring(L, 3); + vis_window_change_file(win, filename); } } diff --git a/vis.c b/vis.c index 0c05558a1..7f0050579 100644 --- a/vis.c +++ b/vis.c @@ -505,6 +505,17 @@ bool vis_window_reload(Win *win) { return true; } +bool vis_window_change_file(Win *win, const char* filename) { + File *file = file_new(win->vis, filename); + if (!file) + return false; + file->refcount++; + if (win->file) + file_free(win->vis, win->file); + win->file = file; + view_reload(win->view, file->text); +} + bool vis_window_split(Win *original) { vis_doupdates(original->vis, false); Win *win = window_new_file(original->vis, original->file, UI_OPTION_STATUSBAR); diff --git a/vis.h b/vis.h index 312e87c41..b7192c6f0 100644 --- a/vis.h +++ b/vis.h @@ -212,6 +212,8 @@ bool vis_window_new(Vis*, const char *filename); bool vis_window_new_fd(Vis*, int fd); /** Reload the file currently displayed in the window from disk. */ bool vis_window_reload(Win*); +/** Change the file currently displayed in the window. */ +bool vis_window_change_file(Win*, const char *filename); /** Check whether closing the window would loose unsaved changes. */ bool vis_window_closable(Win*); /** Close window, redraw user interface. */