重い腰を上げて 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

TLDR Solution (setq lsp-dart-sdk-dir …

github.com favicon image github.com

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