mirror of
https://github.com/neovim/neovim.git
synced 2026-07-19 23:51:38 +00:00
feat: serverlist({peer=true}) returns peer addresses #34806
Problem:
serverlist() only lists servers that were started by the current Nvim.
Solution:
Look for other Nvim servers in stdpath("run").
This commit is contained in:
@@ -9655,17 +9655,25 @@ M.funcs = {
|
||||
signature = 'searchpos({pattern} [, {flags} [, {stopline} [, {timeout} [, {skip}]]]])',
|
||||
},
|
||||
serverlist = {
|
||||
args = { 0, 1 },
|
||||
desc = [=[
|
||||
Returns a list of server addresses, or empty if all servers
|
||||
were stopped. |serverstart()| |serverstop()|
|
||||
|
||||
The optional argument {opts} is a Dict and supports the following items:
|
||||
|
||||
peer : If |TRUE|, servers not started by |serverstart()|
|
||||
will also be returned. (default: |FALSE|)
|
||||
Not supported on Windows yet.
|
||||
|
||||
Example: >vim
|
||||
echo serverlist()
|
||||
<
|
||||
]=],
|
||||
name = 'serverlist',
|
||||
params = {},
|
||||
params = { { 'opts', 'table' } },
|
||||
returns = 'string[]',
|
||||
signature = 'serverlist()',
|
||||
signature = 'serverlist([{opts}])',
|
||||
},
|
||||
serverstart = {
|
||||
args = { 0, 1 },
|
||||
|
||||
@@ -6724,12 +6724,42 @@ static void f_serverlist(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
|
||||
size_t n;
|
||||
char **addrs = server_address_list(&n);
|
||||
|
||||
Arena arena = ARENA_EMPTY;
|
||||
// Passed to vim._core.server.serverlist() to avoid duplicates
|
||||
Array addrs_arr = arena_array(&arena, n);
|
||||
|
||||
// Copy addrs into a linked list.
|
||||
list_T *const l = tv_list_alloc_ret(rettv, (ptrdiff_t)n);
|
||||
for (size_t i = 0; i < n; i++) {
|
||||
tv_list_append_allocated_string(l, addrs[i]);
|
||||
ADD_C(addrs_arr, CSTR_AS_OBJ(addrs[i]));
|
||||
}
|
||||
|
||||
if (!(argvars[0].v_type == VAR_DICT && tv_dict_get_bool(argvars[0].vval.v_dict, "peer", false))) {
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
MAXSIZE_TEMP_ARRAY(args, 1);
|
||||
ADD_C(args, ARRAY_OBJ(addrs_arr));
|
||||
|
||||
Error err = ERROR_INIT;
|
||||
Object rv = NLUA_EXEC_STATIC("return require('vim._core.server').serverlist(...)",
|
||||
args, kRetObject,
|
||||
&arena, &err);
|
||||
|
||||
if (ERROR_SET(&err)) {
|
||||
ELOG("vim._core.serverlist failed: %s", err.msg);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < rv.data.array.size; i++) {
|
||||
char *curr_server = rv.data.array.items[i].data.string.data;
|
||||
tv_list_append_string(l, curr_server, -1);
|
||||
}
|
||||
|
||||
cleanup:
|
||||
xfree(addrs);
|
||||
arena_mem_free(arena_finish(&arena));
|
||||
}
|
||||
|
||||
/// "serverstart()" function
|
||||
|
||||
Reference in New Issue
Block a user