mirror of
https://github.com/neovim/neovim.git
synced 2025-11-07 19:24:25 +00:00
rplugin: Initialize remote plugins lazily. #4384
This commit is contained in:
committed by
Justin M. Keyes
parent
e7485ab1c9
commit
bb020df0f5
@@ -5,6 +5,37 @@ endif
|
|||||||
|
|
||||||
let s:loaded_pythonx_provider = 1
|
let s:loaded_pythonx_provider = 1
|
||||||
|
|
||||||
|
function! provider#pythonx#Require(host) abort
|
||||||
|
let ver = (a:host.orig_name ==# 'python') ? 2 : 3
|
||||||
|
|
||||||
|
" Python host arguments
|
||||||
|
let args = ['-c', 'import sys; sys.path.remove(""); import neovim; neovim.start_host()']
|
||||||
|
|
||||||
|
" Collect registered Python plugins into args
|
||||||
|
let python_plugins = remote#host#PluginsForHost(a:host.name)
|
||||||
|
for plugin in python_plugins
|
||||||
|
call add(args, plugin.path)
|
||||||
|
endfor
|
||||||
|
|
||||||
|
try
|
||||||
|
let channel_id = rpcstart((ver == '2' ?
|
||||||
|
\ provider#python#Prog() : provider#python3#Prog()), args)
|
||||||
|
if rpcrequest(channel_id, 'poll') == 'ok'
|
||||||
|
return channel_id
|
||||||
|
endif
|
||||||
|
catch
|
||||||
|
echomsg v:throwpoint
|
||||||
|
echomsg v:exception
|
||||||
|
endtry
|
||||||
|
throw 'Failed to load '. a:host.orig_name . ' host. '.
|
||||||
|
\ 'You can try to see what happened '.
|
||||||
|
\ 'by starting Neovim with the environment variable '.
|
||||||
|
\ '$NVIM_PYTHON_LOG_FILE set to a file and opening '.
|
||||||
|
\ 'the generated log file. Also, the host stderr will be available '.
|
||||||
|
\ 'in Neovim log, so it may contain useful information. '.
|
||||||
|
\ 'See also ~/.nvimlog.'
|
||||||
|
endfunction
|
||||||
|
|
||||||
function! provider#pythonx#Detect(major_ver) abort
|
function! provider#pythonx#Detect(major_ver) abort
|
||||||
let host_var = (a:major_ver == 2) ?
|
let host_var = (a:major_ver == 2) ?
|
||||||
\ 'g:python_host_prog' : 'g:python3_host_prog'
|
\ 'g:python_host_prog' : 'g:python3_host_prog'
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ let s:hosts = {}
|
|||||||
let s:plugin_patterns = {}
|
let s:plugin_patterns = {}
|
||||||
let s:remote_plugins_manifest = fnamemodify(expand($MYVIMRC, 1), ':h')
|
let s:remote_plugins_manifest = fnamemodify(expand($MYVIMRC, 1), ':h')
|
||||||
\.'/.'.fnamemodify($MYVIMRC, ':t').'-rplugin~'
|
\.'/.'.fnamemodify($MYVIMRC, ':t').'-rplugin~'
|
||||||
|
let s:plugins_for_host = {}
|
||||||
|
|
||||||
|
|
||||||
" Register a host by associating it with a factory(funcref)
|
" Register a host by associating it with a factory(funcref)
|
||||||
@@ -35,6 +36,9 @@ endfunction
|
|||||||
|
|
||||||
" Get a host channel, bootstrapping it if necessary
|
" Get a host channel, bootstrapping it if necessary
|
||||||
function! remote#host#Require(name) abort
|
function! remote#host#Require(name) abort
|
||||||
|
if empty(s:hosts)
|
||||||
|
call remote#host#LoadRemotePlugins()
|
||||||
|
endif
|
||||||
if !has_key(s:hosts, a:name)
|
if !has_key(s:hosts, a:name)
|
||||||
throw 'No host named "'.a:name.'" is registered'
|
throw 'No host named "'.a:name.'" is registered'
|
||||||
endif
|
endif
|
||||||
@@ -123,6 +127,13 @@ function! remote#host#LoadRemotePlugins() abort
|
|||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
function! remote#host#LoadRemotePluginsEvent(event, pattern) abort
|
||||||
|
autocmd! nvim-rplugin
|
||||||
|
call remote#host#LoadRemotePlugins()
|
||||||
|
execute 'doautocmd' a:event a:pattern
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
function! s:RegistrationCommands(host) abort
|
function! s:RegistrationCommands(host) abort
|
||||||
" Register a temporary host clone for discovering specs
|
" Register a temporary host clone for discovering specs
|
||||||
let host_id = a:host.'-registration-clone'
|
let host_id = a:host.'-registration-clone'
|
||||||
@@ -163,7 +174,7 @@ function! s:RegistrationCommands(host) abort
|
|||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
function! s:UpdateRemotePlugins() abort
|
function! remote#host#UpdateRemotePlugins() abort
|
||||||
let commands = []
|
let commands = []
|
||||||
let hosts = keys(s:hosts)
|
let hosts = keys(s:hosts)
|
||||||
for host in hosts
|
for host in hosts
|
||||||
@@ -185,10 +196,6 @@ function! s:UpdateRemotePlugins() abort
|
|||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
command! UpdateRemotePlugins call s:UpdateRemotePlugins()
|
|
||||||
|
|
||||||
|
|
||||||
let s:plugins_for_host = {}
|
|
||||||
function! remote#host#PluginsForHost(host) abort
|
function! remote#host#PluginsForHost(host) abort
|
||||||
if !has_key(s:plugins_for_host, a:host)
|
if !has_key(s:plugins_for_host, a:host)
|
||||||
let s:plugins_for_host[a:host] = []
|
let s:plugins_for_host[a:host] = []
|
||||||
@@ -199,38 +206,8 @@ endfunction
|
|||||||
|
|
||||||
" Registration of standard hosts
|
" Registration of standard hosts
|
||||||
|
|
||||||
" Python/Python3 {{{
|
" Python/Python3
|
||||||
function! s:RequirePythonHost(host) abort
|
call remote#host#Register('python', '*.py',
|
||||||
let ver = (a:host.orig_name ==# 'python') ? 2 : 3
|
\ function('provider#pythonx#Require'))
|
||||||
|
call remote#host#Register('python3', '*.py',
|
||||||
" Python host arguments
|
\ function('provider#pythonx#Require'))
|
||||||
let args = ['-c', 'import sys; sys.path.remove(""); import neovim; neovim.start_host()']
|
|
||||||
|
|
||||||
" Collect registered Python plugins into args
|
|
||||||
let python_plugins = remote#host#PluginsForHost(a:host.name)
|
|
||||||
for plugin in python_plugins
|
|
||||||
call add(args, plugin.path)
|
|
||||||
endfor
|
|
||||||
|
|
||||||
try
|
|
||||||
let channel_id = rpcstart((ver == '2' ?
|
|
||||||
\ provider#python#Prog() : provider#python3#Prog()), args)
|
|
||||||
if rpcrequest(channel_id, 'poll') == 'ok'
|
|
||||||
return channel_id
|
|
||||||
endif
|
|
||||||
catch
|
|
||||||
echomsg v:throwpoint
|
|
||||||
echomsg v:exception
|
|
||||||
endtry
|
|
||||||
throw 'Failed to load '. a:host.orig_name . ' host. '.
|
|
||||||
\ 'You can try to see what happened '.
|
|
||||||
\ 'by starting Neovim with the environment variable '.
|
|
||||||
\ '$NVIM_PYTHON_LOG_FILE set to a file and opening '.
|
|
||||||
\ 'the generated log file. Also, the host stderr will be available '.
|
|
||||||
\ 'in Neovim log, so it may contain useful information. '.
|
|
||||||
\ 'See also ~/.nvimlog.'
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
call remote#host#Register('python', '*.py', function('s:RequirePythonHost'))
|
|
||||||
call remote#host#Register('python3', '*.py', function('s:RequirePythonHost'))
|
|
||||||
" }}}
|
|
||||||
|
|||||||
@@ -1,5 +1,16 @@
|
|||||||
if exists('g:loaded_remote_plugins') || &cp
|
if exists('g:loaded_remote_plugins')
|
||||||
finish
|
finish
|
||||||
endif
|
endif
|
||||||
let g:loaded_remote_plugins = 1
|
let g:loaded_remote_plugins = 1
|
||||||
call remote#host#LoadRemotePlugins()
|
|
||||||
|
command! UpdateRemotePlugins call remote#host#UpdateRemotePlugins()
|
||||||
|
|
||||||
|
augroup nvim-rplugin
|
||||||
|
autocmd!
|
||||||
|
autocmd FuncUndefined *
|
||||||
|
\ call remote#host#LoadRemotePluginsEvent(
|
||||||
|
\ 'FuncUndefined', expand('<amatch>'))
|
||||||
|
autocmd CmdUndefined *
|
||||||
|
\ call remote#host#LoadRemotePluginsEvent(
|
||||||
|
\ 'CmdUndefined', expand('<amatch>'))
|
||||||
|
augroup END
|
||||||
|
|||||||
Reference in New Issue
Block a user