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


はじめに

「この記事は、vim8.1-2269(Neovimではない)でfortranを編集している著者が、vimにLSPを導入して快適なfortran編集環境(ついでにCやRなども)を得た」という備忘録です。

調査&導入のきっかけ

2020年中頃になって、LSP(Language Server Protocol)なるものが良く話題になっていることに気付きました。LSPに気付いたきっかけは、Nvim-R のプラグインをUpdateした時、helpファイルで紹介されている補完のプラグイン候補が asyncomplete-omniになっていたことです。ちなみに、VSCodeでfortran向けの設定をする記事にもfortran-language-serverの話がありましたが、vimではないという事から、あまり意識していませんでした。asyncompleteを調べると、vim-lspや、vim-lsp-settingsなるものがあり、これらを使えばfortran環境でも簡単にLSPを導入できるのではないかと思いはじめました。

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

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

fortran-language-serverの導入

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

pip3 install fortran-language-server

vimのプラグインをインストール

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

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のソースコードを開き、

:LspInstallServer

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

スクリーンショット

組み込みモジュール名の自動補完。

組み込み型の自動補完。

自作サブルーチン名の補完。

自作ライブラリ等を利用する場合の補完について

編集しているソースと同じディレクトリに、 .fortlsというファイルを作成して配置します。(プロジェクトのルートディレクトリでも良いのかもしれませんが、試していません。)

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

上記のように、読み込みたいソースコードのディレクトリや、インクルードディレクトリを指定していれば、それらのソースから補完候補を出すことも可能です。

上の画像では/usr/local/src/other/rksuiteに置いているrksuite_90モジュールに定義されている型が補完候補として自動ポップアップされています。

アウトライン表示

LSPのコマンド:LSPDocymentSymbolを実行すると、下図の左下側の画面が出て、プログラムやサブルーチン名が表示されます。
なお、昔からvim界隈にある:Tagbarでは下図右側のような表示になります。私はあまり表示をカスタマイズしていませんので、もしかすると、どちらももっと異なる表示にできるのかもしれません。

おわりに

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