aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--vis-lua.c6
-rw-r--r--vis.c12
-rw-r--r--vis.h2
3 files changed, 20 insertions, 0 deletions
diff --git a/vis-lua.c b/vis-lua.c
index a62daf8..ca36d2d 100644
--- a/vis-lua.c
+++ b/vis-lua.c
@@ -2019,6 +2019,12 @@ 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);
+ if (!vis_window_change_file(win, filename)) {
+ return luaL_argerror(L, 3, "failed to open");
+ }
+ return 0;
}
}
diff --git a/vis.c b/vis.c
index 0c05558..dca90c1 100644
--- a/vis.c
+++ b/vis.c
@@ -505,6 +505,18 @@ 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);
+ return true;
+}
+
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 8287a45..fcc1e05 100644
--- a/vis.h
+++ b/vis.h
@@ -209,6 +209,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. */