;;; -*- Mode: Lisp; Package: EDITOR -*- ;; Last updated: <2026/03/06 00:33:25 +0900> ;; ;; nim-mode.l ;; ========== ;; ;; by mieki256 ;; ;; 以下を参考に作成 ;; ;; xyzzy の音 - hoge-mode をつくる ;; http://hie.s64.xrea.com/xyzzy/note/hoge-mode.html ;; ;; ## 機能: ;; ;; * キーワード色付け表示 ;; * M-x nimpretty でソースフォーマッタを呼べる ;; ;; ## インストール方法: ;; ;; 以下の場所にファイルをコピー。 ;; ;; (xyzzyインストールディレクトリ)/site-lisp/nim-mode.l ;; (xyzzyインストールディレクトリ)/etc/Nim ;; ;; ~/.xyzzy に以下を追記。 ;; ;; (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 で呼び出し ;; ;; ## 履歴: ;; ;; 2026/03/06 ed:パッケージに登録するようにしてみた ;; 2026/03/05 キーワード色付けのみ対応 (provide "nim-mode") ;; ed:パッケージに属すると宣言 (in-package "editor") ;; シンボルを外部から参照できるようにする (export '(nim-mode *nim-mode-hook* *nim-mode-map* *nim-keyword-file* *nim-mode-syntax-table* *nim-mode-abbrev-table* nimpretty *nim-format-command* nim-completion nim-nitsuite )) (defvar *nim-format-command* "nimpretty --stdin --indent:2") (defvar *nim-mode-hook* nil) (defvar *nim-keyword-hash-table* nil) (defvar *nim-keyword-file* "Nim") ;; キー割り当て / mode-map (defvar *nim-mode-map* nil) (unless *nim-mode-map* (setq *nim-mode-map* (make-sparse-keymap)) (define-key *nim-mode-map* #\C-. 'nim-completion) (define-key *nim-mode-map* '(#\C-c #\?) 'nim-nitsuite) (define-key *nim-mode-map* '(#\C-m) 'newline-and-indent) ) ;; syntax-table / コメント行、文字列扱い、括弧のマッチを指定 (defvar *nim-mode-syntax-table* nil) (unless *nim-mode-syntax-table* (setq *nim-mode-syntax-table* (make-syntax-table)) ; コメント行の開始文字と終了文字 ; しかし、複数行コメントを指定するとこの指定は効かなくなってしまう ;; (set-syntax-start-comment *nim-mode-syntax-table* #\#) ;; (set-syntax-end-comment *nim-mode-syntax-table* #\LFD) ; 複数行コメントの開始文字列と終了文字列 ; ただ、コメント行の指定と衝突してしまう (set-syntax-start-multi-comment *nim-mode-syntax-table* "#[") (set-syntax-end-multi-comment *nim-mode-syntax-table* "]#") ; 文字列の区切り文字 (set-syntax-string *nim-mode-syntax-table* #\") (set-syntax-string *nim-mode-syntax-table* #\') ; 単語を構成する文字 (set-syntax-word *nim-mode-syntax-table* #\_) ; 括弧の対応 (set-syntax-match *nim-mode-syntax-table* #\( #\)) (set-syntax-match *nim-mode-syntax-table* #\{ #\}) (set-syntax-match *nim-mode-syntax-table* #\[ #\]) ) ;; コメント行を正規表現で色付け ;; 複数行コメントについては syntax-table側で対応する (defvar *nim-custom-keyword-list* (compile-regexp-keyword-list '( ("#\\([^[\n].*\\)?$" nil :comment) ))) ;; abbrev-table (defvar *nim-mode-abbrev-table* nil) (unless *nim-mode-abbrev-table* (define-abbrev-table '*nim-mode-abbrev-table*)) ;; 補完 (defvar *nim-completion-list* nil) (defun nim-completion () "キーワードから補完" (interactive) (or *nim-completion-list* (setq *nim-completion-list* (make-list-from-keyword-table *nim-keyword-hash-table*)) (return-from nim-completion nil)) (let ((opoint (point))) (when (skip-syntax-spec-backward "w_.") (let ((from (point))) (goto-char opoint) (do-completion from opoint :list *nim-completion-list*))))) ;; サンプル関数 (defun nim-nitsuite () "について" (interactive) (message-box "nim-mode desu (^_^)")) ;; nimprettyで現在開いてるバッファの内容を整形 (defun nimpretty () (interactive) (setq curline (current-line-number)) (filter-buffer *nim-format-command*) (goto-line curline)) (defun nim-mode () (interactive) (kill-all-local-variables) (setq mode-name "Nim") (setq buffer-mode 'nim-mode) (use-syntax-table *nim-mode-syntax-table*) (use-keymap *nim-mode-map*) (and *nim-keyword-file* (null *nim-keyword-hash-table*) (setq *nim-keyword-hash-table* (load-keyword-file *nim-keyword-file* t))) (when *nim-keyword-hash-table* (make-local-variable 'keyword-hash-table) (setq keyword-hash-table *nim-keyword-hash-table*)) ;; 正規表現キーワードを有効化 (make-local-variable 'regexp-keyword-list) (setq regexp-keyword-list *nim-custom-keyword-list*) (setq *local-abbrev-table* *nim-mode-abbrev-table*) (run-hooks '*nim-mode-hook*)) ;;; end-of-file