mieki256's diary



2026/03/05(木) [n年前の日記]

#1 [nim] Nimのソースコードを整形したい

プログラミング言語 Nim のソースコードを整形したい。

nimpretty というツールがあるらしい。Nim と一緒に入ってた。

> nimpretty --help
nimpretty - Nim Pretty Printer Version 0.2
  (c) 2017 Andreas Rumpf
Usage:
  nimpretty [options] nimfiles...
Options:
  --out:file            set the output file (default: overwrite the input file)
  --outDir:dir          set the output dir (default: overwrite the input files)
  --stdin               read input from stdin and write output to stdout
  --indent:N[=0]        set the number of spaces that is used for indentation
                        --indent:0 means autodetection (default behaviour)
  --maxLineLen:N        set the desired maximum line length (default: 80)
  --version             show the version
  --help                show this help

「--stdin」をつけると標準入力から読み取って標準出力に出してくれるらしい。普段使ってるエディタがバッファ内容を標準入力として出してくれる機能を持っているなら、フォーマッタをかけることが出来そう…。

#2 [nim][xyzzy] xyzzyのnim-modeを作成

自分は普段Windows上でxyzzyというテキストエディタを使っているのだけど、この xyzzy をNim言語にも対応させたい。せめてコメント行やキーワードだけでも色付け表示をしたい。

一応 nim-mode (nim-mode.l) を作ってみた。環境は Windows11 x64 25H2 + xyzzy 0.2.2.253。

_nim-mode.l
_Nim

以下のページを参考にさせてもらった。ありがたや。

_xyzzy の音 - hoge-mode をつくる
_xyzzy Lisp Progoramming

使い方 :

それぞれを以下にコピーしてインストール。
(xyzzyインストールフォルダ)\site-lisp\nim-mode.l
(xyzzyインストールフォルダ)\etc\Nim

~/.xyzzy に以下を記述。
;; nim-mode
(require "nim-mode")
(push '("\\.nim$" . nim-mode) *auto-mode-alist*)
(define-key *nim-mode-map* #\C-. 'nim-completion)    ;; C-. でキーワード補完

;; ソースフォーマッタ(nimpretty)の呼び出しを指定
(setq *nim-format-command* "nimpretty --stdin --indent:2")
(define-key *nim-mode-map* #\C-M-f 'nimpretty)    ;; Ctrl + Alt + f で呼び出し

  • C-. で、予約語リスト(キーワードリスト)に従って補完ができる。
  • Alt + Ctrl + f で nimpretty を呼び出してソース整形ができる。

制限 :

ざっくりとした色付け表示しかされません。例えば「:」を打ってからEnterを叩いたら1階層右にインデントしながら改行、みたいな機能は未実装です。

色付け表示も、コメント関係は怪しいです。Nim はコメント記述に関して以下の記述もできるらしいけど、そういった記述には未対応です…。
  • ## コメント
  • ##[ 複数行コメント ]##
  • discard """ 複数行コメント """

_Nim Manual

予約語/キーワードファイルも、これでどの程度網羅できているのか…。上記のマニュアルページに載っていたワードは列挙してあるはずだけど…。

まあ、自分の場合、ガッツリとソースを書くなら VSCode (Microsoft Visual Studio Code)を起動してそっちで書き始めるので…。xyzzy がビューア代わりになればそれでいいや、と…。

余談 :

今回このメジャーモードは xyzzy の userパッケージ内に登録されているのだろうと思うけど。

一般的にこういったメジャーモードは editorパッケージ(ed::パッケージ?)に登録して作成される場合がほとんどに見えた。しかし真似してみたところ「名前が衝突するので、exportできません editor:nim-mode」とエラーが表示されてしまった…。

以下の記述で何かおかしいところがあるのだろうか…?
(provide "nim-mode")

;; ed:パッケージに属すると宣言
(in-package "editor")

;; シンボルを外部から参照できるようにする
(export '(
          nim-mode
          *nim-mode-map*
          *nim-keyword-file*
          *nim-mode-syntax-table*
          *nim-mode-abbrev-table*
          *nim-format-command*
          *nim-mode-hook*
          nim-completion
          nim-nitsuite
          ))

単に (require "nim-mode") しか書いてない状態でもエラーが出る。何故だろう…。

2026/03/06追記 :

「名前が衝突〜」のエラーが出る理由が分かった。~/.xyzzy 内に以下を記述してたのだけど、ここが先に処理されてしまって、「nim-mode」という名前が衝突していた…。

;; ----------------------------------------
;; 1行コメントをトグル
;;
;; xyzzy の音 - 編集
;; http://hie.s64.xrea.com/xyzzy/note/edit.html#toggle-one-line-comment

(defvar *one-line-comment-alist*
  '(
    (awk-mode   . ("#"))
    (css-mode   . ("/* " " */"))
    (html+-mode . ("<!-- " " -->"))
    (lisp-mode  . (";"))
    (lisp-interaction-mode . (";"))
    (php-mode   . ("//"))
    (sql-mode   . ("--"))
    (java-mode  . ("//"))
    (c++-mode   . ("//"))
    (perl-mode  . ("#"))
    (ruby-mode  . ("#"))
    (py-mode    . ("#"))
    (nim-mode   . ("#"))
    ))

上記の変数が設定される際、userパッケージに「nim-mode」というシンボル? 名前? が一旦登録される。その後 nim-mode.l内で ―― editorパッケージ内で「nim-mode」というシンボルを他のパッケージも利用できるように export しようとすると、もう「nim-mode」というシンボルはuserパッケージ側で持ってしまっているから「名前が衝突〜」とエラーが出てしまう、ということなのだろう。

元ページにしっかり注意書きが書いてあった…。見落としていた…。

*one-line-comment-alist* の設定は,各モードの設定より後に記述する必要があるのだと思います。

xyzzy の音 - 編集 より


~/.xyzzy の最後のあたりに件の記述を配置し直したらエラーが出なくなった…。

この *one-line-comment-alist* は、呼び出される関数よりも後のほうで記述してもいいらしい。関数を呼び出した時に定義済みなら動作に問題は無い、とAIが言っている。本当かな…? 一応その配置でも動いたように見えているけど…。

一応 nim-mode.l も (in-package "editor") 等を記述した版に修正しておいた。

以上、1 日分です。

過去ログ表示

Prev - 2026/03 -
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project