Files
vim-lsp-settings-mirror/autoload/lsp_settings/utils.vim
Prabir Shrestha c5ada1e93a fix a:url
2022-01-03 15:02:31 +09:00

179 lines
5.0 KiB
VimL

function! lsp_settings#utils#msg(msg, ...) abort
redraw
echohl Comment
echo a:msg
echohl None
return a:0 > 0 ? a:000[0] : v:null
endfunction
function! lsp_settings#utils#warning(msg, ...) abort
redraw
echohl WarningMsg
echomsg a:msg
echohl None
return a:0 > 0 ? a:000[0] : v:null
endfunction
function! lsp_settings#utils#error(msg, ...) abort
redraw
echohl Error
echomsg a:msg
echohl None
return a:0 > 0 ? a:000[0] : v:null
endfunction
function! lsp_settings#utils#valid_name(command) abort
return a:command =~# '^[a-zA-Z0-9_-]\+$'
endfunction
function! lsp_settings#utils#group_name(ft) abort
return printf('vim_lsp_suggest_%s', a:ft)
endfunction
function! lsp_settings#utils#first_one(lines) abort
if empty(a:lines)
return ''
endif
let l:path = fnamemodify(split(a:lines, "\n")[0], ':p')
if has('win32')
let l:path = substitute(l:path, '/', '\', 'g')
endif
return l:path
endfunction
function! lsp_settings#utils#dotmerge(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
let l:ret = extend(l:ret, l:new)
endfor
return l:ret
endfunction
let s:catalog_path = expand('<sfile>:h:h:h') . '/data/catalog.json'
function! lsp_settings#utils#load_schemas(name) abort
let l:schemas = json_decode(join(readfile(s:catalog_path), "\n"))['schemas']
return extend(l:schemas, lsp_settings#get(a:name, 'schemas', []))
endfunction
function! lsp_settings#utils#load_schemas_map(name) abort
let l:schemas = json_decode(join(readfile(s:catalog_path), "\n"))['schemas']
let l:result = {}
for l:v in extend(l:schemas, lsp_settings#get(a:name, 'schemas', []))
if has_key(l:v, 'fileMatch')
let l:result[l:v['url']] = l:v['fileMatch']
endif
endfor
return l:result
endfunction
function! lsp_settings#utils#term_start(cmd, options) abort
let l:options = {}
if has_key(a:options, 'cwd')
let l:options['cwd'] = a:options['cwd']
endif
if has('nvim')
split new
call termopen(a:cmd, l:options)
else
call term_start(a:cmd, l:options)
endif
endfunction
function! s:extend(lhs, rhs) abort
let [l:lhs, l:rhs] = [a:lhs, a:rhs]
if type(l:lhs) ==# 3
if type(l:rhs) ==# 3
" [1,2,3]+[4,5,6]=[1,2,3,4,5,6]
let l:lhs += l:rhs
elseif type(l:rhs) ==# 4
" [1,2,3]+{'a':1,'b':2}= [1,2,3,{'a':1},{'b':2}]
let l:lhs += map(keys(l:rhs), '{v:val : l:rhs[v:val]}')
endif
elseif type(l:lhs) ==# 4
if type(l:rhs) ==# 3
" {'a':1,'b':2}+[{'c':3},{'d':4},5]= {'a':1,'b':2,'c':3,'d':4}
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
" {'a':1,'b':2}+{'c':3,'d':4}= {'a':1,'b':2,'c':3,'d':4}
for l:key in keys(l:rhs)
if type(l:rhs[l:key]) ==# 3
" {'a':1,'b':2}+{'c':[1]}={'a':1,'b':2,'c':[1]}
if !has_key(l:lhs, l:key)
let l:lhs[l:key] = []
endif
if type(l:lhs[l:key]) == 3
" {'a':[1],'b':2}+{'a':[2]}={'a':[1,2],'b':2}
let l:lhs[l:key] += l:rhs[l:key]
elseif type(l:lhs[l:key]) == 4
" {'a':{'aa':1},'b':2}+{'a':[2]}={'a':[2],'b':2}
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
" {'a':{'aa':1},'b':2}+{'a':{'ab':2]}={'a':{'aa':1,'ab':2},'b':2}
if has_key(l:lhs, l:key)
call s:extend(l:lhs[l:key], l:rhs[l:key])
else
let l:lhs[l:key] = l:rhs[l:key]
endif
else
" {'a':{'aa':1},'b':2}+{'a':1}={'a':1,'b':2}
let l:lhs[l:key] = l:rhs[l:key]
endif
endfor
endif
endif
return l:lhs
endfunction
function! lsp_settings#utils#extend(lhs, rhs) abort
return s:extend(a:lhs, a:rhs)
endfunction
function! lsp_settings#utils#shellescape(path) abort
let l:quote = &shellxquote ==# '"' ? "'" : '"'
return l:quote . a:path . l:quote
endfunction
function! lsp_settings#utils#open_url(url) abort
if exists('g:loaded_openbrowser') && g:loaded_openbrowser
call openbrowser#open(a:url)
elseif has('win32') || has('win64')
silent! exec printf('!start rundll32 url.dll,FileProtocolHandler %s', a:url)
elseif has('mac') || has('macunix') || has('gui_macvim') || system('uname') =~? '^darwin'
call system(printf('open "%s"', a:url))
elseif executable('xdg-open')
call system(printf('xdg-open "%s"', a:url))
elseif executable('firefox')
call system(printf('firefox "%s"', a:url))
else
return v:false
endif
return v:true
endfunction