hoge-mode をつくる

Last modified: "2019/01/02 17:49:36"

Intro

まずは Hiroi さんちのこのあたりをみるべきでしょう。 とってもわかりやすいのです。 このページを知ってたら、こんなものつくらなかっただろうなあ。 というわけで、ここにはたいしたものはありません。

ここでの記述は主に,OHKUBO さんの bat-mode, HATTORI さんの php-mode あたりを参考にさせていただきました。


Table of contents


hoge-mode.l

とりあえず、キーワードの色付けをするためだけのものをつくってみる。 つくったら、ファイル名 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*)))

keyword file

以下のような内容で、キーワードファイル HOGE をつくる。つくったら、 etc または *keyword-load-path* で指定したフォルダに置く。 色の設定については、Toy さんのところ → Data Library → キーワードファイルの設定 がわかりやすい。

;*0
hoge
homo

;*2
hage
hamo

load

hoge-mode.l および HOGE を準備したら、.xyzzy か siteinit.l に、

(load-library "hoge-mode")

とする。拡張子に関連付けをする場合は、

(push '("\\.hoge$" . hoge-mode) *auto-mode-alist*)

とする。色付けするだけでよければ、ここでおしまいと思う。


keymap

;; 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*)

comment

コメント文字列は、# で始まる文字列を指定している。 (ここらへんは、よくわかっていない。といって、他の部分がわかっているわけでもない...。)

;; 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*)

completion

;; 補完
(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

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*)

hook

*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 (^_^)"))

更新履歴

[2003/08/31]
・indent な辺りを削除。
[2003/02/09]
・editor パッケージに入れないようにした。
・その他いろいろと細かい修正。