mirror of
https://github.com/neovim/neovim.git
synced 2025-12-16 03:15:39 +00:00
refactor(fs): replace vim.fn/vim.env in vim.fs (#20379)
Avoid using vim.env and vim.fn in vim.fs functions so that they can be used in "fast" contexts.
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
local M = {}
|
||||
|
||||
local iswin = vim.loop.os_uname().sysname == 'Windows_NT'
|
||||
|
||||
--- Iterate over all the parents of the given file or directory.
|
||||
---
|
||||
--- Example:
|
||||
@@ -40,7 +42,19 @@ function M.dirname(file)
|
||||
if file == nil then
|
||||
return nil
|
||||
end
|
||||
return vim.fn.fnamemodify(file, ':h')
|
||||
vim.validate({ file = { file, 's' } })
|
||||
if iswin and file:match('^%w:[\\/]?$') then
|
||||
return (file:gsub('\\', '/'))
|
||||
elseif not file:match('[\\/]') then
|
||||
return '.'
|
||||
elseif file == '/' or file:match('^/[^/]+$') then
|
||||
return '/'
|
||||
end
|
||||
local dir = file:match('[/\\]$') and file:sub(1, #file - 1) or file:match('^([/\\]?.+)[/\\]')
|
||||
if iswin and dir:match('^%w:$') then
|
||||
return dir .. '/'
|
||||
end
|
||||
return (dir:gsub('\\', '/'))
|
||||
end
|
||||
|
||||
--- Return the basename of the given file or directory
|
||||
@@ -48,7 +62,14 @@ end
|
||||
---@param file (string) File or directory
|
||||
---@return (string) Basename of {file}
|
||||
function M.basename(file)
|
||||
return vim.fn.fnamemodify(file, ':t')
|
||||
if file == nil then
|
||||
return nil
|
||||
end
|
||||
vim.validate({ file = { file, 's' } })
|
||||
if iswin and file:match('^%w:[\\/]?$') then
|
||||
return ''
|
||||
end
|
||||
return file:match('[/\\]$') and '' or (file:match('[^\\/]*$'):gsub('\\', '/'))
|
||||
end
|
||||
|
||||
--- Return an iterator over the files and directories located in {path}
|
||||
@@ -229,7 +250,12 @@ end
|
||||
---@return (string) Normalized path
|
||||
function M.normalize(path)
|
||||
vim.validate({ path = { path, 's' } })
|
||||
return (path:gsub('^~/', vim.env.HOME .. '/'):gsub('%$([%w_]+)', vim.env):gsub('\\', '/'))
|
||||
return (
|
||||
path
|
||||
:gsub('^~/', vim.loop.os_homedir() .. '/')
|
||||
:gsub('%$([%w_]+)', vim.loop.os_getenv)
|
||||
:gsub('\\', '/')
|
||||
)
|
||||
end
|
||||
|
||||
return M
|
||||
|
||||
Reference in New Issue
Block a user