diff options
author | Adam Stankiewicz <sheerun@sher.pl> | 2017-09-27 20:52:13 +0200 |
---|---|---|
committer | Adam Stankiewicz <sheerun@sher.pl> | 2017-09-27 20:52:13 +0200 |
commit | 7673a61990d4062adebbe49f71067b0aad90382a (patch) | |
tree | 06f6a5e83257abb59930153e15e0644b504ac94b /autoload/elm/util.vim | |
parent | 6a12aa87f41b02a68cd8e6b494e5400367c2b028 (diff) | |
download | vim-polyglot-7673a61990d4062adebbe49f71067b0aad90382a.tar.gz vim-polyglot-7673a61990d4062adebbe49f71067b0aad90382a.zip |
Change elm provider, closes #224
Diffstat (limited to 'autoload/elm/util.vim')
-rw-r--r-- | autoload/elm/util.vim | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/autoload/elm/util.vim b/autoload/elm/util.vim new file mode 100644 index 00000000..b276394c --- /dev/null +++ b/autoload/elm/util.vim @@ -0,0 +1,178 @@ +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 |