diff options
| author | zeertzjq <zeertzjq@outlook.com> | 2026-04-18 06:33:52 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-04-18 06:33:52 +0800 |
| commit | 4eaf782bb6cd25408650db497bd4765b7e9782ec (patch) | |
| tree | d0ad15a22607b234d710e60408b72d88f044e2d4 /src | |
| parent | e84076c7c6a2d96da46bfebfbf80a20aae41c125 (diff) | |
fix(terminal): forward streamed bracketed paste properly (#39152)
Diffstat (limited to 'src')
| -rw-r--r-- | src/nvim/api/vim.c | 6 | ||||
| -rw-r--r-- | src/nvim/terminal.c | 22 |
2 files changed, 26 insertions, 2 deletions
diff --git a/src/nvim/api/vim.c b/src/nvim/api/vim.c index d35b618187..3ab8e5a6bf 100644 --- a/src/nvim/api/vim.c +++ b/src/nvim/api/vim.c @@ -1373,6 +1373,9 @@ Boolean nvim_paste(uint64_t channel_id, String data, Boolean crlf, Integer phase }); if (phase == -1 || phase == 1) { // Start of paste-stream. cancelled = false; + if (curbuf->terminal) { + terminal_set_streamed_paste(curbuf->terminal, true); + } } else if (cancelled) { // Skip remaining chunks. Report error only once per "stream". goto theend; @@ -1386,6 +1389,9 @@ Boolean nvim_paste(uint64_t channel_id, String data, Boolean crlf, Integer phase if (ERROR_SET(err) || (rv.type == kObjectTypeBoolean && !rv.data.boolean)) { cancelled = true; } + if ((phase == -1 || phase == 3 || cancelled) && curbuf->terminal) { + terminal_set_streamed_paste(curbuf->terminal, false); + } if (!cancelled && (phase == -1 || phase == 1)) { paste_store(channel_id, kFalse, NULL_STRING, crlf); } diff --git a/src/nvim/terminal.c b/src/nvim/terminal.c index b52c21b5d0..96b2d8e215 100644 --- a/src/nvim/terminal.c +++ b/src/nvim/terminal.c @@ -197,6 +197,7 @@ struct terminal { MultiQueue *events; ///< Events waiting for refresh. } pending; + bool streamed_paste; ///< Streamed pasting bool theme_updates; ///< Send a theme update notification when 'bg' changes bool synchronized_output; ///< Mode 2026: suppress redraws until end of synchronized update bool sync_flush_pending; ///< Set when mode 2026 ends; triggers immediate buffer refresh @@ -1282,12 +1283,27 @@ static bool is_filter_char(int c) return !!(tpf_flags & flag); } +void terminal_set_streamed_paste(Terminal *term, bool streamed) + FUNC_ATTR_NONNULL_ALL +{ + if (term->streamed_paste != streamed) { + if (streamed) { + vterm_keyboard_start_paste(curbuf->terminal->vt); + } else { + vterm_keyboard_end_paste(curbuf->terminal->vt); + } + } + term->streamed_paste = streamed; +} + void terminal_paste(int count, String *y_array, size_t y_size) { if (y_size == 0) { return; } - vterm_keyboard_start_paste(curbuf->terminal->vt); + if (!curbuf->terminal->streamed_paste) { + vterm_keyboard_start_paste(curbuf->terminal->vt); + } size_t buff_len = y_array[0].size; char *buff = xmalloc(buff_len); for (int i = 0; i < count; i++) { @@ -1321,7 +1337,9 @@ void terminal_paste(int count, String *y_array, size_t y_size) } } xfree(buff); - vterm_keyboard_end_paste(curbuf->terminal->vt); + if (!curbuf->terminal->streamed_paste) { + vterm_keyboard_end_paste(curbuf->terminal->vt); + } } static void terminal_send_key(Terminal *term, int c) |
