1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-01-24 02:20:03 +08:00
SpaceVim/lua/spacevim/api/file.lua
2024-03-21 18:25:14 +08:00

277 lines
6.6 KiB
Lua

local M = {}
local system = require('spacevim.api').import('system')
local fn = nil
if vim.fn == nil then
fn = require('spacevim').fn
else
fn = vim.fn
end
if system.isWindows then
M.separator = '\\'
M.pathSeparator = ';'
else
M.separator = '/'
M.pathSeparator = ':'
end
local file_node_extensions = {
['styl'] = '',
['scss'] = '',
['htm'] = '',
['html'] = '',
['erb'] = '',
['slim'] = '',
['ejs'] = '',
['wxml'] = '',
['css'] = '',
['less'] = '',
['wxss'] = '',
['md'] = '',
['markdown'] = '',
['json'] = '',
['js'] = '',
['jsx'] = '',
['rb'] = '',
['php'] = '',
['py'] = '',
['pyc'] = '',
['pyo'] = '',
['pyd'] = '',
['coffee'] = '',
['mustache'] = '',
['hbs'] = '',
['conf'] = '',
['ini'] = '',
['yml'] = '',
['bat'] = '',
['jpg'] = '',
['jpeg'] = '',
['bmp'] = '',
['png'] = '',
['gif'] = '',
['ico'] = '',
['twig'] = '',
['cpp'] = '',
['c++'] = '',
['cxx'] = '',
['cc'] = '',
['cp'] = '',
['c'] = '',
['hs'] = '',
['lhs'] = '',
['lua'] = '',
['java'] = '',
['sh'] = '',
['fish'] = '',
['ml'] = 'λ',
['mli'] = 'λ',
['diff'] = '',
['db'] = '',
['sql'] = '',
['dump'] = '',
['clj'] = '',
['cljc'] = '',
['cljs'] = '',
['edn'] = '',
['scala'] = '',
['go'] = '',
['dart'] = '',
['xul'] = '',
['sln'] = '',
['suo'] = '',
['pl'] = '',
['pm'] = '',
['t'] = '',
['rss'] = '',
['f#'] = '',
['fsscript'] = '',
['fsx'] = '',
['fs'] = '',
['fsi'] = '',
['rs'] = '',
['rlib'] = '',
['d'] = '',
['erl'] = '',
['hrl'] = '',
['vim'] = '',
['ai'] = '',
['psd'] = '',
['psb'] = '',
['ts'] = '',
['tsx'] = '',
['jl'] = '',
['ex'] = '',
['exs'] = '',
['eex'] = '',
['leex'] = ''
}
local file_node_exact_matches = {
['exact-match-case-sensitive-1.txt'] = 'X1',
['exact-match-case-sensitive-2'] = 'X2',
['gruntfile.coffee'] = '',
['gruntfile.js'] = '',
['gruntfile.ls'] = '',
['gulpfile.coffee'] = '',
['gulpfile.js'] = '',
['gulpfile.ls'] = '',
['dropbox'] = '',
['.ds_store'] = '',
['.gitconfig'] = '',
['.gitignore'] = '',
['.bashrc'] = '',
['.bashprofile'] = '',
['favicon.ico'] = '',
['license'] = '',
['node_modules'] = '',
['react.jsx'] = '',
['Procfile'] = '',
['.vimrc'] = '',
['mix.lock'] = '',
}
local file_node_pattern_matches = {
['.*jquery.*\\.js$'] = '',
['.*angular.*\\.js$'] = '',
['.*backbone.*\\.js$'] = '',
['.*require.*\\.js$'] = '',
['.*materialize.*\\.js$'] = '',
['.*materialize.*\\.css$'] = '',
['.*mootools.*\\.js$'] = ''
}
function M.fticon(path)
local file = fn.fnamemodify(path, ':t')
if file_node_exact_matches[file] ~= nil then
return file_node_exact_matches[file]
end
for k,v in ipairs(file_node_pattern_matches) do
if fn.match(file, k) ~= -1 then
return v
end
end
local ext = fn.fnamemodify(file, ':e')
if file_node_extensions[ext] ~= nil then
return file_node_extensions[ext]
else
return ''
end
end
function M.read(path)
if fn.filereadable(path) then
return fn.readfile(path, '')
else
return ''
end
end
function M.write(msg, fname)
local flags
if fn.filereadable(fname) == 1 then
flags = 'a'
else
flags = ''
end
fn.writefile({msg}, fname, flags)
end
function M.override(msg, fname)
local flags
if fn.filereadable(fname) == 1 then
flags = 'b'
else
flags = ''
end
fn.writefile({msg}, fname, flags)
end
function M.read(fname)
if fn.filereadable(fname) == 1 then
return fn.readfile(fname, '')
else
return ''
end
end
function M.unify_path(_path, ...)
local mod = select('1', ...)
if mod == nil then
mod = ':p'
end
local path = fn.fnamemodify(_path, mod .. ':gs?[\\\\/]?/?')
if fn.isdirectory(path) == 1 and string.sub(path, -1) ~= '/' then
return path .. '/'
elseif string.sub(_path, -1) == '/' and string.sub(path, -1) ~= '/' then
return path .. '/'
else
return path
end
end
function M.path_to_fname(path)
return fn.substitute(M.unify_path(path), '[\\/:;.]', '_', 'g')
end
function M.findfile(what, where, ...)
-- let old_suffixesadd = &suffixesadd
-- let &suffixesadd = ''
local count = select('1', ...)
if count == nil then
count = 0
end
local file = ''
if fn.filereadable(where) == 1 and fn.isdirectory(where) == 0 then
path = fn.fnamemodify(where, ':h')
else
path = where
end
if count > 0 then
file = fn.findfile(what, fn.escape(path, ' ') .. ';', count)
elseif #{...} == 0 then
file = fn.findfile(what, fn.escape(path, ' ') .. ';')
elseif count == 0 then
file = fn.findfile(what, fn.escape(path, ' ') .. ';', -1)
else
file = fn.get(fn.findfile(what, fn.escape(path, ' ') .. ';', -1), count, '')
end
-- let &suffixesadd = old_suffixesadd
return file
end
function M.finddir(what, where, ...)
-- let old_suffixesadd = &suffixesadd
-- let &suffixesadd = ''
local count = select('1', ...)
if count == nil then
count = 0
end
local path = ''
local file = ''
if fn.filereadable(where) == 1 and fn.isdirectory(where) == 0 then
path = fn.fnamemodify(where, ':h')
else
path = where
end
if count > 0 then
file = fn.finddir(what, fn.escape(path, ' ') .. ';', count)
elseif #{...} == 0 then
file = fn.finddir(what, fn.escape(path, ' ') .. ';')
elseif count == 0 then
file = fn.finddir(what, fn.escape(path, ' ') .. ';', -1)
else
file = fn.get(fn.finddir(what, fn.escape(path, ' ') .. ';', -1), count, '')
end
-- let &suffixesadd = old_suffixesadd
return file
end
return M