diff options
author | zeertzjq <zeertzjq@outlook.com> | 2023-07-08 23:29:24 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-08 23:29:24 +0800 |
commit | fbeef0d4ef1aadc4e50b9f33946cf4dca8ca6b62 (patch) | |
tree | b23befeae7113e5a559227454a5155e579bd5f69 | |
parent | b9a0e762f1d79d17631b7d17cf25b6e25006d8c2 (diff) | |
download | rneovim-fbeef0d4ef1aadc4e50b9f33946cf4dca8ca6b62.tar.gz rneovim-fbeef0d4ef1aadc4e50b9f33946cf4dca8ca6b62.tar.bz2 rneovim-fbeef0d4ef1aadc4e50b9f33946cf4dca8ca6b62.zip |
fix(completion): don't add backslashes to runtime pattern (#24296)
Problem: Bashslashes added as regexp in runtime completion may be
treated as path separator with some 'isfname' value.
Solution: Make curly braces work for runtime completion and use it.
-rw-r--r-- | src/nvim/path.c | 8 | ||||
-rw-r--r-- | src/nvim/runtime.c | 6 | ||||
-rw-r--r-- | test/functional/lua/runtime_spec.lua | 5 |
3 files changed, 13 insertions, 6 deletions
diff --git a/src/nvim/path.c b/src/nvim/path.c index b9ae756027..828b690699 100644 --- a/src/nvim/path.c +++ b/src/nvim/path.c @@ -1163,7 +1163,7 @@ static bool has_env_var(char *p) // Return true if "p" contains a special wildcard character, one that Vim // cannot expand, requires using a shell. -static bool has_special_wildchar(char *p) +static bool has_special_wildchar(char *p, int flags) { for (; *p; MB_PTR_ADV(p)) { // Disallow line break characters. @@ -1174,6 +1174,10 @@ static bool has_special_wildchar(char *p) if (*p == '\\' && p[1] != NUL && p[1] != '\r' && p[1] != '\n') { p++; } else if (vim_strchr(SPECIAL_WILDCHAR, (uint8_t)(*p)) != NULL) { + // Need a shell for curly braces only when including non-existing files. + if (*p == '{' && !(flags & EW_NOTFOUND)) { + continue; + } // A { must be followed by a matching }. if (*p == '{' && vim_strchr(p, '}') == NULL) { continue; @@ -1233,7 +1237,7 @@ int gen_expand_wildcards(int num_pat, char **pat, int *num_file, char ***file, i // avoids starting the shell for each argument separately. // For `=expr` do use the internal function. for (int i = 0; i < num_pat; i++) { - if (has_special_wildchar(pat[i]) + if (has_special_wildchar(pat[i], flags) && !(vim_backtick(pat[i]) && pat[i][1] == '=')) { return os_expand_wildcards(num_pat, pat, num_file, file, flags); } diff --git a/src/nvim/runtime.c b/src/nvim/runtime.c index 0503c08af9..679f4c2662 100644 --- a/src/nvim/runtime.c +++ b/src/nvim/runtime.c @@ -338,7 +338,7 @@ int do_in_path(char *path, char *name, int flags, DoInRuntimepathCB callback, vo } int ew_flags = ((flags & DIP_DIR) ? EW_DIR : EW_FILE) - | (flags & DIP_DIRFILE) ? (EW_DIR|EW_FILE) : 0; + | ((flags & DIP_DIRFILE) ? (EW_DIR|EW_FILE) : 0); // Expand wildcards, invoke the callback for each match. if (gen_expand_wildcards(1, &buf, &num_files, &files, ew_flags) == OK) { @@ -1222,9 +1222,9 @@ static void ExpandRTDir_int(char *pat, size_t pat_len, int flags, bool keep_ext, bool expand_dirs = false; if (*dirnames[i] == NUL) { // empty dir used for :runtime - snprintf(tail, tail_buflen, "%s*.\\(vim\\|lua\\)", pat); + snprintf(tail, tail_buflen, "%s*.{vim,lua}", pat); } else { - snprintf(tail, tail_buflen, "%s/%s*.\\(vim\\|lua\\)", dirnames[i], pat); + snprintf(tail, tail_buflen, "%s/%s*.{vim,lua}", dirnames[i], pat); } expand: diff --git a/test/functional/lua/runtime_spec.lua b/test/functional/lua/runtime_spec.lua index e80a65ef3d..7d3d640265 100644 --- a/test/functional/lua/runtime_spec.lua +++ b/test/functional/lua/runtime_spec.lua @@ -18,7 +18,10 @@ describe('runtime:', function() io.open(init, 'w'):close() -- touch init file clear{args = {'-u', init}} exec('set rtp+=' .. plug_dir) - exec('set completeslash=slash') + exec([[ + set completeslash=slash + set isfname+=(,) + ]]) end) teardown(function() |