2026/03/05(木) [n年前の日記]
#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
一応 nim-mode (nim-mode.l) を作ってみた。環境は Windows11 x64 25H2 + xyzzy 0.2.2.253。
_nim-mode.l
_Nim
以下のページを参考にさせてもらった。ありがたや。
_xyzzy の音 - hoge-mode をつくる
_xyzzy Lisp Progoramming
◎ 使い方 :
それぞれを以下にコピーしてインストール。
~/.xyzzy に以下を記述。
(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 はコメント記述に関して以下の記述もできるらしいけど、そういった記述には未対応です…。
_Nim Manual
予約語/キーワードファイルも、これでどの程度網羅できているのか…。上記のマニュアルページに載っていたワードは列挙してあるはずだけど…。
まあ、自分の場合、ガッツリとソースを書くなら VSCode (Microsoft Visual Studio Code)を起動してそっちで書き始めるので…。xyzzy がビューア代わりになればそれでいいや、と…。
色付け表示も、コメント関係は怪しいです。Nim はコメント記述に関して以下の記述もできるらしいけど、そういった記述には未対応です…。
- ## コメント
- ##[ 複数行コメント ]##
- discard """ 複数行コメント """
_Nim Manual
予約語/キーワードファイルも、これでどの程度網羅できているのか…。上記のマニュアルページに載っていたワードは列挙してあるはずだけど…。
まあ、自分の場合、ガッツリとソースを書くなら VSCode (Microsoft Visual Studio Code)を起動してそっちで書き始めるので…。xyzzy がビューア代わりになればそれでいいや、と…。
◎ 余談 :
今回このメジャーモードは xyzzy の userパッケージ内に登録されているのだろうと思うけど。
一般的にこういったメジャーモードは editorパッケージ(ed::パッケージ?)に登録して作成される場合がほとんどに見えた。しかし真似してみたところ「名前が衝突するので、exportできません editor:nim-mode」とエラーが表示されてしまった…。
以下の記述で何かおかしいところがあるのだろうか…?
単に (require "nim-mode") しか書いてない状態でもエラーが出る。何故だろう…。
一般的にこういったメジャーモードは 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」という名前が衝突していた…。
上記の変数が設定される際、userパッケージに「nim-mode」というシンボル? 名前? が一旦登録される。その後 nim-mode.l内で ―― editorパッケージ内で「nim-mode」というシンボルを他のパッケージも利用できるように export しようとすると、もう「nim-mode」というシンボルはuserパッケージ側で持ってしまっているから「名前が衝突〜」とエラーが出てしまう、ということなのだろう。
元ページにしっかり注意書きが書いてあった…。見落としていた…。
~/.xyzzy の最後のあたりに件の記述を配置し直したらエラーが出なくなった…。
この *one-line-comment-alist* は、呼び出される関数よりも後のほうで記述してもいいらしい。関数を呼び出した時に定義済みなら動作に問題は無い、とAIが言っている。本当かな…? 一応その配置でも動いたように見えているけど…。
一応 nim-mode.l も (in-package "editor") 等を記述した版に修正しておいた。
;; ----------------------------------------
;; 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 の最後のあたりに件の記述を配置し直したらエラーが出なくなった…。
この *one-line-comment-alist* は、呼び出される関数よりも後のほうで記述してもいいらしい。関数を呼び出した時に定義済みなら動作に問題は無い、とAIが言っている。本当かな…? 一応その配置でも動いたように見えているけど…。
一応 nim-mode.l も (in-package "editor") 等を記述した版に修正しておいた。
[ ツッコむ ]
以上です。