aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/terminal.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/terminal.c')
-rw-r--r--src/nvim/terminal.c50
1 files changed, 42 insertions, 8 deletions
diff --git a/src/nvim/terminal.c b/src/nvim/terminal.c
index 6249c8eac5..642c443318 100644
--- a/src/nvim/terminal.c
+++ b/src/nvim/terminal.c
@@ -535,6 +535,38 @@ void terminal_send(Terminal *term, char *data, size_t size)
term->opts.write_cb(data, size, term->opts.data);
}
+static bool is_filter_char(int c)
+{
+ unsigned int flag = 0;
+ switch (c) {
+ case 0x08:
+ flag = TPF_BS;
+ break;
+ case 0x09:
+ flag = TPF_HT;
+ break;
+ case 0x0A:
+ case 0x0D:
+ break;
+ case 0x0C:
+ flag = TPF_FF;
+ break;
+ case 0x1b:
+ flag = TPF_ESC;
+ break;
+ case 0x7F:
+ flag = TPF_DEL;
+ break;
+ default:
+ if (c < ' ') {
+ flag = TPF_C0;
+ } else if (c >= 0x80 && c <= 0x9F) {
+ flag = TPF_C1;
+ }
+ }
+ return !!(tpf_flags & flag);
+}
+
void terminal_paste(long count, char_u **y_array, size_t y_size)
{
vterm_keyboard_start_paste(curbuf->terminal->vt);
@@ -553,16 +585,18 @@ void terminal_paste(long count, char_u **y_array, size_t y_size)
buff = xrealloc(buff, len);
buff_len = len;
}
- char_u *p = buff;
- char_u *q = y_array[j];
- while (*q != '\0') {
- if ((*q > '\x07' && *q < '\x0e' && *q != '\x0b' && *q != '\x0c')
- || *q > '\x1f') {
- *(p++) = *q;
+ char_u *dst = buff;
+ char_u *src = y_array[j];
+ while (*src != '\0') {
+ len = (size_t)utf_ptr2len(src);
+ int c = utf_ptr2char(src);
+ if (!is_filter_char(c)) {
+ memcpy(dst, src, len);
+ dst += len;
}
- q++;
+ src += len;
}
- terminal_send(curbuf->terminal, (char *)buff, (size_t)(p - buff));
+ terminal_send(curbuf->terminal, (char *)buff, (size_t)(dst - buff));
}
}
xfree(buff);