Mercurial > vim
changeset 29792:f661bbf74a6d v9.0.0235
patch 9.0.0235: 'autoshelldir' does not work with chunked respose
Commit: https://github.com/vim/vim/commit/474ad390ccb8bbeb53848122829e04c52f0349ce
Author: Bram Moolenaar <Bram@vim.org>
Date: Sun Aug 21 11:37:17 2022 +0100
patch 9.0.0235: 'autoshelldir' does not work with chunked respose
Problem: 'autoshelldir' does not work with chunked respose.
Solution: Collect chunks before parsing OSC 7. (closes https://github.com/vim/vim/issues/10949)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sun, 21 Aug 2022 12:45:03 +0200 |
parents | 069316b0c18c |
children | a31b094aef7d |
files | src/terminal.c src/version.c |
diffstat | 2 files changed, 25 insertions(+), 21 deletions(-) [+] |
line wrap: on
line diff
--- a/src/terminal.c +++ b/src/terminal.c @@ -4477,28 +4477,28 @@ url_decode(const char *src, const size_t * "file://HOSTNAME/CURRENT/DIR" */ static void -sync_shell_dir(VTermStringFragment *frag) -{ - int offset = 7; // len of "file://" is 7 - char *pos = (char *)frag->str + offset; +sync_shell_dir(garray_T *gap) +{ + int offset = 7; // len of "file://" is 7 + char *pos = (char *)gap->ga_data + offset; char_u *new_dir; // remove HOSTNAME to get PWD - while (*pos != '/' && offset < (int)frag->len) - { - offset += 1; - pos += 1; - } - - if (offset >= (int)frag->len) + while (offset < (int)gap->ga_len && *pos != '/' ) + { + ++offset; + ++pos; + } + + if (offset >= (int)gap->ga_len) { semsg(_(e_failed_to_extract_pwd_from_str_check_your_shell_config), - frag->str); + gap->ga_data); return; } - new_dir = alloc(frag->len - offset + 1); - url_decode(pos, frag->len-offset, new_dir); + new_dir = alloc(gap->ga_len - offset + 1); + url_decode(pos, gap->ga_len-offset, new_dir); changedir_func(new_dir, TRUE, CDSCOPE_WINDOW); vim_free(new_dir); } @@ -4518,13 +4518,7 @@ parse_osc(int command, VTermStringFragme garray_T *gap = &term->tl_osc_buf; // We recognize only OSC 5 1 ; {command} and OSC 7 ; {command} - if (p_asd && command == 7) - { - sync_shell_dir(&frag); - return 1; - } - - if (command != 51) + if (command != 51 && (command != 7 || !p_asd)) return 0; // Concatenate what was received until the final piece is found. @@ -4539,6 +4533,14 @@ parse_osc(int command, VTermStringFragme return 1; ((char *)gap->ga_data)[gap->ga_len] = 0; + + if (command == 7) + { + sync_shell_dir(gap); + ga_clear(gap); + return 1; + } + reader.js_buf = gap->ga_data; reader.js_fill = NULL; reader.js_used = 0;