しょぼしょぼすくりぷと xyzzy > xyzzyの初歩講座(機能と操作) > キーワードの設定方法

xyzzyのキーワード設定方法

--

キーワードを色付きで表示させます。また、mode毎にキーワードを設定できるので、例えば、javaやperlなど言語ごとの設定ができます。

ページ内目次

xyzzyのキーワード機能を使う

すぐ使うには次の1点を確認

xyzzy -> ツール -> 共通設定 -> 表示 -> キーワード色付きにチェック

そしたら試しましょう。まず、hogehoge.javaファイルを開いて M-x java-modeします。
※java-modeも Javaのキーワードファイルも標準で付いています。
キーワードファイルをhookで読み込んでおくと、動的補完の対象語に含まれます。
*dabbrev-search-this-buffer-only* を nilにしてください。
特別付録キーワードファイル for java
xyzzyでキーワード設定lispサンプルについてはこちらをクリック

キーワードファイルカスタマイズの流れ

  1. まず下準備としてxyzzy に 自分用のキーワードパスを指定します(しなくても良い)。
  2. 次のモードごとのキーワードファイルの準備をします。
    (キーワードファイルのフォーマットは次の賞を参照してください)
  3. 最後に設定したキーワードファイルを試します。

キーワードファイルの場所

default(標準) の設定は etc/ です。
独自に設定したい場合は(setq *keyword-load-path* '("D:/text/xyzzy/keyword/"))などとします。
(参考)Version 0.1.1.116

キーワードファイルの命名規則

キーワードファイル名は各モードごとに決まっています。命名規則はあまりきっちりとはないようです。
例:Perl,Java HTML,CSS,C,Ruby,lispなど (xyzzy/etc/フォルダやxyzzy/lisp/java.lを覗いてみてください)

キーワードファイルの読み込み方

対象のモードで開けるファイルを開く
(java-modeの時は、*.javaファイルを開くとか)
M-x Java-modeとかうってとりあえず試すことも可能ですが、 reload-keyword-file:で再読込できそうです。
だめだったら、xyzzy を起動すれば良いかも

xyzzyのキーワードファイルの中に書くときのルール

実際に自分用にキーワードを作成したくなりますよね。ここでフォーマットを説明します。 3つくらいあります。

設定ファイルイメージ例

まずは感覚を掴むために設定ファイルのイメージを見てください。

キーワードファイルの中こんな感じ チェック用
;**10u
java
javax
swing
org

;*1
boolean
byte
char
double
float

;**37u
Exception
;*0
Num0
;*1
Num1
;*2
Num2
;*3
Num3
;*4
Num4
;*5
Num5
;*6
Num6
;*7
Num7
;*8
Num8
;*9
Num9
;*a
Numa
;*b
Numb
;*c
Numc
;*d
Numd
;*e
Nume
;*f
Numf
;*g
Numg
;*h
Numh
;*i
Numi
      


パターン1: *n

キーワードファイルformat(Version 0.2.1.161)

;* n [ attrib ]
n キーワード番号(0〜5)。3〜5は0〜2と同じ色の反転。
attrib 属性みたいなの。以下の任意の組み合わせ。
  • b | bold
  • u | underline
  • s | strike-out
  • l | line (一行丸ごと) ";**でも使える。"
s は こんなs tag(<S>タグと同じです)よくスペルミスする単語に設定するとか?
こちらは キーワードの色に対応し、 下の ;** は 文字色に対応するようです(推測)。

キーワードファイルformat(旧バージョン , そのうち 非サポートかも)

;*?
0-8 ノーマル 9 a-iBold ボールド
0-2 9 a-c キーワードそれぞれの色付き 3-5 ,d-f反転 6-8 ,g-i行反転
0, 3 ,6,a ,g ,dキーワード1 1 ,4 ,7,b,e,hキーワード2 2, 5,8,c ,f ,iキーワード3
ローカル設定のキーワードの色らしいです。
指定しないのはそのままの文字の色ですね。9 はボールドのみです。

パターン2: **n

追記(changelog Ver. 0.2.1.150)

;** fg [bg [attribute]]
fg 文字色(0〜f)。0ならば普通の色。
bg 背景色(0〜f)。0ならば普通の色。
attrib属性みたいなの。以下の任意の組み合わせ。
  • b | bold
  • u | underline
  • s | strike-out
  • l | line (一行丸ごと)
ex.(色は適当、任意に変えられます。)
;**1 文字色1。 文字色1。
;**0a 文字色は標準、背景色10。 文字色は標準、背景色10。
;**3c 文字色3、背景色12 文字色3、背景色12
;**20bu 文字色2、背景色は標準、ボールド+アンダーライン 文字色2、背景色は標準、ボールド+アンダーライン

つまり 2つのフォーマットをサポートし、古い方はなくなるかもらしいです。

キーワードファイル追記(changelog Ver. 0.2.1.202)より

使い方
compile-regexp-keyword-listの引数 (regexp case-fold color [ context [ begin [ end ] ] ] )
regexp 正規表現
case-fold non-nilなら、正規表現のマッチングで大文字小文字を区別しない。
color 表示色など。下記のどれかの形式で指定。
keyword-color キーワード色指定。
    0〜2
        キーワード1〜3の色
    3〜5
        キーワード1〜3の色でそのキーワードだけ反転
    6〜8
        キーワード1〜3の色でその行の端から端まで反転
    9
        単なるbold
    10〜18
        0〜8と同じ色でbold
    :string
        文字列の色
    :comment
        コメントの色
    :tag
        タグの色
(:keyword keyword-color [attributes]) キーワード色で属性を指定したりしなかったり。attributesは下記のシンボルの組み合わせ。
    :bold
        ボールド
    :underline
        アンダーライン
    :strike-out
        取り消し線
    :line
        一行まるごと
(:color foreground [background [attributes]]) 前景色・背景色指定。
    foreground
        0〜15で前景色を指定。 
    background
        0〜15で背景色を指定。指定しないかnilの場合は0。 
context キーワードが有効な文脈。下記のシンボルまたはシンボルのリストを指定。指定しない場合はnilと同じ。
:string
    文字列内部で有効。
:tag
    タグ内部で有効。
:comment
    コメント内部で有効。
nil
    上記以外で有効。
t
    すべての文脈で有効。
begin マッチしたテキストの、色をつける部分の開始位置を指定。0〜9なら(match-beginning begin)の位置。-1〜-9なら(match-end (- begin))の位置。指定しないかnilの場合は(match-beginning 0)の位置。
end マッチしたテキストの、色をつける部分の終了位置を指定。0〜9なら(match-end end)の位置。-1〜-9なら(match-beginning (- end))の位置。指定しないかnilの場合は(match-end 0)の位置


正規表現の色分け
(defvar *c-number-formats*
  (compile-regexp-keyword-list
   '(("\\(^\\|\\_S\\)\\(?:[0-9]+\\.[0-9]*\\|\\.[0-9]+\\)\\(?:e[-+]?[0-9]+\\)?[fl]?\\($\\|\\_S\\)"
      t (:keyword 0 :bold) nil -1 -2)
     ("\\_<[0-9]+e[-+]?[0-9]+[fl]?\\_>" t 1);いわゆる数値 00e-111f
     ("\\_<\\([1-9][0-9]*\\|0[0-7]*\\|0x[0-9a-f]+\\)\\(u?l\\|l?u\\|u?i64\\)?\\_>";こんな 1999  00  0xabca 00ul
      t (:color 1 2 :underline)))))

