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 はすべて雰囲気で書きましたが,とりあえずちゃんと動いているので良さそうです.