Vim as Java IDE
Tags: vim, programming, java, debugging
Published: 2020-11-02 18:02:36

---
title: Vim as Java IDE
published: true
tags: vim, programming, java, debugging
---

Yes I know. Vim is not an IDE, it is a text editor. And the original use case of vim is not to be a full blown IDE. But the plugin possibilities and plugin Landscape is so universal, that people invest the time and wrote language server integrations. `nvim`, a fork of vim, includes the language server support out of the box.

But what are the expectation of an IDE. 
What comes in my mind is: Autocompletion, managing imports, go to definition/implementation/references formatting and debugging as well. Syntax highlighting as well of course. 

I think, the most known Plugin for auto completions and language server integration is [coc-vim](https://github.com/neoclide/coc.nvim). But it has the drawback, that it implements an own plugin manager and ecosystem, where you have to install the language-servers which you want to use. The coc plugin which I have installed are:

```
"coc-java": ">=1.4.12",
"coc-java-debug": ">=0.1.4",
```
To install:

```
:CocInstall coc-java
:CocInstall coc-java-debug
```
It covers auto-completion, import management and the "go to" stuff to navigate trough your code structure. 

The debug part is covered by [vimspector](https://github.com/puremourning/vimspector) and with the [coc-java-debug](https://github.com/dansomething/coc-java-debug) extension. I don't want to go in detail how to use both extensions because I don't use the standard mappings, but if you are following the readme then Vim will be near to an IDE. 

In Addition: to run my tests or start the debug process, I have some key bindings which make it easier. 

```vim

" start the mvn build in a tmux pane with debug flag an the current buffer as filter parameter 
" [vimux](https://github.com/benmills/vimux) is a plugin for tmux user to interact better between tmux and vim
" I just use it to kick of my maven build in debugmode with the actual Testclass
noremap <leader>ds :VimuxRunCommand "mvn -Dmaven.surefire.debug  -Dtest=".expand("%:t:r")." test --offline"<CR>

" runs mvn test with the current buffer name a filter parameter.  
noremap <leader>rs :call RunMvnThisTest(expand("%:t:r"))<CR>

" runs all tests, but catch the output and open a new buffer with the result of the mvn build
noremap <leader>rS :call RunMvnTest()<CR>

```
You can see the implementation of the vim function [here](https://github.com/mafflerbach/dotfiles/blob/playground/vim/functions.vim).
When I am starting the Debug mode, I am using 

```vim
" after starting in debug mode, the build will stuck and waiting for the attaching debugger. 
map <leader>at :CocCommand java.debug.vimspector.start<CR>
```
to attach to the debugger and switch to the vimpector tab.

But you have to remember that you need in your project root a `.vimspector.json` with following content:

```javascript
{
  "adapters": {
    "java-debug-server": {
      "name": "vscode-java",
      "port": "${AdapterPort}"
    }
  },
  "configurations": {
    "Java Attach": {
      "adapter": "java-debug-server",
      "configuration": {
        "request": "attach",
        "host": "127.0.0.1",
        "port": "5005"
      },
      "breakpoints": {
        "exception": {
          "caught": "N",
          "uncaught": "N"
        }
      }
    }
  }
}
```