Skip to content

Commit

Permalink
Merge #5050 'rplugin manifest: default to XDG dir'
Browse files Browse the repository at this point in the history
Closes #5152
Closes #5090
  • Loading branch information
justinmk committed Aug 17, 2016
2 parents dfb6a51 + f9aa029 commit ae6db26
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 12 deletions.
6 changes: 6 additions & 0 deletions cmake/RunTests.cmake
Expand Up @@ -2,6 +2,9 @@ get_filename_component(BUSTED_DIR ${BUSTED_PRG} PATH)
set(ENV{PATH} "${BUSTED_DIR}:$ENV{PATH}")

set(ENV{VIMRUNTIME} ${WORKING_DIR}/runtime)
set(ENV{NVIM_RPLUGIN_MANIFEST} ${WORKING_DIR}/Xtest_rplugin_manifest)
set(ENV{XDG_CONFIG_HOME} ${WORKING_DIR}/Xtest_xdg/config)
set(ENV{XDG_DATA_HOME} ${WORKING_DIR}/Xtest_xdg/share)

if(NVIM_PRG)
set(ENV{NVIM_PROG} "${NVIM_PRG}")
Expand Down Expand Up @@ -34,6 +37,9 @@ execute_process(
RESULT_VARIABLE res
${EXTRA_ARGS})

file(REMOVE ${WORKING_DIR}/Xtest_rplugin_manifest)
file(REMOVE_RECURSE ${WORKING_DIR}/Xtest_xdg)

if(NOT res EQUAL 0)
message(STATUS "Output to stderr:\n${err}")
message(FATAL_ERROR "Running ${TEST_TYPE} tests failed with error: ${res}.")
Expand Down
49 changes: 45 additions & 4 deletions runtime/autoload/remote/host.vim
Expand Up @@ -118,7 +118,32 @@ 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 dest = has('win32') ? '$LOCALAPPDATA' : '$XDG_DATA_HOME'
if !exists(dest)
let dest = has('win32') ? '~/AppData/Local' : '~/.local/share'
endif

let dest = fnamemodify(expand(dest), ':p')
if !empty(dest) && !filereadable(dest)
let dest .= ('/' ==# dest[-1:] ? '' : '/') . 'nvim'
call mkdir(dest, 'p', 0700)
let manifest_base = dest
endif

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\+$')
Expand All @@ -127,9 +152,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

Expand Down Expand Up @@ -202,7 +243,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

Expand Down
26 changes: 18 additions & 8 deletions runtime/doc/remote_plugin.txt
Expand Up @@ -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
Expand All @@ -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.

*$NVIM_RPLUGIN_MANIFEST*
Unless $NVIM_RPLUGIN_MANIFEST is set the manifest will be written to a file
named `rplugin.vim` at:

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:
1 change: 1 addition & 0 deletions test/functional/helpers.lua
Expand Up @@ -241,6 +241,7 @@ local function clear(...)
'ASAN_OPTIONS',
'LD_LIBRARY_PATH', 'PATH',
'NVIM_LOG_FILE',
'NVIM_RPLUGIN_MANIFEST',
}) do
env_tbl[k] = os.getenv(k)
end
Expand Down

0 comments on commit ae6db26

Please sign in to comment.