75 lines
2.0 KiB
Lua
75 lines
2.0 KiB
Lua
local LRUCache = require("avante.utils.lru_cache")
|
|
local Filetype = require("plenary.filetype")
|
|
|
|
---@class avante.utils.file
|
|
local M = {}
|
|
|
|
local api = vim.api
|
|
local fn = vim.fn
|
|
|
|
local _file_content_lru_cache = LRUCache:new(60)
|
|
|
|
api.nvim_create_autocmd("BufWritePost", {
|
|
callback = function()
|
|
local filepath = api.nvim_buf_get_name(0)
|
|
local keys = _file_content_lru_cache:keys()
|
|
if vim.tbl_contains(keys, filepath) then
|
|
local content = table.concat(api.nvim_buf_get_lines(0, 0, -1, false), "\n")
|
|
_file_content_lru_cache:set(filepath, content)
|
|
end
|
|
end,
|
|
})
|
|
|
|
function M.read_content(filepath)
|
|
local cached_content = _file_content_lru_cache:get(filepath)
|
|
if cached_content then return cached_content end
|
|
|
|
local content = fn.readfile(filepath)
|
|
if content then
|
|
content = table.concat(content, "\n")
|
|
_file_content_lru_cache:set(filepath, content)
|
|
return content
|
|
end
|
|
|
|
return nil
|
|
end
|
|
|
|
function M.exists(filepath)
|
|
local stat = vim.loop.fs_stat(filepath)
|
|
return stat ~= nil
|
|
end
|
|
|
|
function M.is_in_cwd(filepath)
|
|
local cwd = vim.fn.getcwd()
|
|
-- Make both paths absolute for comparison
|
|
local abs_filepath = vim.fn.fnamemodify(filepath, ":p")
|
|
local abs_cwd = vim.fn.fnamemodify(cwd, ":p")
|
|
-- Check if filepath starts with cwd
|
|
return abs_filepath:sub(1, #abs_cwd) == abs_cwd
|
|
end
|
|
|
|
function M.get_file_icon(filepath)
|
|
local filetype = Filetype.detect(filepath, {}) or "unknown"
|
|
---@type string
|
|
local icon
|
|
---@diagnostic disable-next-line: undefined-field
|
|
if _G.MiniIcons ~= nil then
|
|
---@diagnostic disable-next-line: undefined-global
|
|
icon, _, _ = MiniIcons.get("filetype", filetype) -- luacheck: ignore
|
|
else
|
|
local ok, devicons = pcall(require, "nvim-web-devicons")
|
|
if ok then
|
|
icon = devicons.get_icon(filepath, filetype, { default = false })
|
|
if not icon then
|
|
icon = devicons.get_icon(filepath, nil, { default = true })
|
|
icon = icon or " "
|
|
end
|
|
else
|
|
icon = ""
|
|
end
|
|
end
|
|
return icon
|
|
end
|
|
|
|
return M
|