]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
runtime(netrw): MS-Windows: fix netrw not being able to navigate to parent folder
authorMiguel Barro <miguel.barro@live.com>
Wed, 1 Oct 2025 19:45:38 +0000 (19:45 +0000)
committerChristian Brabandt <cb@256bit.org>
Wed, 1 Oct 2025 19:45:38 +0000 (19:45 +0000)
fixes: #18421
closes: #18464

Signed-off-by: Miguel Barro <miguel.barro@live.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
runtime/pack/dist/opt/netrw/autoload/netrw.vim
runtime/pack/dist/opt/netrw/autoload/netrw/fs.vim

index ba5116baa3844a581614b360e5a109bc806f2222..6206be79ae0c448e4ca040690f24469c8f45dbe4 100644 (file)
@@ -9,6 +9,7 @@
 " 2025 Sep 11 by Vim Project only keep cursor position in tree mode #18275
 " 2025 Sep 17 by Vim Project tighten the regex to handle remote compressed archives #18318
 " 2025 Sep 18 by Vim Project 'equalalways' not always respected #18358
+" 2025 Oct 01 by Vim Project fix navigate to parent folder #18464
 " Copyright:  Copyright (C) 2016 Charles E. Campbell {{{1
 "             Permission is hereby granted to use and distribute this code,
 "             with or without modifications, provided that this copyright
@@ -3950,7 +3951,8 @@ function s:NetrwBrowseChgDir(islocal, newdir, cursor, ...)
         " NetrwBrowseChgDir: go up one directory {{{3
         " --------------------------------------
 
-        let dirname = netrw#fs#Dirname(dirname)
+        " The following regexps expect '/' as path separator
+        let dirname = substitute(netrw#fs#AbsPath(dirname), '\\', '/', 'ge') . '/'
 
         if w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
             " force a refresh
index 2f0841500be045119d3e6ef88e152e7d2bd63b91..f2f98596a52a218e2dae4853a64cf450c4f500f3 100644 (file)
@@ -2,18 +2,18 @@
 " THESE FUNCTIONS DON'T COMMIT TO ANY BACKWARDS COMPATIBILITY. SO CHANGES AND
 " BREAKAGES IF USED OUTSIDE OF NETRW.VIM ARE EXPECTED.
 
-let s:slash = !exists('+shellslash') || &shellslash ? '/' : '\'
 
 " netrw#fs#PathJoin: Appends a new part to a path taking different systems into consideration {{{
 
 function! netrw#fs#PathJoin(...)
+    const slash = !exists('+shellslash') || &shellslash ? '/' : '\'
     let path = ""
 
     for arg in a:000
         if empty(path)
             let path = arg
         else
-            let path .= s:slash . arg
+            let path .= slash . arg
         endif
     endfor
 
@@ -73,22 +73,14 @@ endfunction
 " netrw#fs#AbsPath: returns the full path to a directory and/or file {{{
 
 function! netrw#fs#AbsPath(path)
-    let path = a:path->substitute(s:slash . '$', '', 'e')
+    let path = a:path->substitute('[\/]$', '', 'e')
 
     " Nothing to do
     if isabsolutepath(path)
         return path
     endif
 
-    return path->fnamemodify(':p')->substitute(s:slash . '$', '', 'e')
-endfunction
-
-" }}}
-" netrw#fs#Dirname: {{{
-
-function netrw#fs#Dirname(path)
-    " Keep a slash as directory recognition pattern
-    return netrw#fs#AbsPath(a:path) . s:slash
+    return path->fnamemodify(':p')->substitute('[\/]$', '', 'e')
 endfunction
 
 " }}}