aboutsummaryrefslogtreecommitdiff
path: root/autoload
diff options
context:
space:
mode:
Diffstat (limited to 'autoload')
-rw-r--r--autoload/lsp_settings.vim45
-rw-r--r--autoload/lsp_settings/utils.vim75
2 files changed, 112 insertions, 8 deletions
diff --git a/autoload/lsp_settings.vim b/autoload/lsp_settings.vim
index 55d9452..0b53209 100644
--- a/autoload/lsp_settings.vim
+++ b/autoload/lsp_settings.vim
@@ -9,6 +9,10 @@ call remove(s:settings, '$schema')
let s:ftmap = {}
+function! lsp_settings#installer_dir() abort
+ return s:installer_dir
+endfunction
+
function! lsp_settings#servers_dir() abort
let l:path = fnamemodify(get(g:, 'lsp_settings_servers_dir', s:servers_dir), ':p')
if has('win32')
@@ -27,11 +31,11 @@ function! lsp_settings#executable(cmd) abort
endif
let l:paths .= ',' . lsp_settings#servers_dir() . '/' . a:cmd
if !has('win32')
- let l:found = globpath(l:paths, a:cmd)
+ let l:found = globpath(l:paths, a:cmd, 1)
return !empty(l:found)
endif
for l:ext in ['.exe', '.cmd', '.bat']
- if !empty(globpath(l:paths, a:cmd . l:ext))
+ if !empty(globpath(l:paths, a:cmd . l:ext, 1))
return 1
endif
endfor
@@ -122,14 +126,14 @@ function! lsp_settings#exec_path(cmd) abort
let l:paths = split($PATH, ':')
endif
let l:paths = join(l:paths, ',')
- let l:path = globpath(l:paths, a:cmd)
+ let l:path = globpath(l:paths, a:cmd, 1)
if !has('win32')
if !empty(l:path)
return lsp_settings#utils#first_one(l:path)
endif
else
for l:ext in ['.exe', '.cmd', '.bat']
- let l:path = globpath(l:paths, a:cmd . l:ext)
+ let l:path = globpath(l:paths, a:cmd . l:ext, 1)
if !empty(l:path)
return lsp_settings#utils#first_one(l:path)
endif
@@ -142,10 +146,10 @@ function! lsp_settings#exec_path(cmd) abort
endif
let l:paths .= lsp_settings#servers_dir() . '/' . a:cmd
if !has('win32')
- return lsp_settings#utils#first_one(globpath(l:paths, a:cmd))
+ return lsp_settings#utils#first_one(globpath(l:paths, a:cmd, 1))
endif
for l:ext in ['.exe', '.cmd', '.bat']
- let l:path = globpath(l:paths, a:cmd . l:ext)
+ let l:path = globpath(l:paths, a:cmd . l:ext, 1)
if !empty(l:path)
return lsp_settings#utils#first_one(l:path)
endif
@@ -176,9 +180,13 @@ function! lsp_settings#autocd(server_info) abort
endif
endfunction
+function! lsp_settings#settings() abort
+ return s:settings
+endfunction
+
function! lsp_settings#complete_uninstall(arglead, cmdline, cursorpos) abort
let l:installers = []
- for l:ft in keys(s:settings)
+ for l:ft in sort(keys(s:settings))
for l:conf in s:settings[l:ft]
if !isdirectory(lsp_settings#servers_dir() . '/' . l:conf.command)
continue
@@ -272,6 +280,7 @@ function! s:vim_lsp_install_server(ft, command) abort
endif
let l:server_install_dir = lsp_settings#servers_dir() . '/' . l:entry[0]
if isdirectory(l:server_install_dir)
+ call lsp_settings#utils#msg('Uninstalling ' . l:entry[0])
call delete(l:server_install_dir, 'rf')
endif
call mkdir(l:server_install_dir, 'p')
@@ -324,7 +333,27 @@ function! s:vim_lsp_suggest_plugin() abort
endfor
endfunction
+function! s:vim_lsp_load_or_suggest_delay(ft) abort
+ if get(g:, 'vim_lsp_settings_filetype_no_delays', 0)
+ return s:vim_lsp_load_or_suggest(a:ft)
+ endif
+ call timer_start(0, {timer -> s:vim_lsp_load_or_suggest(a:ft)})
+endfunction
+
function! s:vim_lsp_load_or_suggest(ft) abort
+ if (a:ft !=# '_' && &filetype !=# a:ft) || !has_key(s:settings, a:ft)
+ return
+ endif
+
+ if get(g:, 'lsp_loaded', 0)
+ for l:server in s:settings[a:ft]
+ let l:refresh_pattern = get(l:server, 'refresh_pattern', '')
+ if !empty(l:refresh_pattern)
+ let b:asyncomplete_refresh_pattern = l:refresh_pattern
+ endif
+ endfor
+ endif
+
if get(s:ftmap, a:ft, 0)
return
endif
@@ -409,7 +438,7 @@ function! lsp_settings#init() abort
endif
exe 'augroup' lsp_settings#utils#group_name(l:ft)
autocmd!
- exe 'autocmd FileType' l:ft printf("call s:vim_lsp_load_or_suggest('%s')", l:ft)
+ exe 'autocmd FileType' l:ft 'call' printf("s:vim_lsp_load_or_suggest_delay('%s')", l:ft)
augroup END
endfor
augroup vim_lsp_suggest
diff --git a/autoload/lsp_settings/utils.vim b/autoload/lsp_settings/utils.vim
index 96feb0a..a39851f 100644
--- a/autoload/lsp_settings/utils.vim
+++ b/autoload/lsp_settings/utils.vim
@@ -30,3 +30,78 @@ function! lsp_settings#utils#first_one(lines) abort
endif
return l:path
endfunction
+
+function! s:merge(lhs, rhs) abort
+ let [l:lhs, l:rhs] = [a:lhs, a:rhs]
+ if type(l:lhs) ==# 3
+ if type(l:rhs) ==# 3
+ let l:lhs += l:rhs
+ if len(l:lhs)
+ call remove(l:lhs, 0, len(l:lhs)-1)
+ endif
+ for l:rhi in l:rhs
+ call add(l:lhs, l:rhs[l:rhi])
+ endfor
+ elseif type(l:rhs) ==# 4
+ let l:lhs += map(keys(l:rhs), '{v:val : l:rhs[v:val]}')
+ endif
+ elseif type(l:lhs) ==# 4
+ if type(l:rhs) ==# 3
+ for l:V in l:rhs
+ if type(l:V) != 4
+ continue
+ endif
+ for l:k in keys(l:V)
+ let l:lhs[l:k] = l:V[l:k]
+ endfor
+ endfor
+ elseif type(l:rhs) ==# 4
+ for l:key in keys(l:rhs)
+ if type(l:rhs[l:key]) ==# 3
+ if !has_key(l:lhs, l:key)
+ let l:lhs[l:key] = []
+ endif
+ if type(l:lhs[l:key]) == 3
+ let l:lhs[l:key] += l:rhs[l:key]
+ elseif type(l:lhs[l:key]) == 4
+ for l:k in keys(l:rhs[l:key])
+ let l:lhs[l:key][l:k] = l:rhs[l:key][l:k]
+ endfor
+ endif
+ elseif type(l:rhs[l:key]) ==# 4
+ if has_key(l:lhs, l:key)
+ call s:merge(l:lhs[l:key], l:rhs[l:key])
+ else
+ let l:lhs[l:key] = l:rhs[l:key]
+ endif
+ else
+ let l:lhs[l:key] = l:rhs[l:key]
+ endif
+ endfor
+ endif
+ endif
+endfunction
+
+function! lsp_settings#utils#merge(d) abort
+ let l:ret = {}
+ let l:keys = keys(a:d)
+ for l:k in sort(keys(a:d))
+ let l:new = {}
+ let l:cur = l:new
+ let l:arr = split(l:k, '\.')
+ for l:i in range(len(l:arr))
+ let l:kk = l:arr[l:i]
+ if type(l:cur) == v:t_dict && !has_key(l:cur, l:kk)
+ if l:i == len(l:arr) - 1
+ let l:cur[l:kk] = a:d[l:k]
+ break
+ else
+ let l:cur[l:kk] = {}
+ endif
+ endif
+ let l:cur = l:cur[l:kk]
+ endfor
+ call s:merge(l:ret, l:new)
+ endfor
+ return l:ret
+endfunction