しょぼしょぼすくりぷと xyzzy編 > xyzzyの初歩講座(機能と操作) > 動的補完と静的補完の設定と使い方

動的補完と静的補完の設定と使い方

単語の補完機能とは

補完機能とは、入力途中でも、単語の残りの部分を補完してくれる機能です。長い単語を入力したときに入力が低減できたり、変数名のスペルミスを減らすのに大変便利です。

二つのモード

補完機能には大きく分けて2つの方法があります。
静的補完機能static-abbrev 設定していた辞書ファイルから補完(lisp/abbrev.l)
動的補完機能dynamic-abbrev 現在のバッファ上からインタラクティブに単語を補完(lisp/dabbrev.l)
dynamicの補完は 一つのバッファだけでなく、複数のバッファの単語が補完候補になります。

2つの補完機能タイプ使い分け

静的補完は予め決まっているような ifや breakなど変わらないものを補完する時に使います。 一方動的補完は ファイル上で直前に入力した変数名やクラス名など、編集中にどんどん増えるものを対象にするときに使います。
なので、予約語などは 静的補完 で メソッドや関数は動的補完機能を使うのがおすすめです。

ちなみに、xyzzyのこの標準の補完機能は

日本語にも結構対応してます。
Version 0.1.1.116:動的補完の日本語対応

静的補完自体を補完する機能(それが失敗したら動的補完する機能つきました。)

refer

赤塚さんとこ: 補完 の操作方法
キー入力の復習
ESC x == Alt x == M-x です。

補完機能の使い方&設定

それでは静的補完と動的補完を順番に説明していきます。

静的(static)補完機能

abbrev-mode

静的補完の概要

静的補完は、いわゆる定型句補完です。そのため最初に定型句との対応を設定しておく必要があります。
静的補完で補完対象となる単語は辞書ファイルに書かれる事になりますが、その静的補完で使用する辞書ファイルは、設定ファイルを作らなくてもmini bufferで対話的に設定を追加できます(~/.abbrev_defs がデフォルトのファイルです)。

その静的補完の辞書ファイル作成方法として 単語をバッファー上に作成しそれに略語をつけて保存する方法と バッファー上に略語を書いてそれに展開後の単語をつけて保存する方法があります。

設定した後の使い方ですが、 abbrev-modeであれば区切り文字ごとに自動で動きます。

それでは、詳しく設定方法と、使い方を具体例を交えて説明します。

mini-bufferで辞書ファイルの設定方法(展開語)

辞書へ単語を登録する方法
ざっくりいうと
M-0 C-x C-a で登録し
C-x ' で使います。 ・・・・・・・・・・・・ 一例
"System.out.println("")" -> "sout"と変換したい場合
登録語から先に設定したい場合  System.out.println("") <- sout(登録語を書いてから 以下のコマンドで略語と共に設定します。)
  1. System.out.println("") の前で マークする(C-SPC)
  2. System.out.println("") の後ろでM-0 C-x C-aと入力する。.....(*)
  3. 「"System.out.println("")" のMode略称」 と聞いてくるので sout と入れる。
  4. 実際に abbrev-mode に入って変換されるかやってみよう。
  5. 補足:
    • (*) で C-x C-a と入力していますがそれは 現在のモード (Javaとか)に追加です。
    • (*) でC-x + と入力すると グローバル(全てのモード)に対しての追加になります。
    • M-x write-abbrev-file で保存するのを忘れないように。
    • 略称に短すぎる文字、例えば、iなどの良く入れる短い単語で作ってしまうとどんどん静的展開されるので注意。


  1. □System.out.println("") ここで C-SPC
  2. _System.out.println("")□ ここで M-0 C-x C-a
  3. ■■ "System.out.println("")" のMode略称: | と聞いてくる
  4. ■■ "System.out.println("")" のMode略称: sout | と答える。

※ちなみに、略語から先に設定したい場合  sout -> System.out.println("");
  • 「Global 略称"sout" の展開と聞いてくる。」
  • (*) でC-x C-h と入力すると 現在のモード (Java)に追加。
  • (*) でC-x - と入力すると グローバル(全てのモード)に追加。
登録時 使用時
Global major -
略称後確認 M-0 C-x + M-0 C-x C-a C-x '
略称先入力 C-x - C-x C-h
辞書ファイルの設定

保存と読み込みを忘れてしまう人は、.xyzzyに以下を記載して読み込んでおいてください。

(read-abbrev-file)
;(add-hook '*query-kill-buffer-hook* 'write-abbrev-file) ;Version 0.2.1.194 ~/.abbrev_defsを読み込んだ場合は、勝手に保存するようにした。

※複数のxyzzyを起動している場合は、登録と保存に注意!

静的補完用辞書ファイルに設定した展開語の使い方

辞書の語句を展開する方法は二つあります。

一つ目は、現在のカーソルの位置(略語直後)で展開してほしいとき C-x ' (関数ではexpand-abbrev) を入力すると展開(補完)できます。

二つ目。
C-x 'での方法はいつでもできますが、少し操作が面倒です。 そこで 静的補完のabbrev-mode (マイナーモード)に入っておくと スペースを入力した時が変換タイミングになります。

