まずは Hiroi さんちのこのあたりをみるべきでしょう。 とってもわかりやすいのです。 このページを知ってたら、こんなものつくらなかっただろうなあ。 というわけで、ここにはたいしたものはありません。
ここでの記述は主に,OHKUBO さんの bat-mode, HATTORI さんの php-mode あたりを参考にさせていただきました。
とりあえず、キーワードの色付けをするためだけのものをつくってみる。 つくったら、ファイル名 hoge-mode.l で、site-lisp に置く。
provide は、リファレンスによると、
モジュールがロードされた事を示すために、ファイルの先頭に書いておくおまじない。 ここに書いたモジュール名が変数 *modules* に登録される。
ということらしい。
(provide "hoge-mode") (defvar *hoge-keyword-hash-table* nil) (defvar *hoge-keyword-file* "HOGE") (defun hoge-mode () (interactive) (kill-all-local-variables) (setq buffer-mode 'hoge-mode) (setq mode-name "HOGE") (and *hoge-keyword-file* (null *hoge-keyword-hash-table*) (setq *hoge-keyword-hash-table* (load-keyword-file *hoge-keyword-file* t))) (when *hoge-keyword-hash-table* (make-local-variable 'keyword-hash-table) (setq keyword-hash-table *hoge-keyword-hash-table*)))
以下のような内容で、キーワードファイル HOGE をつくる。つくったら、 etc または *keyword-load-path* で指定したフォルダに置く。 色の設定については、Toy さんのところ → Data Library → キーワードファイルの設定 がわかりやすい。
;*0 hoge homo ;*2 hage hamo
hoge-mode.l および HOGE を準備したら、.xyzzy か siteinit.l に、
(load-library "hoge-mode")
とする。拡張子に関連付けをする場合は、
(push '("\\.hoge$" . hoge-mode) *auto-mode-alist*)
とする。色付けするだけでよければ、ここでおしまいと思う。
;; mode-map (defvar *hoge-mode-map* nil) (unless *hoge-mode-map* (setq *hoge-mode-map* (make-sparse-keymap)) (define-key *hoge-mode-map* '(#\C-c #\?) 'hoge-nitsuite)) ;; サンプル関数 (defun hoge-nitsuite () "について" (interactive) (message-box "hoge-mode desu (^_^)")) ;; 関数 hoge-mode に以下を追加 (use-keymap *hoge-mode-map*)
コメント文字列は、# で始まる文字列を指定している。 (ここらへんは、よくわかっていない。といって、他の部分がわかっているわけでもない...。)
;; syntax-table (defvar *hoge-mode-syntax-table* nil) (unless *hoge-mode-syntax-table* (setq *hoge-mode-syntax-table* (make-syntax-table)) (set-syntax-start-comment *hoge-mode-syntax-table* #\# t) (set-syntax-end-comment *hoge-mode-syntax-table* #\LFD nil t) (set-syntax-string *hoge-mode-syntax-table* #\") (set-syntax-string *hoge-mode-syntax-table* #\')) ;; 関数 hoge-mode に以下を追加 (use-syntax-table *hoge-mode-syntax-table*)
;; 補完 (defvar *hoge-completion-list* nil) (defun hoge-completion () "キーワードから補完" (interactive) (or *hoge-completion-list* (setq *hoge-completion-list* (make-list-from-keyword-table *hoge-keyword-hash-table*)) (return-from hoge-completion nil)) (let ((opoint (point))) (when (skip-syntax-spec-backward "w_.") (let ((from (point))) (goto-char opoint) (do-completion from opoint :list *hoge-completion-list*))))) ;; *hoge-mode-map* に以下を追加 (define-key *hoge-mode-map* #\C-. 'hoge-completion)
初期化ファイルには、これ ↓ も書いておきたい。
(setq *popup-completion-list-default* :always)
abbrev-table を定義する。
(defvar *hoge-mode-abbrev-table* nil) (unless *hoge-mode-abbrev-table* (define-abbrev-table '*hoge-mode-abbrev-table*))
関数 hoge-mode に以下を追加する。
(setq *local-abbrev-table* *hoge-mode-abbrev-table*)
*hoge-mode-hook* を宣言する。
(defvar *hoge-mode-hook* nil)
関数 hoge-mode の末尾に以下を追加する。
(run-hooks '*hoge-mode-hook*)
(provide "hoge-mode") (defvar *hoge-mode-hook* nil) (defvar *hoge-keyword-hash-table* nil) (defvar *hoge-keyword-file* "HOGE") (defvar *hoge-mode-map* nil) (unless *hoge-mode-map* (setq *hoge-mode-map* (make-sparse-keymap)) (define-key *hoge-mode-map* #\C-. 'hoge-completion) (define-key *hoge-mode-map* '(#\C-c #\?) 'hoge-nitsuite)) (defvar *hoge-mode-abbrev-table* nil) (unless *hoge-mode-abbrev-table* (define-abbrev-table '*hoge-mode-abbrev-table*)) (defvar *hoge-mode-syntax-table* nil) (unless *hoge-mode-syntax-table* (setq *hoge-mode-syntax-table* (make-syntax-table)) (set-syntax-start-comment *hoge-mode-syntax-table* #\#) (set-syntax-end-comment *hoge-mode-syntax-table* #\LFD) (set-syntax-string *hoge-mode-syntax-table* #\") (set-syntax-string *hoge-mode-syntax-table* #\')) (defun hoge-mode () (interactive) (kill-all-local-variables) (setq buffer-mode 'hoge-mode) (setq mode-name "HOGE") (use-keymap *hoge-mode-map*) (use-syntax-table *hoge-mode-syntax-table*) (and *hoge-keyword-file* (null *hoge-keyword-hash-table*) (setq *hoge-keyword-hash-table* (load-keyword-file *hoge-keyword-file* t))) (when *hoge-keyword-hash-table* (make-local-variable 'keyword-hash-table) (setq keyword-hash-table *hoge-keyword-hash-table*)) (setq *local-abbrev-table* *hoge-mode-abbrev-table*) (run-hooks '*hoge-mode-hook*)) (defvar *hoge-completion-list* nil) (defun hoge-completion () "キーワードから補完" (interactive) (or *hoge-completion-list* (setq *hoge-completion-list* (make-list-from-keyword-table *hoge-keyword-hash-table*)) (return-from hoge-completion nil)) (let ((opoint (point))) (when (skip-syntax-spec-backward "w_.") (let ((from (point))) (goto-char opoint) (do-completion from opoint :list *hoge-completion-list*))))) (defun hoge-nitsuite () "について" (interactive) (message-box "hoge-mode desu (^_^)"))