逆引きxyzzy lisp(モード) - circleratio/xyzzy GitHub Wiki

目次

何もしないモード(雛形)

(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 が使える。

  1. 略語を入力して C-x C-h
  2. すると展開形を聞いてくるので入力する
  3. M-x write-abbrev-file で保存
  4. 次回以降は、略語の直後に半角スペースを入力する展開してくれる

動的(dynamic)補完

特に準備なしで dabbrev-mode が使える。 C-x / で補完を実行。

ファイル読み込み時に、自動的にモードを設定する

~/.xyzzy に下記のような設定を追加する。

(load-library "test")
(push '("\\.test$" . test-mode) *auto-mode-alist*)