(make-local-variable 'regexp-keyword-list)
(setq regexp-keyword-list *c-number-formats*)
        
解りづらいので 、自分で理解するためにちょっといじってみた。ページ最後に活用例設定サンプルを置きました。
	  ("\\_" t (:keyword 1 :bold))
	  ("\\_<\\w+exception\\_>" t (:color 1 0))
      
hogehogeException
abckdjfkajabc or  abc|abc
      

キーワードファイル追記(changelog Ver. 0.2.1.207)より

設定の話を置いておいて、仕組みと何に関係しているのかを把握しておくと
おそらく HTML doctype毎にキーワードを変えられるような仕組みになっている。 conditionもitemもこのDOCTYPEを指している。

htmlmode変更時に、キーワードファイルが読まれる。 その時、対象のhtmlファイル自体の1行目で xml か DOCTYPEを確認している (こんな感じ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">)。 もしDOCTYPEが見つからなければ *html-default-doctype* の "HTML4.01 Frameset"が設定される。

このタイプがファイルごとの指定conditionで、そこのキーワードファイルで定義されているがDOCTYPEがitemだと思われる。

HTMLのキーワードファイルで
    ;*-
    :*+HOGEHOGEitem
    の場合、一旦リセットして、 HOGEHOGE専用のタグのキーワードが設定される
    ;*+
    :*-HOGEHOGEitem
    :*-HOGEHOGE2item
    の場合、一旦全部対象として、 HOGEHOGE,HOGEHOGE以外ならばキーワードが設定される

;*&は HTML3.0付近で &REF1〜6であったが 直前に ;*-があったのでちょっと不明

色の指定は ;*nのパターンなのでキーワード1〜3で指定しているようだ。

;*+ conditionに関わらず、以降を有効にする。
;*- conditionに関わらず、以降を無効にする。
;*+item itemがconditionに一致した場合、以降を有効にする。
;*-item itemがconditionに一致した場合、以降を無効にする。
;*& 以降は、HTMLのタグ以外でも有効なキーワードとなる。
;*< 以降は、HTMLのタグでのみ有効なキーワードとなる。
具体例は etc/HTML,lisp/htmlmode.l , html-kwd.l を参照のこと


ついでに 動的ファイルにもキーワードファイルを読み込ませて、プログラミングを楽にしよう

キーワードファイルを動的補完の対象にする
dabbrev.l(動的に補完してくれるファイル)では、バッファーの中から候補を出してくれます。 ということで フックして、キーワードファイルを読み込ませるLispです。

;abbrev
(add-hook 'ed::*java-mode-hook* #'my-setting-java)
;ある関数をフックに掛ける

;私の設定例
(defun my-setting-java ()
;(setq ed::*java-indent-tabs-mode* t)
;(setq editor::*java-indent-tabs-mode* t)
;カーソル位置より前に空白しかない場合インデント
;(setq *java-tab-always-indent* nil)
(setq java-brace-offset -2)
(setq java-label-offset 0)

;自分の関数 文法(syntax)を設定しておかないとうまくいかないかも
(define-key ed::*java-mode-map* #\{ 'electric-brace-insert)
(define-key ed::*java-mode-map* #\( 'electric-brace-insert)
(define-key ed::*java-mode-map* #\[ 'electric-brace-insert)

(define-key ed::*java-mode-map* #\} 'c-electric-close)
(define-key ed::*java-mode-map* #\) 'electric-brace-insert)
(define-key ed::*java-mode-map* #\] 'electric-brace-insert)

;動的補完設定
(abbrev-mode t)
;とりあえず読み込んでおく部分
(let ((now-buffer)(keyword-file-name)(bn))
(setq now-buffer (selected-buffer))
(setq keyword-file-name (format nil "~A/Java" (nth 0 *keyword-load-path*)))
(unless keyword-file-name
(setq keyword-file-name (format nil "~A/etc/Java" (si:system-root))))
(unless (get-file-buffer keyword-file-name)
(find-file keyword-file-name)
(toggle-read-only)
;こうしておくとバッファが表示されず、選択できない
(rename-buffer (concat  " " (buffer-name(selected-buffer)))(selected-buffer))
)
(switch-to-buffer now-buffer)
)
)

(add-hook 'ed::*java-mode-hook* #'my-setting-java)


        

秀丸も相変わらずバージョンアップして、 最近は eclipseがはやってきているので こういう用途は減少するかもしれないなぁ。

正規表現キーワード色設定を活用する

文字列に背景色をつける例,1行見出しの例

regexp-keyword-listに設定すると、正規表現でキーワードが設定できます。 このやり方だと、文字列やコメントの背景色も色がつけられます。

(setq regexp-keyword-list
        (compile-regexp-keyword-list
         '(
           ;文字列
           ("\\s\"[^\"\"]*\\s\"" t (:color 10 2) t)
           ;コメント
           ("\\s<.*\\s>" t (:color 6 1) t)
           ;テキスト見出し
           ("^[ \t]*[●◆■▲▼]" t (:color 2 4 :line :bold) t)
           ("^[ \t]*\\\([○◎◇□△▽].*\n\\\)" t (:color 1 7 :underline :bold) t 0)
           ("^[ \t]*\\\([・].*\n\\\)" t (:keyword 10) t 0)
           ;アイテマイズ見出し sub
           ("^[ \t]*\\\([0-9]\\\{1,5\\\}[][\/ .. \t/#$!%&^~|\\+*]+[^0-9\n]+\n\\\)" t (:color 3 7 :underline :bold) t 0)
           ("^[ \t]*\\\((?[a-zA-Z]\\\{1,2\\\}-?[0-9]\\\{,5\\\})?[][\- .. \t/#$!%&^~|\\+*]+[^a-zA-Z0-9\n]+\n\\\)" t (:color 4 7 :underline :bold) t 0)
           ;アイテマイズ見出し sub
           ("^\\\([ \t ]*[|>#:|#>※]\\\)\\\{4\\\}[ \t ]?" t (:color 4 7 :line ) t)
           ("^\\\([ \t ]*[|>#:|#>※]\\\)\\\{3\\\}[ \t ]?" t (:color 3 7 :line ) t)
           ("^\\\([ \t ]*[|>#:|#>※]\\\)\\\{2\\\}[ \t ]?" t (:color 2 7 :line ) t)
           ("^[ \t ]*[|>#:|#>※][ \t ]?" t (:color 1 7 :line ) t)
           )))

記事リンク

xyzzyのインデント設定
FAQ tips
.xyzzyと siteinit.lの設定
よく使ういろいろな作者の lisp ライブラリ紹介

java キーワード表示例

next -> (xyzzyのインデント設定)


しょぼしょぼすくりぷと xyzzy編 トップへ | xyzzyの初歩講座(機能と操作)