1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-01-24 09:30:04 +08:00
SpaceVim/bundle/neoinclude.vim/autoload/neoinclude/file_include.vim
2020-06-13 14:06:35 +08:00

142 lines
4.2 KiB
VimL

"=============================================================================
" FILE: file_include.vim
" AUTHOR: Shougo Matsushita <Shougo.Matsu at gmail.com>
" License: MIT license
"=============================================================================
function! neoinclude#file_include#get_complete_position(input) abort
call neoinclude#initialize()
let filetype = neoinclude#util#get_context_filetype()
if filetype ==# 'java' || filetype ==# 'haskell'
" Cannot complete include path.
" You should use omnifunc plugins..
return -1
endif
" Not Filename pattern.
let pattern = neoinclude#get_pattern('%', filetype)
if (pattern == '' || a:input !~ pattern)
\ && a:input =~ '\*$\|\.\.\+$\|/c\%[ygdrive/]$'
" Skip filename completion.
return -1
endif
" Check include pattern.
let pattern = neoinclude#get_pattern('%', filetype)
if pattern =~ '\w$'
let pattern .= '\m\s\+'
endif
if pattern == '' || a:input !~ pattern
return -1
endif
let match_end = matchend(a:input, pattern)
let complete_str = matchstr(a:input[match_end :], '\f\+')
let complete_pos = len(a:input) - len(complete_str)
let delimiter = neoinclude#get_delimiters(filetype)
if delimiter != '' && strridx(complete_str, delimiter) >= 0
let complete_pos += strridx(complete_str, delimiter) + 1
endif
return complete_pos
endfunction
function! neoinclude#file_include#get_include_files(input) abort
call neoinclude#initialize()
let filetype = neoinclude#util#get_context_filetype()
call neoinclude#set_filetype_paths('%', filetype)
let path = neoinclude#get_path('%', filetype)
let pattern = neoinclude#get_pattern('%', filetype)
let expr = neoinclude#get_expr('%', filetype)
let reverse_expr = neoinclude#get_reverse_expr(filetype)
let exts = neoinclude#get_exts(filetype)
let line = a:input
let match_end = matchend(line, pattern)
let complete_str = matchstr(line[match_end :], '\f\+')
if expr != ''
let complete_str =
\ substitute(eval(substitute(expr,
\ 'v:fname', string(complete_str), 'g')), '\.\w*$', '', '')
endif
let delimiter = neoinclude#get_delimiters(filetype)
if (line =~ '^\s*\<require_relative\>' && filetype =~# 'ruby')
\ || stridx(complete_str, '.') == 0
" For include relative.
let path = '.'
endif
" Path search.
let glob = (complete_str !~ '\*$')?
\ complete_str . '*' : complete_str
let bufdirectory = neoinclude#util#substitute_path_separator(
\ fnamemodify(expand('%'), ':p:h'))
let candidates = s:get_default_include_files(filetype)
let path = join(map(split(path, ',\+'),
\ "v:val == '.' ? bufdirectory : v:val"), ',')
for word in filter(split(
\ neoinclude#util#substitute_path_separator(
\ globpath(path, glob, 1)), '\n'),"
\ isdirectory(v:val) || empty(exts) ||
\ index(exts, fnamemodify(v:val, ':e')) >= 0")
let dict = {
\ 'word' : word,
\ 'action__is_directory' : isdirectory(word),
\ 'kind' : (isdirectory(word) ? 'dir' : 'file'),
\ }
if reverse_expr != ''
" Convert filename.
let dict.word = eval(substitute(reverse_expr,
\ 'v:fname', string(dict.word), 'g'))
endif
if !dict.action__is_directory && delimiter != '/'
" Remove extension.
let dict.word = fnamemodify(dict.word, ':r')
endif
" Remove before delimiter.
if delimiter != '' && strridx(dict.word, delimiter) >= 0
let dict.word = dict.word[strridx(dict.word, delimiter)+strlen(delimiter): ]
endif
" Remove bufdirectory.
if stridx(dict.word, bufdirectory . '/') == 0
let dict.word = dict.word[len(bufdirectory)+1 : ]
endif
let dict.abbr = dict.word
if dict.action__is_directory
let dict.abbr .= delimiter
endif
call add(candidates, dict)
endfor
return candidates
endfunction
function! s:get_default_include_files(filetype) abort
let files = []
if a:filetype ==# 'python' || a:filetype ==# 'python3'
let files = ['sys']
endif
return map(files, "{
\ 'word' : v:val,
\ 'action__is_directory' : isdirectory(v:val),
\ 'kind' : (isdirectory(v:val) ? 'dir' : 'file'),
\}")
endfunction