1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-02-03 12:30:05 +08:00
SpaceVim/bundle/vimfiler.vim/autoload/vimfiler/columns/size.vim
2020-06-13 14:06:35 +08:00

98 lines
2.5 KiB
VimL
Vendored

"=============================================================================
" FILE: size.vim
" AUTHOR: Shougo Matsushita <Shougo.Matsu at gmail.com>
" License: MIT license
"=============================================================================
function! vimfiler#columns#size#define() abort
return s:column
endfunction
let s:column = {
\ 'name' : 'size',
\ 'description' : 'get filesize by human',
\ 'syntax' : 'vimfilerColumn__Size',
\ }
function! s:column.length(files, context) abort
return 6
endfunction
function! s:column.define_syntax(context) abort
syntax match vimfilerColumn__SizeLine
\ '.*' contained containedin=vimfilerColumn__Size
highlight def link vimfilerColumn__SizeLine Constant
endfunction
function! s:column.get(file, context) abort
if a:file.vimfiler__is_directory
return ' '
endif
" Get human file size.
let filesize = a:file.vimfiler__filesize
let size = 0
if filesize < 0
if a:file.action__path !~ '^\a\w\+:'
\ && has('lua')
\ && getftype(a:file.action__path) !=# 'link'
let pattern = s:get_lua_file_size(a:file.action__path)
elseif filesize == -2
" Above 2GB?
let pattern = '>2.00'
else
let pattern = ''
endif
let suffix = (pattern != '') ? 'G' : ''
elseif filesize < 1000
" B.
let suffix = 'B'
let float = ''
let pattern = printf('%5d', filesize)
else
if filesize >= 1000000000
" GB.
let suffix = 'G'
let size = filesize / 1024 / 1024
elseif filesize >= 1000000
" MB.
let suffix = 'M'
let size = filesize / 1024
elseif filesize >= 1000
" KB.
let suffix = 'K'
let size = filesize
endif
let float = (size%1024)*100/1024
let digit = size / 1024
let pattern = (digit < 100) ?
\ printf('%2d.%02d', digit, float) :
\ printf('%2d.%01d', digit, float/10)
endif
return pattern . suffix
endfunction
" @vimlint(EVL101, 1, l:pattern)
function! s:get_lua_file_size(filename) abort
lua << EOF
do
local file = io.open(vim.eval('iconv(a:filename, &encoding, "char")'))
local pattern
if file ~= nil then
local mega = math.floor(file:seek('end') / (1024 * 1024) + 0.5)
local float = math.floor((mega%1024)*100/1024 + 0.5)
pattern = string.format('%2d.%02d', math.floor(mega/1024), float)
file:close()
else
pattern = ''
end
vim.command('let pattern = "' .. pattern .. '"')
end
EOF
return pattern
endfunction
" @vimlint(EVL101, 0, l:pattern)