diff options
| author | Max Schillinger <maxschillinger@web.de> | 2024-03-18 10:08:40 +0100 |
|---|---|---|
| committer | Randy Palamar <randy@rnpnr.xyz> | 2025-11-28 07:41:12 -0700 |
| commit | 3f1c3ee80e46f80d7f1642009c4f9dffa404d935 (patch) | |
| tree | 08e3ab9011bcb4396ffca5f51d20c079d44da901 /vis-lua.c | |
| parent | 12fc09a442939d0af09d700c7a8074cca9b1694e (diff) | |
| download | vis-3f1c3ee80e46f80d7f1642009c4f9dffa404d935.tar.gz vis-3f1c3ee80e46f80d7f1642009c4f9dffa404d935.tar.xz | |
Add command completion with tab key
In the command prompt, press <tab> to get a list of all available
commands and pick one (using vis-menu). This works also after typing the
first letters of a command (p.e. `:la<tab>`).
Co-authored-by: Matěj Cepl <mcepl@cepl.eu>
Diffstat (limited to 'vis-lua.c')
| -rw-r--r-- | vis-lua.c | 36 |
1 files changed, 36 insertions, 0 deletions
@@ -1147,6 +1147,41 @@ static int command_register(lua_State *L) { } /*** + * Let user pick a command matching the given prefix. + * + * The editor core will be blocked while the external process is running. + * + * @function complete_command + * @tparam string prefix the prefix of the command to be completed + * @treturn int code the exit status of the executed command + * @treturn string stdout the data written to stdout + * @treturn string stderr the data written to stderr + */ +static int complete_command(lua_State *L) { + Vis *vis = obj_ref_check(L, 1, "vis"); + const char *prefix = luaL_checkstring(L, 2); + char *out = NULL, *err = NULL; + char cmd[32]; + int max_prefix_len = sizeof(cmd) - sizeof("grep '^' | vis-menu -b"); // including NUL + snprintf(cmd, sizeof(cmd), "grep '^%.*s' | vis-menu -b", max_prefix_len, prefix); + + Buffer buf = {0}; + vis_print_cmds(vis, &buf); + int status = vis_pipe_buf_collect(vis, buffer_content0(&buf), (const char*[]){cmd, NULL}, &out, &err, false); + + lua_pushinteger(L, status); + if (out) lua_pushstring(L, out); + else lua_pushnil(L); + if (err) lua_pushstring(L, err); + else lua_pushnil(L); + + free(out); + free(err); + buffer_release(&buf); + return 3; +} + +/*** * Push keys to input queue and interpret them. * * The keys are processed as if they were read from the keyboard. @@ -1559,6 +1594,7 @@ static const struct luaL_Reg vis_lua[] = { { "option_register", option_register }, { "option_unregister", option_unregister }, { "command_register", command_register }, + { "complete_command", complete_command }, { "feedkeys", feedkeys }, { "insert", insert }, { "replace", replace }, |
