aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLeonardo Mello <lsvmello@gmail.com>2023-09-18 16:50:47 -0300
committerJustin M. Keyes <justinkz@gmail.com>2023-10-06 12:59:58 +0200
commit1dd700a8d9275439fbc71ac5adeb59914bdbd5cf (patch)
tree943ad468a200645b9d7520363dbf76fccb5767f7 /src
parent4e4ad4312e6b3755a2114ab81c62033e6bc616fe (diff)
downloadrneovim-1dd700a8d9275439fbc71ac5adeb59914bdbd5cf.tar.gz
rneovim-1dd700a8d9275439fbc71ac5adeb59914bdbd5cf.tar.bz2
rneovim-1dd700a8d9275439fbc71ac5adeb59914bdbd5cf.zip
fix: gf fails on "foo/bar.txt:1:2" on Windows
Problem: On Windows, "gf" fails on a filepath that has a line:column suffix. Example: E447: Can't find file "src/app/core/services/identity/identity.service.ts:64:23" Solution: - Remove ":" from 'isfname' on Windows. Colon is not a valid filename character (except for the drive-letter). - Handle drive letters specially in file_name_in_line(). Fixes #25160
Diffstat (limited to 'src')
-rw-r--r--src/nvim/options.lua4
-rw-r--r--src/nvim/window.c10
2 files changed, 7 insertions, 7 deletions
diff --git a/src/nvim/options.lua b/src/nvim/options.lua
index a0b9306908..e70fe8614f 100644
--- a/src/nvim/options.lua
+++ b/src/nvim/options.lua
@@ -4298,9 +4298,9 @@ return {
defaults = {
condition = 'BACKSLASH_IN_FILENAME',
if_false = '@,48-57,/,.,-,_,+,,,#,$,%,~,=',
- if_true = '@,48-57,/,\\,.,-,_,+,,,#,$,%,{,},[,],:,@-@,!,~,=',
+ if_true = '@,48-57,/,\\,.,-,_,+,,,#,$,%,{,},[,],@-@,!,~,=',
doc = [[for Windows:
- "@,48-57,/,\,.,-,_,+,,,#,$,%,{,},[,],:,@-@,!,~,="
+ "@,48-57,/,\,.,-,_,+,,,#,$,%,{,},[,],@-@,!,~,="
otherwise: "@,48-57,/,.,-,_,+,,,#,$,%,~,="]],
},
deny_duplicates = true,
diff --git a/src/nvim/window.c b/src/nvim/window.c
index 41199306fa..ef6d3fd4a9 100644
--- a/src/nvim/window.c
+++ b/src/nvim/window.c
@@ -6943,11 +6943,12 @@ char *file_name_in_line(char *line, int col, int options, int count, char *rel_f
bool is_url = false;
// Search backward for first char of the file name.
- // Go one char back to ":" before "//" even when ':' is not in 'isfname'.
+ // Go one char back to ":" before "//", or to the drive letter before ":\" (even if ":"
+ // is not in 'isfname').
while (ptr > line) {
if ((len = (size_t)(utf_head_off(line, ptr - 1))) > 0) {
ptr -= len + 1;
- } else if (vim_isfilec((uint8_t)ptr[-1])
+ } else if (vim_isfilec((uint8_t)ptr[-1]) || path_has_drive_letter(ptr - 2)
|| ((options & FNAME_HYP) && path_is_url(ptr - 1))) {
ptr--;
} else {
@@ -6957,14 +6958,13 @@ char *file_name_in_line(char *line, int col, int options, int count, char *rel_f
// Search forward for the last char of the file name.
// Also allow ":/" when ':' is not in 'isfname'.
- len = 0;
+ len = path_has_drive_letter(ptr) ? 2 : 0;
while (vim_isfilec((uint8_t)ptr[len]) || (ptr[len] == '\\' && ptr[len + 1] == ' ')
|| ((options & FNAME_HYP) && path_is_url(ptr + len))
|| (is_url && vim_strchr(":?&=", (uint8_t)ptr[len]) != NULL)) {
// After type:// we also include :, ?, & and = as valid characters, so that
// http://google.com:8080?q=this&that=ok works.
- if ((ptr[len] >= 'A' && ptr[len] <= 'Z')
- || (ptr[len] >= 'a' && ptr[len] <= 'z')) {
+ if ((ptr[len] >= 'A' && ptr[len] <= 'Z') || (ptr[len] >= 'a' && ptr[len] <= 'z')) {
if (in_type && path_is_url(ptr + len + 1)) {
is_url = true;
}