vimでJava言語用のポップアップ表示を設定する。

まずはじめに、、、私は派遣社員だ。
そのため、派遣先への面接時に、営業が同席する。
その営業が私の意見を無視して勝手に話を進めるため、あれよあれよでその派遣先が決まることがある。
派遣社員になった以上、人間を捨てているが、ちょっと勘弁して欲しい。

と言うことで、次はJava言語案件になるかもしれない。
と言うことは、Java言語を勉強し直す必要が出てきた。
しかし、Java言語関係の本は、使わないと思い、実家に置いたままだ。
仕方ないため、初学本から買い増しすることにした。
何冊何種類の初学本を買えば済むのか・・・できればKindle本を買うつもりなのだが、見にくいため、どうしても紙の本になる。
何か良い対策はないだろう。

※表題は"Java言語用"としているが、あまりJavaに関係ない。

# 本題
初学向けのプログラミングであれば、仰々しいIDEは絶対にいらない。
そんな環境構築をする暇があるならば、少しでも勉強する時間に充てたい。
如何せん。
Vimを使いこなせないため、未だにIDE並の構築が出来ていないままだった。
これを機に、[Language Server Protocol(略：LSP)](https://mattn.kaoriya.net/software/vim/20191231213507.htm)を導入しようと思う。

# LSPとは。
入力途中を自動補完などで完結してくれる機能のことだと思う。
そう思って導入することを決めた。

## 難しいことはしたくない
IDE環境を用意するのはめんどくさいので、既にインストール済みのVimにちょこっと手を加えるだけで環境構築したいと思っている。
そのため、難しいことや時間が掛かることはしたくない。
と言うことで、上記mattn氏の[導入コストを下げるプラグイン](https://qiita.com/mattn/items/e62b9f16bc487a271a7f)を使うことにした。

# 実際のLSP導入
簡単にできるとのことなので、[mattn氏](https://qiita.com/mattn)の説明通りに進めることにした。

## 前提
プラグイン管理は、[minpac](https://github.com/k-takata/minpac)を使っている。

## プラグイン導入
1行で済むのか、2行必要なのか、、、とりあえず、簡単に導入できると思っていた。

```vim:vimrc
call minpac#add('prabirshrestha/vim-lsp')
call minpac#add('mattn/vim-lsp-settings')
```

んで、exコマンドライン上で、

```ex:コマンド
call minpac#update()
```

を打ち込む。
そうすることで、プラグインが導入される。
これだけですごく便利になっている。

## 設定ファイルの書き換え
vimrcへの書き込みも必要だ。

```vim:vimrc
" ファイルの変更に伴いリアルタイムにエラー表示する機能 
let g:lsp_diagnostics_enabled = 1
let g:lsp_diagnostics_echo_cursor = 1

" 自動で入力補完ポップアップを表示する設定
let g:asyncomplete_auto_popup = 1
let g:asyncomplete_auto_completeopt = 1

" ポップアップを表示するまでのディレイ
let g:asyncomplete_popup_delay = 200

" LSP の仕様である textEdit を有効にする設定
let g:lsp_text_edit_enabled = 1

let g:lsp_signs_enabled = 1
let g:lsp_diagnostics_echo_cursor = 1
```

mattnさんは、設定ファイルを[分割](https://mattn.kaoriya.net/software/vim/20191231001537.htm)しているようだが、私はしていない。
そのため、vimrcに書き込んでいるのだが、問題ないと思っている。

### 母艦も大事
vim-lspが母艦になるようで、これを入れなければ、エラーになる。

```ex:エラー
Error detected while processing User Autocommands for "lsp_setup":
E117: Unknown function: lsp#register_server
```

![vim-lsp_Err.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82414/6cd756a4-51ca-dfc1-c51f-ec7b596b83f1.jpeg)

#### エラーは避けたい
母艦のプラグインを導入せずに作業を進めたことで、エラーになってしまった。

```ex:エラー
BufRead Autocommands for "*.java"..FileType Autocommands for "java"..function <SNR>8_vim_lsp_load_or_suggest[105]..
User Autocommands for "lsp_setup" の処理中にエラーが検出されました:
E117: 未知の関数です: lsp#register_server
```

![lsp-setup-filetype_Err.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82414/358af046-58b4-0b84-d7d0-f6f612cbc3bd.jpeg)


きちんと説明は読むようにしよう。

##### 他にも

![minpac-update_err.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82414/5122b3d7-a972-9919-29f2-efd08f01639b.jpeg)

プラグイン管理用のプラグインにエラーが発生してしまったが、これは既に[修正済み](https://github.com/k-takata/minpac/issues/1)のようだ。

## Javaファイルを開く
拡張子が*.javaになっているファイルを開く。
そして、

```ex:Exコマンド
LspInstallServer
```

![installj-eclipse-jdt-ls.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82414/3acbc115-a6c0-f83d-ec85-e4aef0f8354d.jpeg)

プログラミングファイルに応じたファイルがインストールされる仕組みになっているため、`Yes`を押下することで、インストール完了まで待てば良い。

![java-installer-jdtls.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82414/166379ae-c7c6-fdd7-c1e0-b71d30491dfd.jpeg)

完了した。

個人的に文字コードがおかしい・・・が、それは別の機会に見直そう。
UTF-8にしたはずだが・・・。

## C++言語には未対応
よく分からないが、導入できないプログラミングファイルもあるようだ。

### 拡張子.cpp
C++言語ファイルを開く

![cpp-ls-clangd.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82414/6abf05fd-922f-0764-f802-515c1d400e5f.jpeg)

導入を進められるため、素直に従った。

![install-clangd.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82414/387db0fa-09ce-763c-45aa-f5525809c509.jpeg)

当然Yesだ。

![unxz-command-not-found.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82414/10ffe236-d663-dec6-4dfc-71cf71bacca3.jpeg)

しかし、インストールに失敗した。
これは、必要なコマンドが見つからなかったかららしい。
そのため、私の環境に問題があるのかもしれないが、今はJava環境さえ整えれば良いため、先送り。


## 実際の恩恵にあずかれず。
おかしい。
自動補完が一切動かない。

[Popup](https://twitter.com/mattn_jp/status/1169058284466126849)が全く表示されない。

おかしい。

mattnさんの設定には、

```vim:vimrc
if empty(globpath(&rtp, 'autoload/lsp.vim'))
　・
　・
　・

function! s:on_lsp_buffer_enabled() abort
　・
　・
　・

augroup lsp_install
　・
　・
　・
```

が書いてあったが、これいるの？
これを記述することで、設定ファイルが崩されてしまったのだが・・・。

## 解決(ポップアップ表示)
別途プラグインが必要だった。

### asyncomplete.vim
説明が英語なので、必要な[プラグイン](https://github.com/mattn/vim-lsp-settings#asyncompletevim)とは思わなかった。

```vim:vimrc
"	オートコンプリートポップアップメニュー表示
call minpac#add('prabirshrestha/asyncomplete.vim')
"	オートコンプリートソース
call minpac#add('prabirshrestha/asyncomplete-lsp.vim')
```

この2種類が必要なようだ。

![asyncomplete.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82414/6943f972-8ee7-eb84-12c8-77e467a83c6c.jpeg)

意図していないポップアップ表示がなされ、ちょっと不快だ。
今回の例で言えば、"System"を入力したいのだが、 **S** を入力した時点で、"Saf〜ナンチャラ"が自動入力される。
無茶苦茶不便。
やりたいことは、"S"入力時点で、何も入力されず、候補をポップアップ表示して欲しい。
困る。

### asyncomplete.vim
表示方法は、[nvim](https://neovim.io)の方がよさげに見えるが・・・。
今更本体を乗り換えることはしない。


# 一応完成
上記の不満はあるが、一応は設定したと言うことにする。
まだまだJava言語の勉強をvim本体だけで完結するにはほど遠いが、今回の記事はこれで終わる。
ゆくゆくは、実行やデバッグなども出来るようにしたい。
※このポップアップ表示の設定をするためだけに今日1日潰してしまった。
あぁIDEが恋しい。

以上。