diff options
| -rw-r--r-- | lua/vis.lua | 2 | ||||
| -rw-r--r-- | main.c | 2 | ||||
| -rw-r--r-- | vis-lua.c | 35 | ||||
| -rw-r--r-- | vis-lua.h | 7 | ||||
| -rw-r--r-- | vis.c | 6 | ||||
| -rw-r--r-- | vis.h | 2 |
6 files changed, 53 insertions, 1 deletions
diff --git a/lua/vis.lua b/lua/vis.lua index 2cc13bd..98ba6e5 100644 --- a/lua/vis.lua +++ b/lua/vis.lua @@ -91,6 +91,7 @@ local events = { FILE_SAVE_POST = "Event::FILE_SAVE_POST", -- see @{file_save_post} FILE_SAVE_PRE = "Event::FILE_SAVE_PRE", -- see @{file_save_pre} INIT = "Event::INIT", -- see @{init} + INPUT = "Event::INPUT", -- see @{input} QUIT = "Event::QUIT", -- see @{quit} START = "Event::START", -- see @{start} THEME_CHANGE = "Event::THEME_CHANGE", -- see @{theme_change} @@ -106,6 +107,7 @@ events.file_open = function(...) events.emit(events.FILE_OPEN, ...) end events.file_save_post = function(...) events.emit(events.FILE_SAVE_POST, ...) end events.file_save_pre = function(...) return events.emit(events.FILE_SAVE_PRE, ...) end events.init = function(...) events.emit(events.INIT, ...) end +events.input = function(...) return events.emit(events.INPUT, ...) end events.quit = function(...) events.emit(events.QUIT, ...) end events.start = function(...) events.emit(events.START, ...) end events.theme_change = function(...) events.emit(events.THEME_CHANGE, ...) end @@ -2189,6 +2189,8 @@ int main(int argc, char *argv[]) { .init = vis_lua_init, .start = vis_lua_start, .quit = vis_lua_quit, + .mode_insert_input = vis_lua_mode_insert_input, + .mode_replace_input = vis_lua_mode_replace_input, .file_open = vis_lua_file_open, .file_save_pre = vis_lua_file_save_pre, .file_save_post = vis_lua_file_save_post, @@ -1740,7 +1740,7 @@ static const struct luaL_Reg file_lines_funcs[] = { * `vis.events` table. Users scripts should generally use the [Events](#events) * mechanism instead which multiplexes these core events. * - * @section Core Events + * @section Core_Events */ static void vis_lua_event_get(lua_State *L, const char *name) { @@ -2018,6 +2018,39 @@ void vis_lua_quit(Vis *vis) { } /*** + * Input key event in either input or replace mode. + * @function input + * @tparam string key + * @treturn bool whether the key was cosumed or not + */ +static bool vis_lua_input(Vis *vis, const char *key, size_t len) { + if (vis->win->file->internal) + return false; + lua_State *L = vis->lua; + bool ret = false; + vis_lua_event_get(L, "input"); + if (lua_isfunction(L, -1)) { + lua_pushlstring(L, key, len); + if (pcall(vis, L, 1, 1) != 0) { + ret = lua_isboolean(L, -1) && lua_toboolean(L, -1); + lua_pop(L, 1); + } + } + lua_pop(L, 1); + return ret; +} + +void vis_lua_mode_insert_input(Vis *vis, const char *key, size_t len) { + if (!vis_lua_input(vis, key, len)) + vis_insert_key(vis, key, len); +} + +void vis_lua_mode_replace_input(Vis *vis, const char *key, size_t len) { + if (!vis_lua_input(vis, key, len)) + vis_replace_key(vis, key, len); +} + +/*** * File open. * @function file_open * @tparam File file the file to be opened @@ -22,6 +22,13 @@ bool vis_lua_paths_get(Vis*, char **lpath, char **cpath); void vis_lua_init(Vis*); void vis_lua_start(Vis*); void vis_lua_quit(Vis*); +#if !CONFIG_LUA +#define vis_lua_mode_insert_input vis_insert_key +#define vis_lua_mode_replace_input vis_replace_key +#else +void vis_lua_mode_insert_input(Vis*, const char *key, size_t len); +void vis_lua_mode_replace_input(Vis*, const char *key, size_t len); +#endif void vis_lua_file_open(Vis*, File*); bool vis_lua_file_save_pre(Vis*, File*, const char *path); void vis_lua_file_save_post(Vis*, File*, const char *path); @@ -535,6 +535,12 @@ Vis *vis_new(Ui *ui, VisEvent *event) { goto err; vis->mode_prev = vis->mode = &vis_modes[VIS_MODE_NORMAL]; vis->event = event; + if (event) { + if (event->mode_insert_input) + vis_modes[VIS_MODE_INSERT].input = event->mode_insert_input; + if (event->mode_replace_input) + vis_modes[VIS_MODE_REPLACE].input = event->mode_replace_input; + } return vis; err: vis_free(vis); @@ -31,6 +31,8 @@ typedef struct { void (*init)(Vis*); void (*start)(Vis*); void (*quit)(Vis*); + void (*mode_insert_input)(Vis*, const char *key, size_t len); + void (*mode_replace_input)(Vis*, const char *key, size_t len); void (*file_open)(Vis*, File*); bool (*file_save_pre)(Vis*, File*, const char *path); void (*file_save_post)(Vis*, File*, const char *path); |
