179 lines
5.3 KiB
VimL
179 lines
5.3 KiB
VimL
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elm') == -1
|
|
|
|
" IsWin returns 1 if current OS is Windows or 0 otherwise
|
|
fun! elm#util#IsWin() abort
|
|
let l:win = ['win16', 'win32', 'win32unix', 'win64', 'win95']
|
|
for l:w in l:win
|
|
if (has(l:w))
|
|
return 1
|
|
endif
|
|
endfor
|
|
|
|
return 0
|
|
endf
|
|
|
|
fun! elm#util#CheckBin(bin, url) abort
|
|
let l:binpath = substitute(a:bin, '^\s*\(.\{-}\)\s*$', '\1', '')
|
|
|
|
if executable(l:binpath)
|
|
return l:binpath
|
|
endif
|
|
|
|
call elm#util#EchoWarning('elm-vim:', 'could not find ' . l:binpath . ' [' . a:url . ']')
|
|
|
|
return ''
|
|
endf
|
|
|
|
" Determines the browser command to use
|
|
fun! s:get_browser_command() abort
|
|
let l:elm_browser_command = get(g:, 'elm_browser_command', '')
|
|
if l:elm_browser_command ==? ''
|
|
if elm#util#IsWin()
|
|
let l:elm_browser_command = '!start rundll32 url.dll,FileProtocolHandler %URL%'
|
|
elseif has('mac') || has('macunix') || has('gui_macvim') || system('uname') =~? '^darwin'
|
|
let l:elm_browser_command = 'open %URL%'
|
|
elseif executable('xdg-open')
|
|
let l:elm_browser_command = 'xdg-open %URL%'
|
|
elseif executable('firefox')
|
|
let l:elm_browser_command = 'firefox %URL% &'
|
|
else
|
|
let l:elm_browser_command = ''
|
|
endif
|
|
endif
|
|
return l:elm_browser_command
|
|
endf
|
|
|
|
" OpenBrowser opens a url in the default browser
|
|
fun! elm#util#OpenBrowser(url) abort
|
|
let l:cmd = s:get_browser_command()
|
|
if len(l:cmd) == 0
|
|
redraw
|
|
echohl WarningMsg
|
|
echo "It seems that you don't have general web browser. Open URL below."
|
|
echohl None
|
|
echo a:url
|
|
return
|
|
endif
|
|
if l:cmd =~? '^!'
|
|
let l:cmd = substitute(l:cmd, '%URL%', '\=shellescape(a:url)', 'g')
|
|
silent! exec l:cmd
|
|
elseif l:cmd =~# '^:[A-Z]'
|
|
let l:cmd = substitute(l:cmd, '%URL%', '\=a:url', 'g')
|
|
exec l:cmd
|
|
else
|
|
let l:cmd = substitute(l:cmd, '%URL%', '\=shellescape(a:url)', 'g')
|
|
call system(l:cmd)
|
|
endif
|
|
endf
|
|
|
|
" DecodeJSON decodes a string of json into a viml object
|
|
fun! elm#util#DecodeJSON(s) abort
|
|
let l:true = 1
|
|
let l:false = 0
|
|
let l:null = 0
|
|
return eval(a:s)
|
|
endf
|
|
|
|
" Remove ANSI escape characters used for highlighting purposes
|
|
fun! s:strip_color(msg) abort
|
|
return substitute(a:msg, '\e\[[0-9;]\+[mK]', '', 'g')
|
|
endf
|
|
|
|
" Print functions
|
|
fun! elm#util#Echo(title, msg) abort
|
|
redraws! | echon a:title . ' ' | echohl Identifier | echon s:strip_color(a:msg) | echohl None
|
|
endf
|
|
|
|
fun! elm#util#EchoSuccess(title, msg) abort
|
|
redraws! | echon a:title . ' ' | echohl Function | echon s:strip_color(a:msg) | echohl None
|
|
endf
|
|
|
|
fun! elm#util#EchoWarning(title, msg) abort
|
|
redraws! | echon a:title . ' ' | echohl WarningMsg | echon s:strip_color(a:msg) | echohl None
|
|
endf
|
|
|
|
fun! elm#util#EchoError(title, msg) abort
|
|
redraws! | echon a:title . ' ' | echohl ErrorMsg | echon s:strip_color(a:msg) | echohl None
|
|
endf
|
|
|
|
fun! elm#util#EchoLater(func_name, title, msg) abort
|
|
let s:echo_func_name = a:func_name
|
|
let s:echo_title = a:title
|
|
let s:echo_msg = a:msg
|
|
endf
|
|
|
|
fun! elm#util#EchoStored() abort
|
|
if exists('s:echo_func_name') && exists('s:echo_title') && exists('s:echo_msg')
|
|
call elm#util#{s:echo_func_name}(s:echo_title, s:echo_msg)
|
|
unlet s:echo_func_name
|
|
unlet s:echo_title
|
|
unlet s:echo_msg
|
|
endif
|
|
endf
|
|
|
|
function! elm#util#GoToModule(name)
|
|
if empty(a:name) | return | endif
|
|
if empty(matchstr(a:name, '^Native\.'))
|
|
let l:extension = '.elm'
|
|
else
|
|
let l:extension = '.js'
|
|
endif
|
|
let l:rel_path = substitute(a:name, '\.', '/', 'g') . l:extension
|
|
let l:root = elm#FindRootDirectory()
|
|
|
|
let l:module_file = s:findLocalModule(l:rel_path, l:root)
|
|
if !filereadable(l:module_file)
|
|
let l:module_file = s:findDependencyModule(l:rel_path, l:root)
|
|
endif
|
|
|
|
if filereadable(l:module_file)
|
|
exec 'edit ' . fnameescape(l:module_file)
|
|
else
|
|
return s:error("Can't find module \"" . a:name . "\"")
|
|
endif
|
|
endfunction
|
|
|
|
function! s:findLocalModule(rel_path, root)
|
|
let l:package_json = a:root . '/elm-package.json'
|
|
if exists('*json_decode')
|
|
let l:package = json_decode(readfile(l:package_json))
|
|
let l:source_roots = l:package['source-directories']
|
|
else
|
|
" This is a fallback for vim's which do not support json_decode.
|
|
" It simply only looks in the 'src' subdirectory and fails otherwise.
|
|
let l:source_roots = ['src']
|
|
end
|
|
for l:source_root in l:source_roots
|
|
let l:file_path = a:root . '/' . l:source_root . '/' . a:rel_path
|
|
if !filereadable(l:file_path)
|
|
continue
|
|
endif
|
|
return l:file_path
|
|
endfor
|
|
endfunction
|
|
|
|
function! s:findDependencyModule(rel_path, root)
|
|
" If we are a dependency ourselves, we need to check our siblings.
|
|
" This is because elm package doesn't install dependencies recursively.
|
|
let l:root = substitute(a:root, '\/elm-stuff/packages.\+$', '', '')
|
|
|
|
" We naively craws the dependencies dir for any fitting module name.
|
|
" If it exists, we'll find it. If multiple filenames match,
|
|
" there's a chance we return the wrong one.
|
|
let l:module_paths = glob(l:root . '/elm-stuff/packages/**/' . a:rel_path, 0, 1)
|
|
if len(l:module_paths) > 0
|
|
return l:module_paths[0]
|
|
endif
|
|
endfunction
|
|
|
|
" Using the built-in :echoerr prints a stacktrace, which isn't that nice.
|
|
" From: https://github.com/moll/vim-node/blob/master/autoload/node.vim
|
|
function! s:error(msg)
|
|
echohl ErrorMsg
|
|
echomsg a:msg
|
|
echohl NONE
|
|
let v:errmsg = a:msg
|
|
endfunction
|
|
|
|
endif
|