2016-12-26 21:11:19 +08:00
scriptencoding utf -8
let s :save_cpo = &cpo
set cpo &vim
let g :unite_source_menu_menus =
\ get ( g :, 'unite_source_menu_menus' , {})
let g :unite_source_menu_menus .CustomKeyMaps = {'description' :
\ 'Custom mapped keyboard shortcuts [unite]<SPACE>' }
let g :unite_source_menu_menus .CustomKeyMaps .command_candidates =
\ get ( g :unite_source_menu_menus .CustomKeyMaps , 'command_candidates' , [])
let g :unite_source_menu_menus .MyStarredrepos = {'description' :
\ 'All github repos starred by me <leader>ls' }
let g :unite_source_menu_menus .MyStarredrepos .command_candidates =
\ get ( g :unite_source_menu_menus .MyStarredrepos , 'command_candidates' , [])
let g :unite_source_menu_menus .MpvPlayer = {'description' :
\ 'Musics list <leader>lm' }
let g :unite_source_menu_menus .MpvPlayer .command_candidates =
\ get ( g :unite_source_menu_menus .MpvPlayer , 'command_candidates' , [])
fu ! zvim #util #defineMap ( type , key , value , desc , ...) abort
exec a :type . ' ' . a :key . ' ' . a :value
let description = '➤ '
\. a :desc
\. repeat ( ' ' , 80 - len ( a :desc ) - len ( a :key ) )
\. a :key
let cmd = len ( a :000 ) > 0 ? a :000 [0 ] : a :value
call add ( g :unite_source_menu_menus .CustomKeyMaps .command_candidates , [description , cmd ])
endf
fu ! zvim #util #source_rc ( file ) abort
if filereadable ( g :Config_Main_Home . '/' . a :file )
execute 'source ' . g :Config_Main_Home . '/' . a :file
endif
endf
fu ! zvim #util #SmartClose ( ) abort
2016-12-31 19:40:08 +08:00
let ignorewin = get ( g :, 'spacevim_smartcloseignorewin' , [])
let ignoreft = get ( g :, 'spacevim_smartcloseignoreft' , [])
2016-12-26 21:11:19 +08:00
let win_count = winnr ( '$' )
let num = win_count
for i in range ( 1 , win_count )
if index ( ignorewin , bufname ( winbufnr ( i ) ) ) ! = -1 | | index ( ignoreft , getbufvar ( bufname ( winbufnr ( i ) ) , '&filetype' ) ) ! = -1
let num = num - 1
endif
if getbufvar ( winbufnr ( i ) , '&buftype' ) = = # 'quickfix'
let num = num - 1
endif
endfor
if num = = 1
else
close
endif
endf
fu ! s :findFileInParent ( what , where ) abort " {{{2
let old_suffixesadd = &suffixesadd
let &suffixesadd = ''
let file = findfile ( a :what , escape ( a :where , ' ' ) . ';' )
let &suffixesadd = old_suffixesadd
return file
endf " }}}2
fu ! s :findDirInParent ( what , where ) abort " {{{2
let old_suffixesadd = &suffixesadd
let &suffixesadd = ''
let dir = finddir ( a :what , escape ( a :where , ' ' ) . ';' )
let &suffixesadd = old_suffixesadd
return dir
endf " }}}2
fu ! zvim #util #CopyToClipboard ( ...) abort
if a :0
if executable ( 'git' )
let repo_home = fnamemodify ( s :findDirInParent ( '.git' , expand ( '%:p' ) ) , ':p:h:h' )
if repo_home ! = # '' | | ! isdirectory ( repo_home )
let branch = split ( systemlist ( 'git -C ' . repo_home . ' branch -a |grep "*"' ) [0 ], ' ' ) [1 ]
let remotes = filter ( systemlist ( 'git -C ' . repo_home . ' remote -v' ) , "match(v:val,'^origin') >= 0 && match(v:val,'fetch') > 0" )
if len ( remotes ) > 0
let remote = remotes [0 ]
if stridx ( remote , '@' ) > -1
let repo_url = 'https://github.com/' . split ( split ( remote , ' ' ) [0 ], ':' ) [1 ]
let repo_url = strpart ( repo_url , 0 , len ( repo_url ) - 4 )
else
let repo_url = split ( remote , ' ' ) [0 ]
let repo_url = strpart ( repo_url , stridx ( repo_url , 'http' ) , len ( repo_url ) - 4 - stridx ( repo_url , 'http' ) )
endif
let f_url = repo_url . '/blob/' . branch . '/' . strpart ( expand ( '%:p' ) , len ( repo_home ) + 1 , len ( expand ( '%:p' ) ) )
if WINDOWS ( )
let f_url = substitute ( f_url , '\' , '/' , 'g' )
endif
if a :1 = = 2
let current_line = line ( '.' )
let f_url .= '#L' . current_line
elseif a :1 = = 3
let f_url .= '#L' . getpos ( "'<" ) [1 ] . '-L' . getpos ( "'>" ) [1 ]
endif
2017-01-12 22:17:04 +08:00
try
let @+ = f_url
echo 'Copied to clipboard'
catch /^Vim\%((\a\+)\)\=:E354/
if has ( 'nvim' )
echohl WarningMsg | echom 'Can not find clipboard, for more info see :h clipboard' | echohl None
else
echohl WarningMsg | echom 'You need compile you vim with +clipboard feature' | echohl None
endif
endtry
2016-12-26 21:11:19 +08:00
else
echohl WarningMsg | echom 'This git repo has no remote host' | echohl None
endif
else
echohl WarningMsg | echom 'This file is not in a git repo' | echohl None
endif
else
echohl WarningMsg | echom 'You need install git!' | echohl None
endif
else
2017-01-12 22:17:04 +08:00
try
let @+ = expand ( '%:p' )
echo 'Copied to clipboard'
catch /^Vim\%((\a\+)\)\=:E354/
if has ( 'nvim' )
echohl WarningMsg | echom 'Can not find clipboard, for more info see :h clipboard' | echohl None
else
echohl WarningMsg | echom 'You need compile you vim with +clipboard feature' | echohl None
endif
endtry
2016-12-26 21:11:19 +08:00
endif
endf
fu ! zvim #util #check_if_expand_tab ( ) abort
let has_noexpandtab = search ( '^\t' , 'wn' )
let has_expandtab = search ( '^ ' , 'wn' )
if has_noexpandtab && has_expandtab
let idx = inputlist ( ['ERROR: current file exists both expand and noexpand TAB, python can only use one of these two mode in one file.\nSelect Tab Expand Type:' ,
\ '1. expand (tab=space, recommended)' ,
\ '2. noexpand (tab=\t, currently have risk)' ,
\ '3. do nothing (I will handle it by myself)' ])
let tab_space = printf ( '%*s' , &tabstop , '' )
if idx = = 1
let has_noexpandtab = 0
let has_expandtab = 1
silent exec '%s/\t/' . tab_space . '/g'
elseif idx = = 2
let has_noexpandtab = 1
let has_expandtab = 0
silent exec '%s/' . tab_space . '/\t/g'
else
return
endif
endif
if has_noexpandtab = = 1 && has_expandtab = = 0
echomsg 'substitute space to TAB...'
set noexpandtab
echomsg 'done!'
elseif has_noexpandtab = = 0 && has_expandtab = = 1
echomsg 'substitute TAB to space...'
set expandtab
echomsg 'done!'
else
" it may be a new file
" we use original vim setting
endif
endf
function ! zvim #util #BufferEmpty ( ) abort
let l :current = bufnr ( '%' )
if ! getbufvar ( l :current , '&modified' )
enew
silent ! execute 'bdelete ' .l :current
endif
endfunction
function ! zvim #util #loadMusics ( ) abort
let musics = globpath ( '~/Musics' , '*.mp3' , 0 , 1 )
let g :unite_source_menu_menus .MpvPlayer .command_candidates = []
for m in musics
call add ( g :unite_source_menu_menus .MpvPlayer .command_candidates ,
\ [fnamemodify ( m , ':t' ) ,
\ "call zvim#mpv#play('" . m . "')" ])
endfor
endfunction
function ! zvim #util #listDirs ( dir ) abort
let dir = fnamemodify ( a :dir , ':p' )
if isdirectory ( dir )
let cmd = printf ( 'ls -F %s | grep /$' , dir )
return map ( systemlist ( cmd ) , 'v:val[:-2]' )
endif
return []
endfunction
function ! zvim #util #OpenVimfiler ( ) abort
if bufnr ( 'vimfiler' ) = = -1
VimFiler
AirlineRefresh
wincmd p
2017-01-07 10:50:28 +08:00
if &filetype ! = # 'startify'
IndentLinesToggle
IndentLinesToggle
endif
2016-12-26 21:11:19 +08:00
wincmd p
else
VimFiler
AirlineRefresh
endif
endfunction
let s :plugins_argv = ['-update' , '-openurl' ]
function ! zvim #util #complete_plugs ( ArgLead , CmdLine , CursorPos ) abort
call zvim #debug #completion_debug ( a :ArgLead , a :CmdLine , a :CursorPos )
if a :CmdLine = ~ # 'Plugin\s*$' | | a :ArgLead = ~ # '^-[a-zA-Z]*'
return join ( s :plugins_argv , "\n" )
endif
return join ( plugins #list ( ) , "\n" )
endfunction
function ! zvim #util #Plugin ( ...) abort
let adds = []
let updates = []
let flag = 0
for a in a :000
if flag = = 1
call add ( adds , a )
elseif flag = = 2
call add ( updates , a )
endif
if a = = # '-update'
let flag = 1
elseif a = = # '-openurl'
let flag = 2
endif
endfor
echo string ( adds ) . "\n" . string ( updates )
endfunction
function ! zvim #util #complete_project ( ArgLead , CmdLine , CursorPos ) abort
call zvim #debug #completion_debug ( a :ArgLead , a :CmdLine , a :CursorPos )
2016-12-31 19:40:08 +08:00
let dir = get ( g :, 'spacevim_src_root' , '~' )
2016-12-26 21:11:19 +08:00
"return globpath(dir, '*')
let result = split ( globpath ( dir , '*' ) , "\n" )
let ps = []
for p in result
if isdirectory ( p ) && isdirectory ( p . '\' . '.git' )
call add ( ps , fnamemodify ( p , ':t' ) )
endif
endfor
return join ( ps , "\n" )
endfunction
function ! zvim #util #OpenProject ( p ) abort
2016-12-31 19:40:08 +08:00
let dir = get ( g :, 'spacevim_src_root' , '~' ) . a :p
2016-12-26 21:11:19 +08:00
exe 'CtrlP ' . dir
endfunction
function ! zvim #util #UpdateHosts ( ...) abort
if len ( a :000 ) = = 0
2016-12-31 19:40:08 +08:00
let url = get ( g :, 'spacevim_hosts_url' , '' )
2016-12-26 21:11:19 +08:00
else
let url = a :1
endif
let hosts = systemlist ( 'curl -s ' . url )
if WINDOWS ( )
let local_hosts = $SystemRoot . expand ( '\System32\drivers\etc\hosts' )
else
let local_hosts = '/etc/hosts'
endif
if writefile ( hosts , local_hosts , 'a' ) = = -1
echo 'failed!'
else
echo 'successfully!'
endif
endfunction
fu ! zvim #util #Generate_ignore ( ignore , tool ) abort
let ignore = []
if a :tool = = # 'ag'
for ig in split ( a :ignore , ',' )
call add ( ignore , '--ignore' )
2017-03-21 21:06:49 +08:00
call add ( ignore , ig )
2016-12-26 21:11:19 +08:00
endfor
elseif a :tool = = # 'rg'
for ig in split ( a :ignore , ',' )
call add ( ignore , '-g' )
call add ( ignore , '!' . ig )
endfor
endif
return ignore
endf
let &cpo = s :save_cpo
unlet s :save_cpo