# HG changeset patch # User Bram Moolenaar # Date 1661078703 -7200 # Node ID f661bbf74a6dfd463dff23d2415c210a3497828b # Parent 069316b0c18c2b83ba2d1ccfadfc33aade2ce377 patch 9.0.0235: 'autoshelldir' does not work with chunked respose Commit: https://github.com/vim/vim/commit/474ad390ccb8bbeb53848122829e04c52f0349ce Author: Bram Moolenaar 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) diff --git a/src/terminal.c b/src/terminal.c --- 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; diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -732,6 +732,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 235, +/**/ 234, /**/ 233,