1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-03-22 08:45:42 +08:00
2023-03-26 13:44:47 +08:00

98 lines
2.9 KiB
VimL

"=============================================================================
" windisk.vim --- disk manager for windows
" Copyright (c) 2016-2023 Wang Shidong & Contributors
" Author: Wang Shidong < wsdjeg@outlook.com >
" URL: https://spacevim.org
" License: GPLv3
"=============================================================================
let s:ICONV = SpaceVim#api#import('iconv')
let s:LOGGER = SpaceVim#logger#derive('windisk')
func! SpaceVim#plugins#windisk#open() abort
let disks = s:get_disks()
if !empty(disks)
" 1. open plugin buffer
noautocmd vsplit __windisk__
vertical resize 20
let s:disk_buffer_nr = bufnr('%')
set ft=SpaceVimWinDiskManager
setlocal buftype=nofile bufhidden=wipe nobuflisted nolist noswapfile nowrap cursorline nospell nonu norelativenumber winfixwidth
" 2. init buffer option and syntax
let lines = disks
setlocal modifiable
call setline(1, lines)
setlocal nomodifiable
" 2. updated content
" 3. init buffer key bindings
nnoremap <buffer><silent> <Cr> :call <SID>open_disk(getline('.'))<cr>
else
" TODO: print warnning, not sure if it is needed.
endif
endf
function! s:diskinfo() abort
if !executable('wmic')
call s:LOGGER.warn('windisk requires wmic.exe!')
return []
endif
let rst = systemlist('wmic LOGICALDISK LIST BRIEF')
if !empty(rst)
let diskinfo = rst[1:]
else
let diskinfo = []
endif
let rst = []
call s:LOGGER.debug('start to parse diskinfo!')
for line in diskinfo
call s:LOGGER.debug(line)
let info = split(s:ICONV.iconv(line, g:spacevim_windisk_encoding, &enc))
call s:LOGGER.debug('iconv ' . g:spacevim_windisk_encoding . ' result:' . string(info))
if len(info) >= 4
let diskid = info[0]
let freespace = info[2]
let size = info[3]
let name = get(info, 4, '')
call add(rst, {
\ 'disk' : diskid,
\ 'free' : freespace,
\ 'size' : size,
\ 'name' : name,
\ })
endif
endfor
return rst
endfunction
func! s:get_disks() abort
" use wmic command is better
" return map(filter(range(65, 97), "isdirectory(nr2char(v:val) . ':/')"), 'nr2char(v:val) . ":/"')
let diskinfo = s:diskinfo()
let line = map(diskinfo, 's:diskToLine(v:val)')
return line
endf
function! s:diskToLine(disk) abort
return a:disk.disk . '/' . ' ' . (empty(a:disk.name) ? '本地磁盘' : a:disk.name)
endfunction
function! s:open_disk(d) abort
let disk = split(a:d)[0]
call s:close_disk_buffer()
if g:spacevim_filemanager ==# 'vimfiler'
exe 'VimFiler -no-toggle ' . disk
elseif g:spacevim_filemanager ==# 'nerdtree'
silent! exe 'NERDTree ' . disk
elseif g:spacevim_filemanager ==# 'defx'
exe 'Defx -no-toggle -no-resume ' . disk
endif
doautocmd WinEnter
endfunction
function! s:close_disk_buffer() abort
exe 'bd ' . s:disk_buffer_nr
endfunction