diff options
author | Justin M. Keyes <justinkz@gmail.com> | 2025-01-15 02:23:44 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-01-15 02:23:44 -0800 |
commit | 9552fe7ef907c5c8164abb50699e97d03de1285a (patch) | |
tree | f7312418647f2abad4e456f64887b7611f3d57bf /src | |
parent | 3ee63edc1b0ca6fe664c9d5368aba05ae9a22e9d (diff) | |
parent | d55b17e2b4e061fd8b330f928785a217c99c9d11 (diff) | |
download | rneovim-9552fe7ef907c5c8164abb50699e97d03de1285a.tar.gz rneovim-9552fe7ef907c5c8164abb50699e97d03de1285a.tar.bz2 rneovim-9552fe7ef907c5c8164abb50699e97d03de1285a.zip |
Merge #32013 from luukvbaal/shellkind
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/api/vim.c | 3 | ||||
-rw-r--r-- | src/nvim/event/proc.h | 4 | ||||
-rw-r--r-- | src/nvim/message.c | 12 | ||||
-rw-r--r-- | src/nvim/os/shell.c | 12 |
4 files changed, 21 insertions, 10 deletions
diff --git a/src/nvim/api/vim.c b/src/nvim/api/vim.c index faf6c0567c..950c70026b 100644 --- a/src/nvim/api/vim.c +++ b/src/nvim/api/vim.c @@ -772,7 +772,8 @@ void nvim_echo(Array chunks, Boolean history, Dict(echo_opts) *opts, Error *err) verbose_enter(); } - msg_multihl(hl_msg, opts->err ? "echoerr" : history ? "echomsg" : "echo", history, opts->err); + char *kind = opts->verbose ? NULL : opts->err ? "echoerr" : history ? "echomsg" : "echo"; + msg_multihl(hl_msg, kind, history, opts->err); if (opts->verbose) { verbose_leave(); diff --git a/src/nvim/event/proc.h b/src/nvim/event/proc.h index f525d46f87..fb14041049 100644 --- a/src/nvim/event/proc.h +++ b/src/nvim/event/proc.h @@ -21,8 +21,8 @@ static inline Proc proc_init(Loop *loop, ProcType type, void *data) .argv = NULL, .exepath = NULL, .in = { .closed = false }, - .out = { .s.closed = false }, - .err = { .s.closed = false }, + .out = { .s.closed = false, .s.fd = STDOUT_FILENO }, + .err = { .s.closed = false, .s.fd = STDERR_FILENO }, .cb = NULL, .closed = false, .internal_close_cb = NULL, diff --git a/src/nvim/message.c b/src/nvim/message.c index f87eba27d0..5423446ef9 100644 --- a/src/nvim/message.c +++ b/src/nvim/message.c @@ -296,6 +296,12 @@ void msg_multiline(String str, int hl_id, bool check_int, bool hist, bool *need_ // Avoid starting a new message for each chunk and adding message to history in msg_keep(). static bool is_multihl = false; +/// Print message chunks, each with their own highlight ID. +/// +/// @param hl_msg Message chunks +/// @param kind Message kind (can be NULL to avoid setting kind) +/// @param history Whether to add message to history +/// @param err Whether to print message as an error void msg_multihl(HlMessage hl_msg, const char *kind, bool history, bool err) { no_wait_return++; @@ -303,7 +309,9 @@ void msg_multihl(HlMessage hl_msg, const char *kind, bool history, bool err) msg_clr_eos(); bool need_clear = false; msg_ext_history = history; - msg_ext_set_kind(kind); + if (kind != NULL) { + msg_ext_set_kind(kind); + } is_multihl = true; for (uint32_t i = 0; i < kv_size(hl_msg); i++) { HlMessageChunk chunk = kv_A(hl_msg, i); @@ -312,7 +320,7 @@ void msg_multihl(HlMessage hl_msg, const char *kind, bool history, bool err) } else { msg_multiline(chunk.text, chunk.hl_id, true, false, &need_clear); } - assert(!ui_has(kUIMessages) || msg_ext_kind == kind); + assert(!ui_has(kUIMessages) || kind == NULL || msg_ext_kind == kind); } if (history && kv_size(hl_msg)) { add_msg_hist_multihl(NULL, 0, 0, true, hl_msg); diff --git a/src/nvim/os/shell.c b/src/nvim/os/shell.c index 81b75dc4d3..5347c8db9a 100644 --- a/src/nvim/os/shell.c +++ b/src/nvim/os/shell.c @@ -700,6 +700,7 @@ int os_call_shell(char *cmd, int opts, char *extra_args) } if (!emsg_silent && exitcode != 0 && !(opts & kShellOptSilent)) { + msg_ext_set_kind("shell_ret"); msg_puts(_("\nshell returned ")); msg_outnum(exitcode); msg_putchar('\n'); @@ -1067,7 +1068,7 @@ static void out_data_ring(const char *output, size_t size) } if (output == NULL && size == SIZE_MAX) { // Print mode - out_data_append_to_screen(last_skipped, &last_skipped_len, true); + out_data_append_to_screen(last_skipped, &last_skipped_len, STDOUT_FILENO, true); return; } @@ -1095,14 +1096,15 @@ static void out_data_ring(const char *output, size_t size) /// @param output Data to append to screen lines. /// @param count Size of data. /// @param eof If true, there will be no more data output. -static void out_data_append_to_screen(const char *output, size_t *count, bool eof) +static void out_data_append_to_screen(const char *output, size_t *count, int fd, bool eof) FUNC_ATTR_NONNULL_ALL { const char *p = output; const char *end = output + *count; + msg_ext_set_kind(fd == STDERR_FILENO ? "shell_err" : "shell_out"); while (p < end) { if (*p == '\n' || *p == '\r' || *p == TAB || *p == BELL) { - msg_putchar_hl((uint8_t)(*p), 0); + msg_putchar_hl((uint8_t)(*p), fd == STDERR_FILENO ? HLF_E : 0); p++; } else { // Note: this is not 100% precise: @@ -1118,7 +1120,7 @@ static void out_data_append_to_screen(const char *output, size_t *count, bool eo goto end; } - msg_outtrans_len(p, i, 0, false); + msg_outtrans_len(p, i, fd == STDERR_FILENO ? HLF_E : 0, false); p += i; } } @@ -1133,7 +1135,7 @@ static size_t out_data_cb(RStream *stream, const char *ptr, size_t count, void * // Save the skipped output. If it is the final chunk, we display it later. out_data_ring(ptr, count); } else if (count > 0) { - out_data_append_to_screen(ptr, &count, eof); + out_data_append_to_screen(ptr, &count, stream->s.fd, eof); } return count; |