Nuten

Emacs

Emacs 組み込みの Eglot か、パッケージの lsp-mode, Apheleia のいずれかで設定できます。どの方法も PATH 上の nuten を呼び出すので、先に nuten の インストール が必要です。PATH にない nuten を使う場合は、例の "nuten" をそのパスに置き換えてください。

Nushell 用のメジャーモードは Emacs に含まれていないので、nushell-mode などのパッケージが別に必要です。以下の例は nushell-mode を前提にしています。nushell-ts-mode を使う場合は、Nushell の tree-sitter 文法も入れたうえで、nushell-mode を nushell-ts-mode に読み替えてください。

nushell-mode が自動で有効になるのは .nu だけです。.nuon も整形したい場合は、次の設定で nushell-mode を割り当てます。

(add-to-list 'auto-mode-alist '("\\.nuon\\'" . nushell-mode))

Eglot

nuten lsp を言語サーバーとして登録し、保存時に整形します。Eglot は Emacs 29 から組み込まれています。

(with-eval-after-load 'eglot
  (add-to-list 'eglot-server-programs '(nushell-mode . ("nuten" "lsp"))))
(add-hook 'nushell-mode-hook
          (lambda ()
            (eglot-ensure)
            (add-hook 'before-save-hook #'eglot-format-buffer nil t)))

Eglot はバッファごとに言語サーバーを 1 つしか使えないため、この設定では Eglot が既定で使う Nushell の言語サーバーが Nuten に置き換わります。補完などを Nushell の言語サーバーに任せたい場合は、Eglot は既定のままにして整形だけを Apheleia で行うか、lsp-mode を使ってください。

lsp-mode

lsp-mode に nuten lsp を言語サーバーとして登録し、保存時に整形します。

(with-eval-after-load 'lsp-mode
  (lsp-register-client
   (make-lsp-client
    :new-connection (lsp-stdio-connection '("nuten" "lsp"))
    :activation-fn (lsp-activate-on "nushell")
    :server-id 'nuten
    :add-on? t)))
(add-hook 'nushell-mode-hook
          (lambda ()
            (lsp-deferred)
            (add-hook 'before-save-hook #'lsp-format-buffer nil t)))

:add-on? t を指定しているので、Nuten は Nushell の言語サーバーと同時に動きます。

Apheleia

Apheleia のフォーマッタとして登録します。言語サーバーは使わず、バッファの内容を標準入力で nuten format に渡して整形します。

(with-eval-after-load 'apheleia
  (setf (alist-get 'nuten apheleia-formatters)
        '("nuten" "format" "--stdin-filepath" filepath "-"))
  (setf (alist-get 'nushell-mode apheleia-mode-alist) 'nuten))
(add-hook 'nushell-mode-hook #'apheleia-mode)

--stdin-filepath でバッファのパスも渡しているので、Nuten はそのパスを基準に設定ファイルを探します。

Last updated: