❤️

最近、neovimでFlutter開発することが幸せです

2022/02/26に公開2

vimのFlutter開発環境はずっとバギーな印象で、3年前は「vimで構築するFlutter開発環境はバギー。VSCodeを使いましょう」という話をチョロっとQiitaに書いたりもするぐらいだったのですが、最近は割と安定してきたんじゃないかなと思うので、この頃の幸せneovim x Flutter開発環境をまとめたいと思います。

開発風景

※この記事はneovimに依存しています。純正vimを使いたい人ごめんなさい。以下、vimと言ったらneovimのことを指します

vimの初期設定

Flutter開発環境にフォーカスしたいため、vimのインストール〜プラグインの導入までは割愛したいと思います。
私はPlugを使っています。

LSPクライアントは何にする?

Flutterは公式がdart-analyzerというLSPサーバを提供しています。
これをvimから扱うためにLSPクライアントが必要ですが、ここで安定性や性能、設定の難易度が変わってくるので大事な決断です。

cocは便利…でも

今メジャーなものは coccoc-flutter でしょうか。
多機能で設定も簡単なため、ひとまずこれを選んでおけばある程度は開発ができると思います。
ですが、私の環境ではたびたび不安定な挙動をしたりメモリをひたすら食い潰す時がありました。(これは開発するプロジェクト構成との相性もあるのかなと思います)
また、「cocを使い始めると全部cocになる」「これはvimじゃなくてもはやcoc」というcocの多機能さゆえのvimmerとしての葛藤も、開発体験を下げる要因となりました。
(実際、プラグイン管理や設定もcoc-settings.jsoninit.vimで二重管理になってしまったり、そもそも外部依存がデカいという問題が気になります)

nvim-lsp

そこで、nvim-lsp というneovimに標準搭載のLSPクライアントを使いました。
機能としてキチンとリリースされたのがここ最近なので、まだ試してない方も多いかもしれません。
結果的に、nvim-lsp と flutter-tools の組み合わせで割と安定した開発環境を構築できました。

必要なプラグインは

です。それぞれ、公式のGetting Startedに従って設定を記述することで動くようになると思います。
(luaで書いていくので初めは戸惑いますが、慣れるとVimScriptより幸福度が高いです)

flutter-tools&LSPの各種機能

他にも、flutter pub getflutter runの実行、hot reload、エミュレータの立ち上げなど必要な機能は一通り揃っている印象です。(CLI操作が好きなので個人的にはあまり使ってないですが…)
また、dartのLSPに元々便利なrename機能やcode actionsが揃ってるので、これらも活用できます。
coc依存を排除することができ、幸せなFlutter開発環境が整いました。

プラスアルファ

これはFlutter開発環境とは直接関係ないですが、LSP関連で入れておくと幸せなプラグイン達です

  • nvim-lsp-installer: 色々な言語のLSP設定を、UIからサクッと導入できます。dartはflutter-toolsがよしなに入れてくれるので、他の言語を触る人にはこちらも導入をオススメします
  • lspkind-vim: 補完にアイコンを表示して華やか〜にしてくれます。アイコンを多用するとモダンvim感が増して良いですね
  • cmp-vsnip: スニペット。StatelessWidgetやStatefulWidget、riverpodのProvider、EdgeInsets、テストケースのテンプレなどを登録してます。モブプロとかで驚かれます
  • lsp-status: ステータスラインに、「Analyzing...」などLSPの状態を表示できます

おわりに

neovim x Flutterで幸せ開発体験、始めませんか。
他にも紹介したいプラグインがたくさんあったのですが、今回はFlutter関連のみということでまた別の機会に…。

元ネタのdotfiles: https://github.com/mj-hd/dotfiles/tree/75450d4f88bf7e06b7ed791b7f8a442726f57a93/nvim

Discussion

yokoyoko

今メジャーなものは coc と coc-flutter でしょうか。
多機能で設定も簡単なため、ひとまずこれを選んでおけばある程度は開発ができると思います。
ですが、私の環境ではたびたび不安定な挙動をしたりメモリをひたすら食い潰す時がありました。

不安定な挙動、自分もcoc使っていた頃に全く同じ問題にぶつかっていたので(ジャンプが遅すぎる・linterが不安定など)脱cocしてから幸せになりました!☺️
割と大規模なプロジェクトとはcocは相性が悪いのですかね

他の方の選択肢の参考までに、自分の環境では以下の構成でFlutterぬるぬるコーディングが出来るようになりました

mjhdmjhd

いいですね、特にddcは私も気になっていたので、ぜひ使用感教えてください!