mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
Merge pull request #15910 from glacambre/silent_stdioopen
feat(--headless): do not print anything when stdioopen() has been used
This commit is contained in:
commit
1b6ae2dbb0
@ -96,6 +96,8 @@ struct Channel {
|
|||||||
|
|
||||||
EXTERN PMap(uint64_t) channels INIT(= MAP_INIT);
|
EXTERN PMap(uint64_t) channels INIT(= MAP_INIT);
|
||||||
|
|
||||||
|
EXTERN Callback on_print INIT(= CALLBACK_INIT);
|
||||||
|
|
||||||
#ifdef INCLUDE_GENERATED_DECLARATIONS
|
#ifdef INCLUDE_GENERATED_DECLARATIONS
|
||||||
# include "channel.h.generated.h"
|
# include "channel.h.generated.h"
|
||||||
#endif
|
#endif
|
||||||
|
@ -10215,6 +10215,10 @@ static void f_stdioopen(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
|||||||
if (!tv_dict_get_callback(opts, S_LEN("on_stdin"), &on_stdin.cb)) {
|
if (!tv_dict_get_callback(opts, S_LEN("on_stdin"), &on_stdin.cb)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (!tv_dict_get_callback(opts, S_LEN("on_print"), &on_print)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
on_stdin.buffered = tv_dict_get_number(opts, "stdin_buffered");
|
on_stdin.buffered = tv_dict_get_number(opts, "stdin_buffered");
|
||||||
if (on_stdin.buffered && on_stdin.cb.type == kCallbackNone) {
|
if (on_stdin.buffered && on_stdin.cb.type == kCallbackNone) {
|
||||||
on_stdin.self = opts;
|
on_stdin.self = opts;
|
||||||
|
@ -81,7 +81,8 @@ typedef struct {
|
|||||||
} data;
|
} data;
|
||||||
CallbackType type;
|
CallbackType type;
|
||||||
} Callback;
|
} Callback;
|
||||||
#define CALLBACK_NONE ((Callback){ .type = kCallbackNone })
|
#define CALLBACK_INIT { .type = kCallbackNone }
|
||||||
|
#define CALLBACK_NONE ((Callback)CALLBACK_INIT)
|
||||||
|
|
||||||
/// Structure holding dictionary watcher
|
/// Structure holding dictionary watcher
|
||||||
typedef struct dict_watcher {
|
typedef struct dict_watcher {
|
||||||
|
@ -2647,6 +2647,17 @@ static void msg_puts_printf(const char *str, const ptrdiff_t maxlen)
|
|||||||
char buf[7];
|
char buf[7];
|
||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
|
if (on_print.type != kCallbackNone) {
|
||||||
|
typval_T argv[1];
|
||||||
|
argv[0].v_type = VAR_STRING;
|
||||||
|
argv[0].v_lock = VAR_UNLOCKED;
|
||||||
|
argv[0].vval.v_string = (char_u *)str;
|
||||||
|
typval_T rettv = TV_INITIAL_VALUE;
|
||||||
|
callback_call(&on_print, 1, argv, &rettv);
|
||||||
|
tv_clear(&rettv);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
while ((maxlen < 0 || s - str < maxlen) && *s != NUL) {
|
while ((maxlen < 0 || s - str < maxlen) && *s != NUL) {
|
||||||
int len = utf_ptr2len((const char_u *)s);
|
int len = utf_ptr2len((const char_u *)s);
|
||||||
if (!(silent_mode && p_verbose == 0)) {
|
if (!(silent_mode && p_verbose == 0)) {
|
||||||
|
@ -100,6 +100,38 @@ describe('channels', function()
|
|||||||
eq({"notification", "exit", {3,0}}, next_msg())
|
eq({"notification", "exit", {3,0}}, next_msg())
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it('can use stdio channel and on_print callback', function()
|
||||||
|
source([[
|
||||||
|
let g:job_opts = {
|
||||||
|
\ 'on_stdout': function('OnEvent'),
|
||||||
|
\ 'on_stderr': function('OnEvent'),
|
||||||
|
\ 'on_exit': function('OnEvent'),
|
||||||
|
\ }
|
||||||
|
]])
|
||||||
|
meths.set_var("nvim_prog", nvim_prog)
|
||||||
|
meths.set_var("code", [[
|
||||||
|
function! OnStdin(id, data, event) dict
|
||||||
|
echo string([a:id, a:data, a:event])
|
||||||
|
if a:data == ['']
|
||||||
|
quit
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
function! OnPrint(text) dict
|
||||||
|
call chansend(g:x, ['OnPrint:' .. a:text])
|
||||||
|
endfunction
|
||||||
|
let g:x = stdioopen({'on_stdin': funcref('OnStdin'), 'on_print':'OnPrint'})
|
||||||
|
call chansend(x, "hello")
|
||||||
|
]])
|
||||||
|
command("let g:id = jobstart([ g:nvim_prog, '-u', 'NONE', '-i', 'NONE', '--cmd', 'set noswapfile', '--headless', '--cmd', g:code], g:job_opts)")
|
||||||
|
local id = eval("g:id")
|
||||||
|
ok(id > 0)
|
||||||
|
|
||||||
|
eq({ "notification", "stdout", {id, { "hello" } } }, next_msg())
|
||||||
|
|
||||||
|
command("call chansend(id, 'howdy')")
|
||||||
|
eq({"notification", "stdout", {id, {"OnPrint:[1, ['howdy'], 'stdin']"}}}, next_msg())
|
||||||
|
end)
|
||||||
|
|
||||||
local function expect_twoline(id, stream, line1, line2, nobr)
|
local function expect_twoline(id, stream, line1, line2, nobr)
|
||||||
local msg = next_msg()
|
local msg = next_msg()
|
||||||
local joined = nobr and {line1..line2} or {line1, line2}
|
local joined = nobr and {line1..line2} or {line1, line2}
|
||||||
|
Loading…
Reference in New Issue
Block a user