aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua/vim/fs.lua
diff options
context:
space:
mode:
authordundargoc <gocdundar@gmail.com>2024-12-30 16:01:00 +0100
committerdundargoc <33953936+dundargoc@users.noreply.github.com>2025-01-13 13:14:52 +0100
commit0631492f9c8044a378dc2a17ea257badfbda6d15 (patch)
tree9fca9c84d79c76df83e0689122874e4f1ff262f9 /runtime/lua/vim/fs.lua
parenta3ef29d570dd892a1bcbfa80bb242d4aac89a06e (diff)
downloadrneovim-0631492f9c8044a378dc2a17ea257badfbda6d15.tar.gz
rneovim-0631492f9c8044a378dc2a17ea257badfbda6d15.tar.bz2
rneovim-0631492f9c8044a378dc2a17ea257badfbda6d15.zip
feat: add vim.fs.relpath
This is needed to replace the nvim-lspconfig function is_descendant that some lspconfg configurations still use.
Diffstat (limited to 'runtime/lua/vim/fs.lua')
-rw-r--r--runtime/lua/vim/fs.lua33
1 files changed, 33 insertions, 0 deletions
diff --git a/runtime/lua/vim/fs.lua b/runtime/lua/vim/fs.lua
index 04a6e43db1..91e06688b3 100644
--- a/runtime/lua/vim/fs.lua
+++ b/runtime/lua/vim/fs.lua
@@ -741,4 +741,37 @@ function M.abspath(path)
return M.joinpath(cwd, path)
end
+--- Gets `target` path relative to `base`, or `nil` if `base` is not an ancestor.
+---
+--- Example:
+---
+--- ```lua
+--- vim.fs.relpath('/var', '/var/lib') -- 'lib'
+--- vim.fs.relpath('/var', '/usr/bin') -- nil
+--- ```
+---
+--- @param base string
+--- @param target string
+--- @param opts table? Reserved for future use
+--- @return string|nil
+function M.relpath(base, target, opts)
+ vim.validate('base', base, 'string')
+ vim.validate('target', target, 'string')
+ vim.validate('opts', opts, 'table', true)
+
+ base = vim.fs.normalize(vim.fs.abspath(base))
+ target = vim.fs.normalize(vim.fs.abspath(target))
+ if base == target then
+ return '.'
+ end
+
+ local prefix = ''
+ if iswin then
+ prefix, base = split_windows_path(base)
+ end
+ base = prefix .. base .. (base ~= '/' and '/' or '')
+
+ return vim.startswith(target, base) and target:sub(#base + 1) or nil
+end
+
return M