• 作成:

EmacsでTypeScriptファイルを開くときshebangでnodeが指定されていてもweb-modeで開く設定

shebangが書かれてるとweb-modeを拡張子で指定していてもjs-modeが優先される

パターン"\\.tsx?\\'"でTypeScriptコードをweb-modeで開くように設定していても、 AWS CDKなどがinitで生成するbinファイルのように、先頭に、

#!/usr/bin/env node

のようにshebangが設定されていると、 js-modeが優先されて起動してしまいます。

簡単に直せるかと思ったら多少手こずったのでメモします。

interpreterキーワードで指定

要はinterpreter-mode-alist変数をいじれば良いのですが、一々add-to-listを直接書くのはメンテナンスがだるいですよね。

なのでleafのinterpreterキーワードを使うことにします。

Emacs JP Slack で、 leafの作者である Conao3さん (@conao_3) に色々教えてもらいました。感謝です。

私はleafで式が予期されない場所に式を書く時は準クオートとクオートを続けて書くということを忘却していました。

Conao3さんはsetcdrsetfを使う手法を主に提案してくれていましたが、私は関数型かぶれなので直接破壊的代入を書くことに抵抗があります。よってseq.elの範囲で抽出して入力しました。

問題の箇所のコードを抽出するとこうです。

(leaf web-mode
  ;; js-modeが指定されているインタプリタにおいてweb-modeが指定されるようにします。
  :interpreter
  `,(seq-filter 'stringp (seq-map (lambda (regex-mode) (pcase regex-mode (`(,regex . js-mode) regex))) interpreter-mode-alist))

このコードはweb-modeのleaf断片が評価されるとき、 js.elが読み込まれていることを前提としています。まあ標準ライブラリですし、毎回読み込まれているので良いということにしました。