Skip to content

Using fvm on Emacs lsp-dart

重い腰を上げて fvm をしっかり使うようにしました.

ちなみに似たような雰囲気のある issue があり,snap で Dart をインストールした場合に sdk-dir を認識できていないような感じです.

SDKs can’t be located if you installed using snap on Ubuntu 20.04 · Issue #107 · emacs-lsp/lsp-dart

fvm を利用する際もシステムの dart と fvm dart とうまい感じに区別できないようです. lisp よくわからんけどコードをぱっと見た感じ lsp-dart-get-sdk-dir と lsp-dart-get-flutter-sdk-dir を fvm を考慮した感じに直せば良さそうです.

ということでまずは lsp-dart-get-sdk-dir です. fvm use を実行してプロジェクトディレクトリに .fvm がある場合はそちらを無い場合は fvm global の dart-sdk dir を見に行くようにします. flutter プロジェクトじゃない場合は普通の dart を見に行きます.

(defun my/lsp-dart-get-sdk-dir ()
(or lsp-dart-sdk-dir
(when (lsp-dart-flutter-project-p)
(let* ((dart-sdk (expand-file-name "bin/cache/dart-sdk/" (lsp-dart-get-flutter-sdk-dir)))
(fvm-bin (executable-find "fvm"))
(fvm-default-dart-sdk (expand-file-name "fvm/default/bin/cache/dart-sdk/" (getenv "HOME")))
(fvm-project-dart-sdk (expand-file-name ".fvm/flutter_sdk/bin/cache/dart-sdk/" (lsp-dart-get-project-root))))
(if (file-exists-p fvm-bin)
(if (file-exists-p fvm-project-dart-sdk)
fvm-project-dart-sdk
fvm-default-dart-sdk)
(if (file-exists-p dart-sdk)
dart-sdk
(error "Dart SDK not found inside flutter cache dir %s. Consider setting `lsp-dart-sdk-dir` variable" dart-sdk)))))
(-some-> (executable-find "dart")
file-truename
(locate-dominating-file "bin")
file-truename)))

次に lsp-dart-get-flutter-sdk-dir です. こちらも lsp-dart-get-sdk-dir と同じで,fvm がある場合はそちらの方を見に行くようにしています.

(defun my/lsp-dart-get-flutter-sdk-dir ()
(or lsp-dart-flutter-sdk-dir
(let* ((fvm-bin (executable-find "fvm"))
(fvm-default-flutter-sdk (expand-file-name "fvm/default" (getenv "HOME")))
(fvm-project-flutter-sdk (expand-file-name ".fvm/flutter_sdk/bin" (lsp-dart-get-project-root))))
(if (file-exists-p fvm-project-flutter-sdk)
fvm-project-flutter-sdk
fvm-default-flutter-sdk))
(-some-> (executable-find lsp-dart-flutter-executable)
file-truename
(locate-dominating-file "bin")
file-truename)))

lisp はすべて雰囲気で書きましたが,とりあえずちゃんと動いているので良さそうです.