@@ -15,9 +15,54 @@ local utils = require("neo-tree.utils")
15
15
local file_nesting = require (" neo-tree.sources.common.file-nesting" )
16
16
local container = require (" neo-tree.sources.common.container" )
17
17
local log = require (" neo-tree.log" )
18
+ local path = require (" plenary.path" )
18
19
19
20
local M = {}
20
21
22
+ -- Workaround for https://github.com/nvim-lua/plenary.nvim/issues/411
23
+ local relative_path = function (original_path , reference_path )
24
+ -- Use plenary's make_relative to clean paths
25
+ original_path = path :new (original_path ):make_relative (" ." )
26
+ reference_path = path :new (reference_path ):make_relative (" ." )
27
+ local o_path = path :new (original_path )
28
+ local ref_path = path :new (reference_path )
29
+ local parents = o_path :parents ()
30
+ local ref_parents = ref_path :parents ()
31
+
32
+ local path_elements = vim .split (o_path .filename , " /" )
33
+ table.insert (parents , 1 , original_path )
34
+ table.insert (ref_parents , 1 , reference_path )
35
+
36
+ local result = " "
37
+ for i , ref_parent in ipairs (ref_parents ) do
38
+ for j , par in ipairs (parents ) do
39
+ if ref_parent == par then
40
+ if i == 1 and j == 1 then
41
+ return " "
42
+ end
43
+
44
+ result = result .. table.concat (path_elements , " /" , # path_elements - j + 2 )
45
+ return result
46
+ end
47
+ end
48
+
49
+ result = " ../" .. result
50
+ end
51
+ end
52
+
53
+ local get_relative_target = function (node , state )
54
+ local cwd = path :new (state .path ):absolute ()
55
+ local target = path :new (node .link_to ):absolute ()
56
+ local node_dir = path :new (node .path ):parent ():absolute ()
57
+
58
+ -- If target is inside cwd, make it relative
59
+ if target :find (cwd , 1 , true ) == 1 then
60
+ return relative_path (target , node_dir )
61
+ end
62
+
63
+ return node .link_to
64
+ end
65
+
21
66
local make_two_char = function (symbol )
22
67
if vim .fn .strchars (symbol ) == 1 then
23
68
return symbol .. " "
528
573
529
574
M .symlink_target = function (config , node , state )
530
575
if node .is_link then
576
+ local target = get_relative_target (node , state )
531
577
return {
532
- text = string.format (" ➛ %s" , node . link_to ),
578
+ text = string.format (" ➛ %s" , target ),
533
579
highlight = config .highlight or highlights .SYMBOLIC_LINK_TARGET ,
534
580
}
535
581
else
0 commit comments