A containerised eclim
, affording us Java completion in Vim
without having to install eclipse
or eclim
.
While YouCompleteMe
(a popular
Vim plugin) provides completion for many languages, it does not provide any for
Java (unless eclim
is installed).
Rather than having to install eclipse
and eclim
manually, we can instead
copy across a few scripts, tweak our .vimrc
and be ready to go.
The Dockerfile provided builds eclim
using the Java variant of
eclipse
.
Since eclim
requires access to multiple folders (including our workspace,
which can be customised), a helper script eclimd
has been provided
to launch the instance for us.
Unlike YouCompleteMe
, this
server is only launched once, albeit manually:
$ ./eclimd [--debug]
This helper script will read the values provided in ~/.eclimrc
,
which must also be copied into our home directory:
$ cp .eclimrc ~/.eclimrc
Finally, we need a way for our vim instance to communicate with the server
(which relies on an executable provided only by eclim
).
The docker image build process modifies the vim function used to get the
eclim
command by allowing the user to set the g:EclimCommand
variable:
function! eclim#client#nailgun#GetEclimCommand(home)
" let command = a:home . 'bin/eclim'
let command = get(g:, 'EclimCommand', a:home . 'bin/eclim')
" ...
endfunction
Of course, we need some way to interact with the server from within Vim.
eclim
provides a set of *.vim
files so that we can communicate with Vim.
However, these are only bundled in one place after we have run the eclim
installer, so we cannot clone the repository via our favourite plugin manager.
Instead, we copy the bundled files from our docker container into a directory that can be loaded by our vim instance:
$ docker cp eclim:/usr/share/vim/vimfiles/eclim ~/.vim/plugged/eclim
We must also have vim
register this using a plugin manager (in this case,
vim-plug
):
call plug#begin('~/.vim/plugged')
" ...
Plug 'ervandew/eclim', { 'frozen': 1, 'for': 'java' }
let g:EclimCompletionMethod = 'omnifunc'
let g:EclimCommand = '/path/to/eclim'
" ...
call plug#end()
We set frozen
so that we do not try to update this plugin (since we manage
this manually).
Finally, we must set the g:EclimCommand
to the full path of the
eclim
wrapper script.
This affords us access to the client executable we use to interact with our
eclimd
server.
Whenever a new version is released, we must adjust the ECLIM_VERSION
variables provided in the eclimd
, eclim
and
Makefile
files.
Once we have restarted the eclimd
container, we must replace the files we
copied across into our bundled folder:
$ rm -rf ~/.vim/plugged/eclim
$ docker cp eclim:/usr/share/vim/vimfiles/eclim ~/.vim/plugged/eclim