This patch allows Lua to change the file displayed in a window
by simply writing the file's name to the win.file member.
Why is this useful?
Mr Alin and I were busy writing a usable file lock plugin [1] in Lua the last
couple days. It is somewhat finished.
How ever one use case is not well supported.
If you open a file and then try to edit a locked file using the edit command,
there is currently no good way to abort the edit attempt and switch back to the
previously opened file with the current Lua API.
We tried all sorts of things: hooking various events, delaying the change to
subsequent UI_DRAW events, ... .
This patch solves this use case because Lua now can simply reset the opened
file in the new window created by cmd_edit during the WIN_OPEN event [2].
What do you think?
Are there any concerns about changing a window's file from Lua?
Do you know of any corner case I am missing?
Best,
Flo
[1]: https://gitlab.com/muhq/vis-lockfiles
[2]: https://gitlab.com/muhq/vis-lockfiles/-/merge_requests/6
> Florian Fischer <florian.fischer@muhq.space> wrote:> > ---> > vis-lua.c | 3 +++> > vis.c | 11 +++++++++++> > vis.h | 2 ++> > 3 files changed, 16 insertions(+)> > > > diff --git a/vis-lua.c b/vis-lua.c> > index 4d783c5d..cb328b66 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 = strdup(lua_tostring(L, 3));> > Theoretically strdup can return NULL so we should probably check for that.> > Also, I think this currently leaks memory. We should free the memory> that strdup allocates.
You are totally right.
The strdup is a leftover from a previous iteration of this change.
In this patch it is completely useless, because file_new already creates a copy
of the passed file name.
I will remove the strdup call in v2 in the future.
Flo
Florian Fischer <florian.fischer@muhq.space> wrote:
> > Florian Fischer <florian.fischer@muhq.space> wrote:> > > ---> > > vis-lua.c | 3 +++> > > vis.c | 11 +++++++++++> > > vis.h | 2 ++> > > 3 files changed, 16 insertions(+)> > > > > > diff --git a/vis-lua.c b/vis-lua.c> > > index 4d783c5d..cb328b66 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 = strdup(lua_tostring(L, 3));> > > > Theoretically strdup can return NULL so we should probably check for that.> > > > Also, I think this currently leaks memory. We should free the memory> > that strdup allocates.> > You are totally right.> > The strdup is a leftover from a previous iteration of this change.> In this patch it is completely useless, because file_new already creates a copy> of the passed file name.
Ah, yes, you are correct!
> I will remove the strdup call in v2 in the future.
Sounds good to me, thanks!
Cheers,
Silvan