mirror of
https://github.com/neovim/neovim.git
synced 2024-12-20 03:05:11 -07:00
runtime: rplugin manifest written to $XDG_DATA_HOME
Uses $NVIM_RPLUGIN_MANIFEST if available
This commit is contained in:
parent
dfb6a5133b
commit
01e33e1c74
@ -118,7 +118,38 @@ function! remote#host#RegisterPlugin(host, path, specs) abort
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:GetManifest() abort
|
||||
" Get the path to the rplugin manifest file.
|
||||
function! s:GetManifestPath() abort
|
||||
let manifest_base = ''
|
||||
|
||||
if exists('$NVIM_RPLUGIN_MANIFEST')
|
||||
return fnamemodify($NVIM_RPLUGIN_MANIFEST, ':p')
|
||||
endif
|
||||
|
||||
let preferred = has('win32')
|
||||
\ ? ['$LOCALAPPDATA', '~/AppData/Local']
|
||||
\ : ['$XDG_DATA_HOME', '~/.local/share']
|
||||
|
||||
for dest in preferred
|
||||
if dest[0] == '$' && !exists(dest)
|
||||
continue
|
||||
endif
|
||||
|
||||
let dest = fnamemodify(expand(dest), ':p')
|
||||
if !empty(dest) && isdirectory(dest)
|
||||
let dest .= 'nvim/'
|
||||
call mkdir(dest, 'p', 700)
|
||||
let manifest_base = dest
|
||||
break
|
||||
endif
|
||||
endfor
|
||||
|
||||
return manifest_base.'rplugin.vim'
|
||||
endfunction
|
||||
|
||||
|
||||
" Old manifest file based on known script locations.
|
||||
function! s:GetOldManifestPath() abort
|
||||
let prefix = exists('$MYVIMRC')
|
||||
\ ? $MYVIMRC
|
||||
\ : matchstr(get(split(execute('scriptnames'), '\n'), 0, ''), '\f\+$')
|
||||
@ -127,9 +158,25 @@ function! s:GetManifest() abort
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:GetManifest() abort
|
||||
let manifest = s:GetManifestPath()
|
||||
|
||||
if !filereadable(manifest)
|
||||
" Check if an old manifest file exists and move it to the new location.
|
||||
let old_manifest = s:GetOldManifestPath()
|
||||
if filereadable(old_manifest)
|
||||
call rename(old_manifest, manifest)
|
||||
endif
|
||||
endif
|
||||
|
||||
return manifest
|
||||
endfunction
|
||||
|
||||
|
||||
function! remote#host#LoadRemotePlugins() abort
|
||||
if filereadable(s:GetManifest())
|
||||
exe 'source '.s:GetManifest()
|
||||
let manifest = s:GetManifest()
|
||||
if filereadable(manifest)
|
||||
execute 'source' fnameescape(manifest)
|
||||
endif
|
||||
endfunction
|
||||
|
||||
@ -202,7 +249,7 @@ function! remote#host#UpdateRemotePlugins() abort
|
||||
endif
|
||||
endfor
|
||||
call writefile(commands, s:GetManifest())
|
||||
echomsg printf('remote/host: generated the manifest file in "%s"',
|
||||
echomsg printf('remote/host: generated rplugin manifest: %s',
|
||||
\ s:GetManifest())
|
||||
endfunction
|
||||
|
||||
|
@ -93,22 +93,22 @@ approach with |rpcnotify()|, meaning return values or exceptions raised in the
|
||||
handler function are ignored.
|
||||
|
||||
To test the above plugin, it must be saved in "rplugin/python" in a
|
||||
'runtimepath' directory (~/.config/nvim/rplugin/python/limit.py for example).
|
||||
Then, the remote plugin manifest must be generated with
|
||||
`:UpdateRemotePlugins`.
|
||||
'runtimepath' directory (~/.config/nvim/rplugin/python/limit.py for example).
|
||||
Then, the remote plugin manifest must be generated with
|
||||
|:UpdateRemotePlugins|.
|
||||
|
||||
==============================================================================
|
||||
4. Remote plugin manifest *remote-plugin-manifest*
|
||||
*:UpdateRemotePlugins*
|
||||
|
||||
Just installing remote plugins to "rplugin/{host}" isn't enough for them to be
|
||||
automatically loaded when required. You must execute `:UpdateRemotePlugins`
|
||||
automatically loaded when required. You must execute |:UpdateRemotePlugins|
|
||||
every time a remote plugin is installed, updated, or deleted.
|
||||
|
||||
`:UpdateRemotePlugins` generates the remote plugin manifest, a special
|
||||
|:UpdateRemotePlugins| generates the remote plugin manifest, a special
|
||||
Vimscript file containing declarations for all Vimscript entities
|
||||
(commands/autocommands/functions) defined by all remote plugins, with each
|
||||
entity associated with the host and plugin path. The manifest is a generated
|
||||
extension to the user's vimrc (it even has the vimrc filename prepended).
|
||||
entity associated with the host and plugin path.
|
||||
|
||||
Manifest declarations are just calls to the `remote#host#RegisterPlugin`
|
||||
function, which takes care of bootstrapping the host as soon as the declared
|
||||
@ -125,10 +125,20 @@ the example, say the Java plugin is a semantic completion engine for Java code.
|
||||
If it defines the autocommand "BufEnter *.java", then the Java host is spawned
|
||||
only when Nvim loads a buffer matching "*.java".
|
||||
|
||||
If the explicit call to `:UpdateRemotePlugins` seems incovenient, try to see it
|
||||
If the explicit call to |:UpdateRemotePlugins| seems incovenient, try to see it
|
||||
like this: It's a way to provide IDE capabilities in Nvim while still keeping
|
||||
it fast and lightweight for general use. It's also analogous to the |:helptags|
|
||||
command.
|
||||
|
||||
Unless a path is set in the `$NVIM_RPLUGIN_MANIFEST` environment variable, the
|
||||
manifest will be written to a file named `rplugin.vim` in one of the following
|
||||
directories:
|
||||
|
||||
Unix ~
|
||||
$XDG_DATA_HOME/nvim/ or ~/.local/share/nvim/
|
||||
|
||||
Windows ~
|
||||
$LOCALAPPDATA/nvim/ or ~/AppData/Local/nvim/
|
||||
|
||||
==============================================================================
|
||||
vim:tw=78:ts=8:noet:ft=help:norl:
|
||||
|
Loading…
Reference in New Issue
Block a user