(Ubuntu 18.04) Haskellのvscode拡張を入れたときのエラーメモ

Visual Studio CodeHaskellの拡張 (Haskell Language Server) を入れたときに出たエラーについて.

基本的には,公式のReadme や,Qiitaにあった記事 に従って入れればいいのだが,ハマったのでメモ.

stackはインストールし,vscodeHaskell Language Serverの拡張は入れた状態である.

stack new project-nameをしてプロジェクトを作り,vscodeでプロジェクトフォルダを開いて,Main.hsを開いたが,型のホバーなどの機能が効かなかった.

いろいろエラーが出たので,vscodeの設定で,"languageServerHaskell.trace.server": "verbose"としてある.**

Mismatching GHC versions: Project is x.x.x, HIE is x.x.x

Mismatching GHC versions: Project is 8.6.5, HIE is 8.4.4
You may want to use hie-wrapper. Check the README for more information

みたいな警告がポップアップで出た.

これは書いてあるとおり,HIE (haskell-ide-engine) が対応しているGHCのバージョンが異なるため.

stack.yamlにあるresolverのバージョンをHIEと一致するように変更する. (resolver: lts-14.21 のような行)

なお,resolverのバージョンとGHCのバージョンの対応は,ググって確認する必要がありそう.

hie-x.x.x: Could not find $libexecdir/cabal-helper-wrapper

補完が効かないと思って,vscodeのOUTPUTウィンドウでHaskell HIEというののログを見るとhie-8.4.4: Could not find $libexecdir/cabal-helper-wrapperみたいになっていた.

hieのバージョンが古くて,cabal-helperがうまく入っていなかった?

hieの最新バージョンを再インストールして解決

余談だが,hieはvscodeの拡張やstackとは別にインストールする必要があるのを忘れていた.

あと,hieのインストールは基本的には自分でビルドしないといけなくてすごく時間がかかるので,この機会にnixパッケージマネージャを入れてみてそこから入れてみた.(参考: Nix で Haskell IDE Engine をシュッと入れる - ryota-ka's blog) バイナリのキャッシュからインストールするけど,結構なファイル数があったのでやっぱり10分以上はかかった. シェルはfishを使っていたけど,特に問題は無く環境変数など設定された.

Scheduler thread exited unexpectedly: /....hs: commitBuffer: invalid argument (invalid character)

また補完が効かないと思って,verboseで出力したログを見ると以下のようになっている.

2020-01-25 19:24:05.076241664 [ThreadId 60] - haskell-lsp:persistFileVFS: Writing virtual file: uri = NormalizedUri "file:///home/kamo/hoge/app/Main.hs", virtual file = "/tmp/haskell-lsp6455/Main.hs-00000-5661721430320145881.hs"
2020-01-25 19:24:05.076774811 [ThreadId 29] - Scheduler thread exited unexpectedly: /tmp/haskell-lsp6455/Main.hs-00000-5661721430320145881.hs: commitBuffer: invalid argument (invalid character)

原因は,Main.hs中に日本語でコメントを書いていたからだった (invalid characterとなった).

LANG=C.UTF-8としてvscodeを起動するとエラーが出なくなった. (参考: commitBuffer: invalid argument (invalid character) · Issue #793 · commercialhaskell/stack · GitHub

ja_JP.UTF-8en_US.UTF-8ではエラーになった.

変にロケールを変えるのも怖いので,とりあえずenv LANG=C.UTF-8 codeとして使うことにする.

Ghc error on cradle initialisation: "cannot satisfy -package-id <パッケージ名>-\n (use -v for more information)"

これはvscodeの右下からポップアップで出た.

stack runしてみたら出なくなった.(stack buildだけでは治らなかった気がする)