diff options
Diffstat (limited to 'runtime/autoload')
-rw-r--r-- | runtime/autoload/health/provider.vim | 44 | ||||
-rw-r--r-- | runtime/autoload/provider/clipboard.vim | 72 | ||||
-rw-r--r-- | runtime/autoload/provider/node.vim | 19 | ||||
-rw-r--r-- | runtime/autoload/provider/perl.vim | 28 | ||||
-rw-r--r-- | runtime/autoload/provider/ruby.vim | 3 |
5 files changed, 96 insertions, 70 deletions
diff --git a/runtime/autoload/health/provider.vim b/runtime/autoload/health/provider.vim index 0482cb7f3c..e8e38f581f 100644 --- a/runtime/autoload/health/provider.vim +++ b/runtime/autoload/health/provider.vim @@ -573,7 +573,7 @@ function! s:check_ruby() abort endif call health#report_info('Ruby: '. s:system('ruby -v')) - let host = provider#ruby#Detect() + let [host, err] = provider#ruby#Detect() if empty(host) call health#report_warn('`neovim-ruby-host` not found.', \ ['Run `gem install neovim` to ensure the neovim RubyGem is installed.', @@ -636,7 +636,7 @@ function! s:check_node() abort call health#report_warn('node.js on this system does not support --inspect-brk so $NVIM_NODE_HOST_DEBUG is ignored.') endif - let host = provider#node#Detect() + let [host, err] = provider#node#Detect() if empty(host) call health#report_warn('Missing "neovim" npm (or yarn) package.', \ ['Run in shell: npm install -g neovim', @@ -689,29 +689,31 @@ function! s:check_perl() abort return endif - if !executable('perl') || !executable('cpanm') - call health#report_warn( - \ '`perl` and `cpanm` must be in $PATH.', - \ ['Install Perl and cpanminus and verify that `perl` and `cpanm` commands work.']) - return + let [perl_exec, perl_errors] = provider#perl#Detect() + if empty(perl_exec) + if !empty(perl_errors) + call health#report_error('perl provider error:', perl_errors) + else + call health#report_warn('No usable perl executable found') + endif + return endif - let perl_v = get(split(s:system(['perl', '-W', '-e', 'print $^V']), "\n"), 0, '') - call health#report_info('Perl: '. perl_v) + + call health#report_info('perl executable: '. perl_exec) + + " we cannot use cpanm that is on the path, as it may not be for the perl + " set with g:perl_host_prog + call s:system([perl_exec, '-W', '-MApp::cpanminus', '-e', '']) if s:shell_error - call health#report_warn('Nvim perl host does not support '.perl_v) - " Skip further checks, they are nonsense if perl is too old. - return + return [perl_exec, '"App::cpanminus" module is not installed'] endif - let host = provider#perl#Detect() - if empty(host) - call health#report_warn('Missing "Neovim::Ext" cpan module.', - \ ['Run in shell: cpanm Neovim::Ext']) - return - endif - call health#report_info('Nvim perl host: '. host) + let latest_cpan_cmd = [perl_exec, + \ '-MApp::cpanminus::fatscript', '-e', + \ 'my $app = App::cpanminus::script->new; + \ $app->parse_options ("--info", "-q", "Neovim::Ext"); + \ exit $app->doit'] - let latest_cpan_cmd = 'cpanm --info -q Neovim::Ext' let latest_cpan = s:system(latest_cpan_cmd) if s:shell_error || empty(latest_cpan) call health#report_error('Failed to run: '. latest_cpan_cmd, @@ -735,7 +737,7 @@ function! s:check_perl() abort return endif - let current_cpan_cmd = [host, '-W', '-MNeovim::Ext', '-e', 'print $Neovim::Ext::VERSION'] + let current_cpan_cmd = [perl_exec, '-W', '-MNeovim::Ext', '-e', 'print $Neovim::Ext::VERSION'] let current_cpan = s:system(current_cpan_cmd) if s:shell_error call health#report_error('Failed to run: '. string(current_cpan_cmd), diff --git a/runtime/autoload/provider/clipboard.vim b/runtime/autoload/provider/clipboard.vim index a96a0a61b7..275d18a5a9 100644 --- a/runtime/autoload/provider/clipboard.vim +++ b/runtime/autoload/provider/clipboard.vim @@ -35,8 +35,7 @@ endfunction let s:selections = { '*': s:selection, '+': copy(s:selection) } function! s:try_cmd(cmd, ...) abort - let argv = split(a:cmd, " ") - let out = systemlist(argv, (a:0 ? a:1 : ['']), 1) + let out = systemlist(a:cmd, (a:0 ? a:1 : ['']), 1) if v:shell_error if !exists('s:did_error_try_cmd') echohl WarningMsg @@ -55,6 +54,10 @@ function! s:cmd_ok(cmd) abort return v:shell_error == 0 endfunction +function! s:split_cmd(cmd) abort + return (type(a:cmd) == v:t_string) ? split(a:cmd, " ") : a:cmd +endfunction + let s:cache_enabled = 1 let s:err = '' @@ -71,44 +74,50 @@ function! provider#clipboard#Executable() abort return '' endif - let s:copy = get(g:clipboard, 'copy', { '+': v:null, '*': v:null }) - let s:paste = get(g:clipboard, 'paste', { '+': v:null, '*': v:null }) + let s:copy = {} + let s:copy['+'] = s:split_cmd(get(g:clipboard.copy, '+', v:null)) + let s:copy['*'] = s:split_cmd(get(g:clipboard.copy, '*', v:null)) + + let s:paste = {} + let s:paste['+'] = s:split_cmd(get(g:clipboard.paste, '+', v:null)) + let s:paste['*'] = s:split_cmd(get(g:clipboard.paste, '*', v:null)) + let s:cache_enabled = get(g:clipboard, 'cache_enabled', 0) return get(g:clipboard, 'name', 'g:clipboard') elseif has('mac') - let s:copy['+'] = 'pbcopy' - let s:paste['+'] = 'pbpaste' + let s:copy['+'] = ['pbcopy'] + let s:paste['+'] = ['pbpaste'] let s:copy['*'] = s:copy['+'] let s:paste['*'] = s:paste['+'] let s:cache_enabled = 0 return 'pbcopy' elseif exists('$WAYLAND_DISPLAY') && executable('wl-copy') && executable('wl-paste') - let s:copy['+'] = 'wl-copy --foreground --type text/plain' - let s:paste['+'] = 'wl-paste --no-newline' - let s:copy['*'] = 'wl-copy --foreground --primary --type text/plain' - let s:paste['*'] = 'wl-paste --no-newline --primary' + let s:copy['+'] = ['wl-copy', '--foreground', '--type', 'text/plain'] + let s:paste['+'] = ['wl-paste', '--no-newline'] + let s:copy['*'] = ['wl-copy', '--foreground', '--primary', '--type', 'text/plain'] + let s:paste['*'] = ['wl-paste', '--no-newline', '--primary'] return 'wl-copy' elseif exists('$DISPLAY') && executable('xclip') - let s:copy['+'] = 'xclip -quiet -i -selection clipboard' - let s:paste['+'] = 'xclip -o -selection clipboard' - let s:copy['*'] = 'xclip -quiet -i -selection primary' - let s:paste['*'] = 'xclip -o -selection primary' + let s:copy['+'] = ['xclip', '-quiet', '-i', '-selection', 'clipboard'] + let s:paste['+'] = ['xclip', '-o', '-selection', 'clipboard'] + let s:copy['*'] = ['xclip', '-quiet', '-i', '-selection', 'primary'] + let s:paste['*'] = ['xclip', '-o', '-selection', 'primary'] return 'xclip' elseif exists('$DISPLAY') && executable('xsel') && s:cmd_ok('xsel -o -b') - let s:copy['+'] = 'xsel --nodetach -i -b' - let s:paste['+'] = 'xsel -o -b' - let s:copy['*'] = 'xsel --nodetach -i -p' - let s:paste['*'] = 'xsel -o -p' + let s:copy['+'] = ['xsel', '--nodetach', '-i', '-b'] + let s:paste['+'] = ['xsel', '-o', '-b'] + let s:copy['*'] = ['xsel', '--nodetach', '-i', '-p'] + let s:paste['*'] = ['xsel', '-o', '-p'] return 'xsel' elseif executable('lemonade') - let s:copy['+'] = 'lemonade copy' - let s:paste['+'] = 'lemonade paste' - let s:copy['*'] = 'lemonade copy' - let s:paste['*'] = 'lemonade paste' + let s:copy['+'] = ['lemonade', 'copy'] + let s:paste['+'] = ['lemonade', 'paste'] + let s:copy['*'] = ['lemonade', 'copy'] + let s:paste['*'] = ['lemonade', 'paste'] return 'lemonade' elseif executable('doitclient') - let s:copy['+'] = 'doitclient wclip' - let s:paste['+'] = 'doitclient wclip -r' + let s:copy['+'] = ['doitclient', 'wclip'] + let s:paste['+'] = ['doitclient', 'wclip', '-r'] let s:copy['*'] = s:copy['+'] let s:paste['*'] = s:paste['+'] return 'doitclient' @@ -118,14 +127,14 @@ function! provider#clipboard#Executable() abort else let win32yank = 'win32yank.exe' endif - let s:copy['+'] = win32yank.' -i --crlf' - let s:paste['+'] = win32yank.' -o --lf' + let s:copy['+'] = [win32yank, '-i', '--crlf'] + let s:paste['+'] = [win32yank, '-o', '--lf'] let s:copy['*'] = s:copy['+'] let s:paste['*'] = s:paste['+'] return 'win32yank' elseif exists('$TMUX') && executable('tmux') - let s:copy['+'] = 'tmux load-buffer -' - let s:paste['+'] = 'tmux save-buffer -' + let s:copy['+'] = ['tmux', 'load-buffer', '-'] + let s:paste['+'] = ['tmux', 'save-buffer', '-'] let s:copy['*'] = s:copy['+'] let s:paste['*'] = s:paste['+'] return 'tmux' @@ -169,16 +178,15 @@ function! s:clipboard.set(lines, regtype, reg) abort let s:selections[a:reg] = copy(s:selection) let selection = s:selections[a:reg] let selection.data = [a:lines, a:regtype] - let argv = split(s:copy[a:reg], " ") - let selection.argv = argv + let selection.argv = s:copy[a:reg] let selection.detach = s:cache_enabled let selection.cwd = "/" - let jobid = jobstart(argv, selection) + let jobid = jobstart(selection.argv, selection) if jobid > 0 call jobsend(jobid, a:lines) call jobclose(jobid, 'stdin') " xclip does not close stdout when receiving input via stdin - if argv[0] ==# 'xclip' + if selection.argv[0] ==# 'xclip' call jobclose(jobid, 'stdout') endif let selection.owner = jobid diff --git a/runtime/autoload/provider/node.vim b/runtime/autoload/provider/node.vim index c5d5e87729..17b6137816 100644 --- a/runtime/autoload/provider/node.vim +++ b/runtime/autoload/provider/node.vim @@ -48,14 +48,15 @@ function! provider#node#can_inspect() abort endfunction function! provider#node#Detect() abort + let minver = [6, 0] if exists('g:node_host_prog') - return expand(g:node_host_prog) + return [expand(g:node_host_prog), ''] endif if !executable('node') - return '' + return ['', 'node not found (or not executable)'] endif - if !s:is_minimum_version(v:null, 6, 0) - return '' + if !s:is_minimum_version(v:null, minver[0], minver[1]) + return ['', printf('node version %s.%s not found', minver[0], minver[1])] endif let npm_opts = {} @@ -75,7 +76,7 @@ function! provider#node#Detect() abort if has('unix') let yarn_default_path = $HOME . '/.config/yarn/global/' . yarn_opts.entry_point if filereadable(yarn_default_path) - return yarn_default_path + return [yarn_default_path, ''] endif endif let yarn_opts.job_id = jobstart('yarn global dir', yarn_opts) @@ -85,18 +86,18 @@ function! provider#node#Detect() abort if !empty(npm_opts) let result = jobwait([npm_opts.job_id]) if result[0] == 0 && npm_opts.result != '' - return npm_opts.result + return [npm_opts.result, ''] endif endif if !empty(yarn_opts) let result = jobwait([yarn_opts.job_id]) if result[0] == 0 && yarn_opts.result != '' - return yarn_opts.result + return [yarn_opts.result, ''] endif endif - return '' + return ['', 'failed to detect node'] endfunction function! provider#node#Prog() abort @@ -142,7 +143,7 @@ endfunction let s:err = '' -let s:prog = provider#node#Detect() +let [s:prog, s:_] = provider#node#Detect() let g:loaded_node_provider = empty(s:prog) ? 1 : 2 if g:loaded_node_provider != 2 diff --git a/runtime/autoload/provider/perl.vim b/runtime/autoload/provider/perl.vim index 36ca2bbf14..24f2b018bb 100644 --- a/runtime/autoload/provider/perl.vim +++ b/runtime/autoload/provider/perl.vim @@ -5,15 +5,25 @@ endif let s:loaded_perl_provider = 1 function! provider#perl#Detect() abort - " use g:perl_host_prof if set or check if perl is on the path + " use g:perl_host_prog if set or check if perl is on the path let prog = exepath(get(g:, 'perl_host_prog', 'perl')) if empty(prog) - return '' + return ['', ''] + endif + + " if perl is available, make sure we have 5.22+ + call system([prog, '-e', 'use v5.22']) + if v:shell_error + return ['', 'Perl version is too old, 5.22+ required'] endif " if perl is available, make sure the required module is available call system([prog, '-W', '-MNeovim::Ext', '-e', '']) - return v:shell_error ? '' : prog + if v:shell_error + return ['', '"Neovim::Ext" cpan module is not installed'] + endif + + return [prog, ''] endfunction function! provider#perl#Prog() abort @@ -46,7 +56,7 @@ function! provider#perl#Call(method, args) abort if !exists('s:host') try - let s:host = remote#host#Require('perl') + let s:host = remote#host#Require('legacy-perl-provider') catch let s:err = v:exception echohl WarningMsg @@ -58,12 +68,16 @@ function! provider#perl#Call(method, args) abort return call('rpcrequest', insert(insert(a:args, 'perl_'.a:method), s:host)) endfunction -let s:err = '' -let s:prog = provider#perl#Detect() +let [s:prog, s:err] = provider#perl#Detect() let g:loaded_perl_provider = empty(s:prog) ? 1 : 2 if g:loaded_perl_provider != 2 let s:err = 'Cannot find perl or the required perl module' endif -call remote#host#RegisterPlugin('perl-provider', 'perl', []) + +" The perl provider plugin will run in a separate instance of the perl +" host. +call remote#host#RegisterClone('legacy-perl-provider', 'perl') +call remote#host#RegisterPlugin('legacy-perl-provider', 'ScriptHost.pm', []) + diff --git a/runtime/autoload/provider/ruby.vim b/runtime/autoload/provider/ruby.vim index f843050df9..1f49c623ac 100644 --- a/runtime/autoload/provider/ruby.vim +++ b/runtime/autoload/provider/ruby.vim @@ -5,7 +5,8 @@ endif let g:loaded_ruby_provider = 1 function! provider#ruby#Detect() abort - return s:prog + let e = empty(s:prog) ? 'missing ruby or ruby-host' : '' + return [s:prog, e] endfunction function! provider#ruby#Prog() abort |