逆引きxyzzy lisp(モード) - circleratio/xyzzy GitHub Wiki
目次
- 何もしないモード(雛形)
- キーワードへの色づけ
- キー設定
- ルールに基づいて色付けする
- 正規表現で動的に色付けする
- 静的(static)補完
- 動的(dynamic)補完
- ファイル読み込み時に、自動的にモードを設定する
何もしないモード(雛形)
(defvar *test-mode-hook* nil)
(defun test-mode ()
(interactive)
(kill-all-local-variables)
(setq buffer-mode 'test-mode)
(setq mode-name "Test")
; keymap
(use-keymap *test-mode-map*)
; keyword & syntax table
(use-syntax-table *test-mode-syntax-table*)
(and *test-keyword-file*
(null *test-keyword-hash-table*)
(setq *test-keyword-hash-table*
(load-keyword-file *test-keyword-file* t)))
(when *test-keyword-hash-table*
(make-local-variable 'keyword-hash-table)
(setq keyword-hash-table *test-keyword-hash-table*))
(when *test-regexp-keywords*
(make-local-variable 'regexp-keyword-list)
(setq regexp-keyword-list *test-regexp-keywords*))
; abbrev
(setq *local-abbrev-table* *test-mode-abbrev-table*)
(make-local-variable 'need-not-save)
(setq need-not-save t)
(make-local-variable 'auto-save)
(setq auto-save nil)
(run-hooks '*test-mode-hook*))
;
; keymap
;
(defvar *test-mode-map* nil)
(unless *test-mode-map*
(setq *test-mode-map* (make-sparse-keymap)))
;
; keyword and syntax table
;
(defvar *test-keyword-hash-table* nil)
(defvar *test-keyword-file* "Test")
(defvar *test-mode-syntax-table* nil)
(unless *test-mode-syntax-table*
(setq *test-mode-syntax-table* (make-syntax-table)))
(defvar *test-regexp-keywords*
(compile-regexp-keyword-list
'(("テスト" t (:keyword 0 :bold) nil))))
;
; abbrev
;
(defvar *test-mode-abbrev-table* nil)
(unless *test-mode-abbrev-table*
(define-abbrev-table '*test-mode-abbrev-table*))
キーワードへの色づけ
色をつけるにはキーワードファイルを使う方法と,正規表現キーワードを使う方法がある.
キーワードファイルでは日本語キーワードは扱えないので注意すること. その場合は regexp-keyword-list を使うこと.
上記の雛形はキーワードファイルと正規表現キーワードに対応している.
キーワードファイルは下記の要領で作る. このファイルは xyzzy/etc/Test というパスに配置すること。
;*0
zero
;*1
one
;*2
two
;*3
three
;*4
four
;*5
five
;*6
six
;*7
seven
;*8
eight
;*9
bold
;*a
bold0
;*b
bold1
;*c
bold2
;*d
bold3
;*e
bold4
;*f
bold5
;*g
bold6
;*h
bold7
;*i
bold8
test-mode で "zero" などと入力すると色が付くことを確認できる。 色の付き方は xyzzy の「ツール/共通設定/表示色」の設定内容による。
キー設定
keymap を設定する。 必要に応じて、呼び出されるべき関数を用意する。
(defvar *test-mode-map* nil)
(unless *test-mode-map*
(setq *test-mode-map* (make-sparse-keymap))
(define-key *test-mode-map* '(#\C-c #\C-c) 'test1)
(define-key *test-mode-map* '(#\C-c #\t) 'test1)
(define-key *test-mode-map* #\M-a 'test2))
(defun test1 ()
(interactive)
(insert "test1"))
(defun test2 ()
(interactive)
(insert "test2"))
キー指定の方法
キー | 表記 |
---|---|
スペース | #\SPC |
英数字 | #\a, #\b, #\c, ... |
記号 ("'(),;`\|) | #\-\; |
特殊キー(TAB, LFD, RET, ESC, DEL, NUL) | #\TAB, #\M-TAB |
コントロール+キー | #\C-* |
ALT+キー | #\M-* |
ルールに基づいて色付けする
syntax-table の定義を書き換える。
(defvar *test-mode-syntax-table* nil)
(unless *test-mode-syntax-table*
(setq *test-mode-syntax-table* (make-syntax-table))
(set-syntax-string *test-mode-syntax-table* #\")
(set-syntax-escape *test-mode-syntax-table* #\\)
(set-syntax-symbol *test-mode-syntax-table* #\_)
(set-syntax-match *test-mode-syntax-table* #\( #\))
(set-syntax-start-multi-comment *test-mode-syntax-table* "/*")
(set-syntax-end-multi-comment *test-mode-syntax-table* "*/")
(set-syntax-start-c++-comment *test-mode-syntax-table* #\/)
(set-syntax-end-c++-comment *test-mode-syntax-table* #\LFD))
正規表現で動的に色付けする
(make-local-variable 'regexp-keyword-list)
(setq regexp-keyword-list
(compile-regexp-keyword-list
'(("^・.+$" t (:keyword 0 :bold) t)))))
静的(static)補完
雛形のままで abbrev-mode が使える。
- 略語を入力して C-x C-h
- すると展開形を聞いてくるので入力する
- M-x write-abbrev-file で保存
- 次回以降は、略語の直後に半角スペースを入力する展開してくれる
動的(dynamic)補完
特に準備なしで dabbrev-mode が使える。 C-x / で補完を実行。
ファイル読み込み時に、自動的にモードを設定する
~/.xyzzy に下記のような設定を追加する。
(load-library "test")
(push '("\\.test$" . test-mode) *auto-mode-alist*)