vim の fortran 向け設定 (LSPによる自動補完)

# はじめに
「この記事は、vim8.1-2269(Neovimではない)でfortranを編集している著者が、vimにLSPを導入して快適なfortran編集環境(ついでにCやRなども)を得た」という備忘録です。
## 調査&導入のきっかけ
2020年中頃になって、LSP(Language Server Protocol)なるものが良く話題になっていることに気付きました。LSPに気付いたきっかけは、[Nvim-R](https://github.com/jalvesaq/Nvim-R) のプラグインをUpdateした時、helpファイルで紹介されている補完のプラグイン候補が [asyncomplete-omni](https://github.com/yami-beta/asyncomplete-omni.vim)になっていたことです。ちなみに、VSCodeでfortran向けの設定をする[記事](https://qiita.com/implicit_none/items/d49c9fdf51c307d22819)にも[fortran-language-server](https://github.com/hansec/fortran-language-server)の話がありましたが、vimではないという事から、あまり意識していませんでした。asyncompleteを調べると、[vim-lsp](https://github.com/prabirshrestha/vim-lsp)や、[vim-lsp-settings](https://github.com/mattn/vim-lsp-settings)なるものがあり、これらを使えばfortran環境でも簡単にLSPを導入できるのではないかと思いはじめました。

#LSPによるfortran環境の導入方法

以下、実行環境はUbuntu20.04とします。

## fortran-language-serverの導入
ターミナルで、以下を実行します。(vim-lsp-settingsを導入した後に ":LspInstallServer" で自動的にfortran language serverがインストールされるかと思いましたが、私の環境では別途pip3で明示的にインストール必要がありました。)


```bash
pip3 install fortran-language-server
```

## vimのプラグインをインストール
私はVim-Plugでプラグインを管理しているので、下記を.vimrcに追記しました。ここまでは、補完したい言語に依存せず共通のようです。

```vim
all plug#begin('~/.vim/plugged')
  Plug 'prabirshrestha/asyncomplete.vim'
  Plug 'prabirshrestha/asyncomplete-lsp.vim'
  Plug 'prabirshrestha/vim-lsp'
  Plug 'mattn/vim-lsp-settings'
  Plug 'mattn/vim-lsp-icons'
call plug#end()et g:lsp_diagnostics_enabled=1
"下記は好みによって設定変更すること
let g:lsp_diagnostics_echo_cursor=1
let g:lsp_text_edit_enabled=1
let g:asyncomplete_auto_popup=1
let g:asyncomplete_popup_delay=200
```
vimユーザには釈迦に説法かと思いますが、```.bashrc```に上記を追記した後は
```:PlugInstall```します。

## fortran環境のセッティング
fortranのソースコードを開き、

```vim
:LspInstallServer
```
を入力すると、vim側のfortran環境セットアップは終わりです。

#スクリーンショット
組み込みモジュール名の自動補完。
![Screenshot from 2020-10-25 20-09-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275690/386df827-31d9-f039-8260-f54f84fea47a.png)

組み込み型の自動補完。
![Screenshot from 2020-10-25 20-09-49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275690/d9564e5a-8341-3101-2a15-e9b39c748d27.png)

自作サブルーチン名の補完。
![Screenshot from 2020-10-25 20-10-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275690/29841987-7858-9d8e-a8b6-67c80fc89ee7.png)

#自作ライブラリ等を利用する場合の補完について
編集しているソースと同じディレクトリに、 ```.fortls```というファイルを作成して配置します。（プロジェクトのルートディレクトリでも良いのかもしれませんが、試していません。）

``` :.fortls
{
  "source_dirs": ["/usr/local/src/my_packages/hoge/",
    "/usr/local/src/other/rksuite/"],
  "include_dirs": ["/usr/local/include/"]
}
```

上記のように、読み込みたいソースコードのディレクトリや、インクルードディレクトリを指定していれば、それらのソースから補完候補を出すことも可能です。
![Screenshot from 2020-10-25 20-38-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275690/05a0ff91-9aaf-5f80-3d6a-444ba473dc39.png)
上の画像では```/usr/local/src/other/rksuite```に置いているrksuite_90モジュールに定義されている型が補完候補として自動ポップアップされています。

##アウトライン表示
LSPのコマンド```:LSPDocymentSymbol```を実行すると、下図の左下側の画面が出て、プログラムやサブルーチン名が表示されます。
なお、昔からvim界隈にある```:Tagbar```では下図右側のような表示になります。私はあまり表示をカスタマイズしていませんので、もしかすると、どちらももっと異なる表示にできるのかもしれません。
![Screenshot from 2020-10-25 20-59-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275690/dcf36476-dc90-9432-5b3e-d01f51355cae.png)

#おわりに
これまで何度も「統合開発環境」なるものに挑戦しては挫折したVim利用者が、今後数年間は安心してvimで生活できることを確信したので、備忘録として残しました。
```:Termdebug```とすれば、vim内でfortran(に限らずcなども可)のDebugも実行できるので、脳と指がvimにどっぷり浸かっている筆者は、これでしばらくIDEに浮気せずに済みそうです。