Emacs で deno のコード補完を有効化する

Posted on
emacs deno typescript yarn rust language-server

Emacs で Deno

最近 Rust で色々 CLI ツールを作って遊んでいるのですが、そのつながりで Rust で書かれた javascript ランタイムであるDenoの Getting started をちまちまやっていました。

言語は Typescript なので Emacs のTideでコード自動補完を有効化していたのですが、Deno での import 方法が対応していません。

import { serve } from "https://deno.land/std@v0.42.0/http/server.ts";
// ↑ここで [An import path cannot end with a '. ts'extension.]
// もちろんインポートしたモジュールの自動補完も不可。

tsconfig.ts の編集で解決

【deno】「An import path cannot end with a ‘. ts’extension.」のエラーを回避する方法

上記の記事で大体問題無いんですが、ディレクトリ指定が Linux のものになっていたりするので Mac 用に補足しつつまとめます。

yarntypescript-deno-pluginをプロジェクトに追加

$ cd /path/to/my/deno/project
$ yarn add -D typescript-deno-plugin typescript

tsconfig.json に下記の記述を追加

{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "deno": ["<deno の型定義ファイル(deno.d.ts)への相対パス>"],
      "https://*": [
        "<http でインストールしたパッケージのキャッシュディレクトリへの相対パス>"
      ],
      "http://*": [
        "<https でインストールしたパッケージのキャッシュディレクトリへの相対パス>"
      ]
    },
    "plugins": [
        { "name": "typescrip-deno-plugin" }
    ]
  }
}

キャッシュディレクトリは OS 毎に異なりますので注意です(参考)。

Linux Windows MacOS
${HMOE}/.cache/deno C:\Users%USERNAME%\AppData\Local\deno $HOME/Library/Caches/deno

ここでは各環境の deno キャッシュディレクトリをCACHE_DIRとします。

  • deno の型定義ファイルへの相対パス

    ${CACHE_DIR}/lib.deno.d.ts

  • http でインストールしたパッケージへの相対パス

    ${CACHE_DIR}/deno/deps/http/*

  • https でインストールしたパッケージへの相対パス

    ${CACHE_DIR}/deno/deps/https/*

特に相対パスの指定については間違えないように注意。記述後バッファを再読み込み(or Emacs 再起動)等をするときちんと反映されると思います。

一発で設定してくれる CLI ツール作った

やっぱり相対指定めんどくせー!てなったので、環境依存をクリアしつつ tsconfig.json の設定と yarn add してくれるパッケージを作りました。

deno-ls-init

Rust で書いたので今の所cargoからのインストールのみ対応しています。

# deno-ls-init のインストール
$ cargo install deno-ls-init
# プロジェクトフォルダに移動
$ cd /path/to/your/deno/project
# deno 用の設定を実行
$ denolsinit

元からtsconfig.jsonがあっても既存部分は書き換えないのでご安心くださいませ。ただ、Mac でしかテストしていないので Windows とか Linux で動作おかしかったら issue とかでお願いします。

doom emacs で deno 対応