単語をいれて、区切りをつけると、自動的に置換されます。もちろん設定ファイルに無いとダメ。区切り文字としては結構なんでも当てはまります。スペース, comma(かんま),ピリオド などを入力した瞬間に変換されます。うっとおしい時もありますが・・

abbrev-modeの入り方は いつもの関数の評価と同じです。
M-x abbrev-mode

abbrev-mode (マイナーモード)から出たい時も 入ったときと同じコマンドを入力してください(toggle/とぐる という)。 他のマイナーモードも同じです。

さらに ちなみに「test」の単語自体を入れたいときは、展開されてしまった後 UndoまたはM-x unexpand-abbrevとやると戻せます。

静的補完の辞書ファイルを常時使うときの注意点

辞書ファイルを更新したら最後に保存することを忘れないでください。次回から使いたいときは 読み込めばOKです。 (ホントよく忘れるので)

現在の abbrev を見る& 編集 list-abbrevs
設定した abbrev を保存する write-abbrev-file
設定した abbrev を読む。 read-abbrev-file


静的補完辞書ファイルの中身は?(M-x edit-abbrevs 等をした時)

(*java-mode-abbrev-table*)

"test"      0    "success"
"sout"     10    "System.out.println();"


(editor::*c-mode-abbrev-table*)



(editor::*lisp-mode-abbrev-table*)



(*global-abbrev-table*)
      
こんな感じ。java-mode との間に空行があることに注意。
真中の数字は変換回数です。~/.abbrev_defs がデフォルトのファイルです。 開始文字位置にも気をつけてください。 編集し終わったら保存( もちろんそのバッファで edit-abbrevs-redifine : C-x C-c or C-c C-s )& (write-abbrev-file)してください。
リストが判る人は直接そのファイルを編集して自動的に上書きされないようにして保存する(終わる前によんどく)とかも可能です。


辞書ファイルを自動で読み込み&保存する設定方法

;補完ファイル
(defvar *abbrev-file-name* "~/.abbrev_defs");default
;(setq *abbrev-file-name* "~/.myabbrevs")

; 起動時に abbrev file を読み込む
(quietly-read-abbrev-file *abbrev-file-name*)
;or
(quietly-read-abbrev-file)
;or
(read-abbrev-file)

;.xyzzy に書く そうしないと動的に読んでくれない
;siteinit.l 以下に書かないように


;他の人からのパクリ
;自動的に保存 (不要になった)

(push #'(lambda ()
	  (write-abbrev-file nil))
      *kill-xyzzy-hook*)
;ファイル名は入れない場合デフォルトになります。
  ;もちろんセーブ時と読み込みは同じ名前にしておくべし。


静的補完のちょっとアドバンスな使い方応用例

静的補完時に大文字小文字を区別して補完できます
how are youを hay という字で補完させるとき、変換前の大文字状態で変換後のCapitalizeをコントロールできます。
hayhow are you
Hay/hAY/haYHow are you
HAYHow Are You
なかんじになります。
prefix (前置 文字)を無視して補完して欲しいときは
lucky に prefix を un とつけていると unlucky になります。 その un が prefixです。luckyは設定していても un-がついているため静的補完できません。

でそのように 余計な文字(un)を感知して lucky に展開できないときは

途中までprefix打つ
un
un M-'
と入力すると
un-
となる
un-lu
いつもの補完文字(lu -> lucky)を入れて C-'などと補完コマンドを入れると
unlucky

なかんじになります。


動的補完 dynamic !

動的補完機能の概要

現在のバッファ上からインタラクティブに単語を補完します。毎回バッファを走査して、単語を拾ってくるので設定ファイルなどは必要ありません。

動的補完機能の使い方

  • pと入れた直後に
  • C-x / (M-x dabbrev-expand)を入れる。
  • 同じファイルにある単語から、候補の一つが出る。(public -> private ...とか)
  • 繰り返すと次々に出る。
  • p1文字でなく、3文字だったら 3文字に先頭マッチ(一致)する候補が次々でてくる
dabbrev-expand の割り当てキー

動的補完の設定例

あらかじめ 補完モードを読む
;; dabbrev
(setq *dabbrevs-case-fold* t);大文字小文字の区別
(autoload 'dabbrev-expand "dabbrev" t)
(define-key *global-keymap* #\M-/ 'dabbrev-expand)
上の事をファイルに書いちゃってください。

私は Java Keyword を読み込んで dabbrev 用の補完単語として活用してます。 さらに buffer-renameをして 先頭に " *Java*"のようにスペースを書くと裏側で開いて表にでてきません。

dabbrev は カーソルの前の方を検索しに行っているようなので、直前のキーワードからヒットしやすくなっています。 (逆にカーソルの下側に補完したいものがあるとちょっと遠回り)それを知っておくと少し補完速度が速くなります。

動的補完カスタマイズ設定変数


# その他は lisp/dabbrev.lのexportされた変数を参考してください。

関連リンク

静的定型句も、動的補完するlisp
静的補完も完全に覚えているのが大変なので、それも動的補完の対象に含めるlisp

インデント設定方法
xyzzyで java-mode用のインデント設定方法

キーバインド設定方法
xyzzyでキーバインドの設定する方法

キーワードファイルの設定方法
xyzzyのキーワード設定方法

動的なisearchのインクリメンタルサーチに色付け
isearch.lを拡張して、色がつくようにします。


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