aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2023-10-06 05:39:36 -0700
committerGitHub <noreply@github.com>2023-10-06 05:39:36 -0700
commit01374446af9663dde5c60a7067775418c2cbf135 (patch)
treee52036a0938de7576da9bab3195c2d3bfda4d54c
parent4e4ad4312e6b3755a2114ab81c62033e6bc616fe (diff)
parent133e2990efa44cadf1410a452a08843dbd8ca86e (diff)
downloadrneovim-01374446af9663dde5c60a7067775418c2cbf135.tar.gz
rneovim-01374446af9663dde5c60a7067775418c2cbf135.tar.bz2
rneovim-01374446af9663dde5c60a7067775418c2cbf135.zip
Merge #25236 from lsvmello/fix-gf
-rw-r--r--runtime/doc/news.txt2
-rw-r--r--runtime/doc/options.txt2
-rw-r--r--runtime/doc/vim_diff.txt2
-rw-r--r--src/nvim/options.lua4
-rw-r--r--src/nvim/window.c9
-rw-r--r--test/functional/core/path_spec.lua40
-rw-r--r--test/old/testdir/setup.vim3
7 files changed, 54 insertions, 8 deletions
diff --git a/runtime/doc/news.txt b/runtime/doc/news.txt
index f0d01f92e7..b0f3b76587 100644
--- a/runtime/doc/news.txt
+++ b/runtime/doc/news.txt
@@ -203,6 +203,8 @@ The following changes to existing APIs or features add new behavior.
option, which allows for rendering e.g., diagnostic severities differently.
• Defaults:
+ • On Windows 'isfname' does not include ":". Drive letters are handled
+ correctly without it. (Use |gF| for filepaths suffixed with ":line:col").
• 'comments' includes "fb:•".
• 'shortmess' includes the "C" flag.
• Automatic linting of treesitter query files (see |ft-query-plugin|).
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index bc207d7755..283c1e3612 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -3453,7 +3453,7 @@ A jump table for the options with a short description can be found at |Q_op|.
*'isfname'* *'isf'*
'isfname' 'isf' string (default for Windows:
- "@,48-57,/,\,.,-,_,+,,,#,$,%,{,},[,],:,@-@,!,~,="
+ "@,48-57,/,\,.,-,_,+,,,#,$,%,{,},[,],@-@,!,~,="
otherwise: "@,48-57,/,.,-,_,+,,,#,$,%,~,=")
global
The characters specified by this option are included in file names and
diff --git a/runtime/doc/vim_diff.txt b/runtime/doc/vim_diff.txt
index e9c04443a6..4161d3b21e 100644
--- a/runtime/doc/vim_diff.txt
+++ b/runtime/doc/vim_diff.txt
@@ -53,6 +53,8 @@ Defaults *nvim-defaults*
- 'hlsearch' is enabled
- 'include' defaults to "". The C ftplugin sets it to "^\\s*#\\s*include"
- 'incsearch' is enabled
+- 'isfname' does not include ":" (on Windows). Drive letters are handled
+ correctly without it. (Use |gF| for filepaths suffixed with ":line:col").
- 'joinspaces' is disabled
- 'langnoremap' is enabled
- 'langremap' is disabled
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..16bb7f5df7 100644
--- a/src/nvim/window.c
+++ b/src/nvim/window.c
@@ -6943,11 +6943,13 @@ 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])
+ || (len >= 2 && path_has_drive_letter(ptr - 2))
|| ((options & FNAME_HYP) && path_is_url(ptr - 1))) {
ptr--;
} else {
@@ -6957,14 +6959,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;
}
diff --git a/test/functional/core/path_spec.lua b/test/functional/core/path_spec.lua
index 6c677d76d1..06fa13dca5 100644
--- a/test/functional/core/path_spec.lua
+++ b/test/functional/core/path_spec.lua
@@ -81,7 +81,7 @@ describe('expand wildcard', function()
end)
end)
-describe('file search', function()
+describe('file search (gf, <cfile>)', function()
before_each(clear)
it('find multibyte file name in line #20517', function()
@@ -91,4 +91,42 @@ describe('file search', function()
feed('gf')
eq('filename_with_unicode_ααα', eval('expand("%:t")'))
end)
+
+ it('matches Windows drive-letter filepaths (without ":" in &isfname)', function()
+ local iswin = is_os('win')
+ local function test_cfile(input, expected, expected_win)
+ expected = (iswin and expected_win or expected) or input
+ command('%delete')
+ insert(input)
+ command('norm! 0')
+ eq(expected, eval('expand("<cfile>")'))
+ end
+
+ test_cfile([[c:/d:/foo/bar.txt]]) -- TODO(justinmk): should return "d:/foo/bar.txt" ?
+ test_cfile([[//share/c:/foo/bar/]])
+ test_cfile([[file://c:/foo/bar]])
+ test_cfile([[file://c:/foo/bar:42]])
+ test_cfile([[file://c:/foo/bar:42:666]])
+ test_cfile([[https://c:/foo/bar]])
+ test_cfile([[\foo\bar]], [[foo]], [[\foo\bar]])
+ test_cfile([[/foo/bar]], [[/foo/bar]])
+ test_cfile([[c:\foo\bar]], [[c:]], [[c:\foo\bar]])
+ test_cfile([[c:\foo\bar:42:666]], [[c:]], [[c:\foo\bar]])
+ test_cfile([[c:/foo/bar]])
+ test_cfile([[c:/foo/bar:42]], [[c:/foo/bar]])
+ test_cfile([[c:/foo/bar:42:666]], [[c:/foo/bar]])
+ test_cfile([[c:foo\bar]], [[c]])
+ test_cfile([[c:foo/bar]], [[c]])
+ test_cfile([[c:foo]], [[c]])
+ -- Examples from: https://learn.microsoft.com/en-us/dotnet/standard/io/file-path-formats#example-ways-to-refer-to-the-same-file
+ test_cfile([[c:\temp\test-file.txt]], [[c:]], [[c:\temp\test-file.txt]])
+ test_cfile([[\\127.0.0.1\c$\temp\test-file.txt]], [[127.0.0.1]], [[\\127.0.0.1\c$\temp\test-file.txt]])
+ test_cfile([[\\LOCALHOST\c$\temp\test-file.txt]], [[LOCALHOST]], [[\\LOCALHOST\c$\temp\test-file.txt]])
+ -- not supported yet
+ test_cfile([[\\.\c:\temp\test-file.txt]], [[.]], [[\\.\c]])
+ -- not supported yet
+ test_cfile([[\\?\c:\temp\test-file.txt]], [[c:]], [[\\]])
+ test_cfile([[\\.\UNC\LOCALHOST\c$\temp\test-file.txt]], [[.]], [[\\.\UNC\LOCALHOST\c$\temp\test-file.txt]])
+ test_cfile([[\\127.0.0.1\c$\temp\test-file.txt]], [[127.0.0.1]], [[\\127.0.0.1\c$\temp\test-file.txt]])
+ end)
end)
diff --git a/test/old/testdir/setup.vim b/test/old/testdir/setup.vim
index 096ddba40b..b0c2a15a3f 100644
--- a/test/old/testdir/setup.vim
+++ b/test/old/testdir/setup.vim
@@ -26,6 +26,9 @@ if exists('s:did_load')
set sessionoptions+=options
set viewoptions+=options
set switchbuf=
+ if has('win32')
+ set isfname+=:
+ endif
if g:testname !~ 'test_mapping.vim$'
" Make "Q" switch to Ex mode.
" This does not work for all tests.