aboutsummaryrefslogtreecommitdiff
path: root/runtime/plugin/rplugin.vim
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/plugin/rplugin.vim')
-rw-r--r--runtime/plugin/rplugin.vim75
1 files changed, 62 insertions, 13 deletions
diff --git a/runtime/plugin/rplugin.vim b/runtime/plugin/rplugin.vim
index b4b03032b3..122d8d47f8 100644
--- a/runtime/plugin/rplugin.vim
+++ b/runtime/plugin/rplugin.vim
@@ -1,16 +1,65 @@
if exists('g:loaded_remote_plugins')
finish
endif
-let g:loaded_remote_plugins = 1
-
-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
+let g:loaded_remote_plugins = '/path/to/manifest'
+
+" 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 dest = stdpath('data')
+ if !empty(dest)
+ if !isdirectory(dest)
+ call mkdir(dest, 'p', 0700)
+ endif
+ let manifest_base = dest
+ endif
+
+ return manifest_base.'/rplugin.vim'
+endfunction
+
+" Old manifest file based on known script locations.
+function! s:GetOldManifestPaths() abort
+ let prefix = exists('$MYVIMRC')
+ \ ? $MYVIMRC
+ \ : matchstr(get(split(execute('scriptnames'), '\n'), 0, ''), '\f\+$')
+ let origpath = fnamemodify(expand(prefix, 1), ':h')
+ \.'/.'.fnamemodify(prefix, ':t').'-rplugin~'
+ if !has('win32')
+ return [origpath]
+ endif
+ " Windows used to use $APPLOCALDATA/nvim but stdpath('data') is
+ " $XDG_DATA_DIR/nvim-data
+ let pseudostdpath = exists('$LOCALAPPDATA') ? '$LOCALAPPDATA' : '~/AppData/Local'
+ let pseudostdpath = fnamemodify(expand(pseudostdpath), ':p')
+ return [substitute(pseudostdpath, '[/\\]\=$', '/', '') . 'nvim/rplugin.vim', origpath]
+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.
+ for old_manifest in s:GetOldManifestPaths()
+ if filereadable(old_manifest)
+ call rename(old_manifest, manifest)
+ break
+ endif
+ endfor
+ endif
+ return manifest
+endfunction
+
+function! s:LoadRemotePlugins() abort
+ let g:loaded_remote_plugins = s:GetManifest()
+ if filereadable(g:loaded_remote_plugins)
+ execute 'source' fnameescape(g:loaded_remote_plugins)
+ endif
+endfunction
+
+command! -bar UpdateRemotePlugins call remote#host#UpdateRemotePlugins()
+
+call s:LoadRemotePlugins()