SKK
***

This is Edition 1.2, last updated Feb 17 1997, of The SKK Manual, for SKK, Version 9.6.

Copyright (C) 1996 1991, 1992, 1993, 1994, 1996, 1997 Masahiko Sato, Yukiyoshi Kameyama and Mikio Nakajima.  Revised by Kiyotaka Sakai and Satoshi Harauchi.

Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.

Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the sections entitled ``Copying'' and ``GNU General Public License'' are included exactly as in the original, and provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.

Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be stated in a translation approved by the Free Software Foundation.

     [file gpl.texi not included]

概要
**

SKKはNemacs, MuleおよびDemacsの上に高速で効率的な日本語入力環境を提供するシステムであり、GNU General Public Licenseに従ったフリー・ソフトウェアとして配布される。

SKKは、Simple Kana to Kanji conversion programにちなんで名付けられた。 SKKは、いわゆるローマ字入力による、文法的知識を用いない高速変換可能な日本語入力/変換プログラムである。本体部分のプログラムは、Emacs Lispにより書かれており、拡張性が高い。主な特徴は、下記の通りである。

  * 変換の単位を小さくおさえることにより、文法的知識を用いないで高速に、かつ効率的にかな漢字変換を行なう。変換単位は通常1単語であり、変換のアルゴリズムが文法的な知識を用いないので、古語、現代語、方言、文語、口語等、いずれについても同様に効率的な変換ができる。

  * 変換し選択された候補の単語をどんどん 「個人辞書」 (個人の変換内容を逐次記録している辞書。詳細は、個人辞書 を参照のこと。) に取り込むドラスティックな方法を取っており、個人で使用頻度の高い候補順に優先的に変換されるので、変換の際のヒット率が非常に高い。

  * 独立した辞書登録モードを持たず独立した登録手続きが不要で、品詞の指定など文法的知識を必要としない。

  * 登録時に辞書にない単語の変換を行なった場合には再帰的な辞書登録モードに入るなど、単語登録の手間が大幅に簡略化されている。

  * Emacsにおけるマイナーモードの変形としてインプリメントされており、SKKを起動しても日本語の入力が可能となる他は、オリジナルのメジャーモード にほとんど影響を与えず、Emacsとの親和性が高い。 See メジャーモード (GNU Emacs Manual). See マイナーモード (GNU Emacs Manual).

  * サーバープログラムを使用することにより、Emacs本体のメモリ使用の軽減を計れるが、サーバーが仮にダウンしてもSKKの使用を継続することが可能 (Emacsのバッファに辞書を取り込むので、メモリは圧迫するが、高速に辞書アクセスが可能)。

  * 変換候補としてEmacs Lispで書かれたプログラムを指定することが可能。

  * ローマ字入力を主体とするが、木構造を使ったキー入力指定が可能で、T-Code風の入力も可能である。

  * インクリメンタルサーチ用のプログラムを独自に持っており、日本語のサーチの際に特別の操作を要しない。

SKKは、複数のプログラムより構成される。プログラムの構成と主な作者は下記の通り。

本体部分及び拡張機能を提供するEmacs Lispプログラム
     大部分のコードは、佐藤雅彦 <masahiko@kuis.kyoto-u.ac.jp>により作成され、多くのボランティアにより拡張された。

     Emacs 19 baseのMule用のインクリメンタル・サーチプログラムは、榎並嗣智氏

     <enami@ptgd.sony.co.jp>により作成された。

     逆引プログラムのKAKASIインターフェイスは、中島幹夫

     <gy2m-nkjm@asahi-net.or.jp>が作成した。

     また、Emacs Lispで書かれた部分の内部処理のために、Elib (Elib とは、the GNU emacs lisp library の略で、キュー、AVL木構造、二重連結リストなどを扱うためのルーチンが入っている。See Elib (Elib - The Emacs Lisp Library).) の中のいくつかのプログラムを利用している。

辞書サーバ用のCプログラム
     亀山幸義 <kameyama@kuis.kyoto-u.ac.jp> により作成された。

辞書
     その第1版が東北大学電気通信研究所佐藤研究室の 安藤大、猪岡美紀、奥川淳一、佐々木昭彦、佐藤克志、山岸信寛の各氏により作成され、その後、多数のユーザから提供された辞書をもとに拡張された。

ユーティリティプログラム
     増井俊之氏<masui@csl.sony.co.jp>、前田憲男氏および高橋裕信氏 <takahasi@tiny.or.jp> により作成された。

インストール
******

Makefileの編集とインストール
==================

Emacsバージョン19にて使用する場合は、以下を実行する。その際、Makefile 必要に応じてを修正する。

     % ./configure
     % make
     % make install

make により、Emacs Lispプログラムがバイトコンパイルされる。 Emacsバージョン18にて使用する場合には、lisp ディレクトリに移って make -f Makefile.18 を実行することにより、Emacsバージョン18用の Emacs Lispプログラムがコンパイルされる。バージョン9のSKKでは、マクロを多用している関係から、ファイル間に依存関係が存在するので、必ず添付の Makefile、Makefile.18 を使用して make すること。

make install により、Emacs Lispプログラム、辞書、infoドキュメント、チュートリアルデーターがそれぞれ指定のディレクトリにインストールされる。

なお、このSKKディストリビューションでは、予めinfoファイルを作ってあるので、改めて作る必要はない。なお、ご自身でフォーマットし直したい場合は、 Emacsに読み込んで M-x texinfo-format-buffer することで作成できる。 Texinfoソース(このドキュメントの自身のソース)は、御覧の通り日本語で標記されており、texinfoパッケージが日本語化されていないことから、現状では infoファイルを作る方法は他にない。

.emacs の設定
==========

.emacs  (OSがMSDOSの場合は _emacs である。)に以下のフォームを挿入する。

     (global-set-key "\C-x\C-j" 'skk-mode)
     (global-set-key "\C-xj" 'skk-auto-fill-mode)
     (global-set-key "\C-xt" 'skk-tutorial)

     (autoload 'skk-mode "skk" nil t)
     (autoload 'skk-auto-fill-mode "skk" nil t)
     (autoload 'skk-tutorial "skk-tut" nil t)
     (autoload 'skk-isearch-mode-setup "skk-isearch" nil t)
     (autoload 'skk-isearch-mode-cleanup "skk-isearch" nil t)

     (add-hook 'isearch-mode-hook
               (function (lambda ()
                           (and (boundp 'skk-mode) skk-mode
                                (skk-isearch-mode-setup) ))))
     (add-hook 'isearch-mode-end-hook
               (function (lambda ()
                           (and (boundp 'skk-mode) skk-mode
                                (skk-isearch-mode-cleanup)
                                (skk-set-cursor-color-properly) ))))

上記の設定では、SKKが起動されているときのみ、付属のインクリメンタルサーチを使用する。常に付属のインクリメンタルサーチを使用したかったら上記の isearch-mode-hook、isearch-mode-end-hook の設定を下記の設定に変更する。

     (add-hook 'isearch-mode-hook 'skk-isearch-mode-setup)
     (add-hook 'isearch-mode-end-hook 'skk-isearch-mode-cleanup)

また、Emacs バージョン18では、上記の add-hook を使ったフォームは、いずれも挿入せず、代りに下記のフォームを挿入する。

     (global-set-key "\C-s" 'skk-isearch-foreward)
     (global-set-key "\C-r" 'skk-isearch-backward)

サーバーを使わない場合は、更に辞書ファイルを指定する必要がある。

     (setq skk-large-jisyo "/your/path/to/SKK-JISYO.L")

skk-large-jisyo はEmacsのバッファに取り込んで使用するので、これによりメモリが圧迫されすぎる場合は、上記の SKK-JISYO.L を SKK-JISYO.S や SKK-JISYO.M に変更する。

Emacsでは本来 C-x j と C-x J はコマンド register-to-point に、また C-j は、各メジャーモードにより newline-and-indent、eval-print-last-sexp、 picture-duplicate-line などの各コマンドに割り付けられている。SKK では C-x j を skk-auto-fill-mode に、C-j を skk-kakutei に使用するのが標準的な設定となっているので、これらのキーに元々バインドされていたEmacsのオリジナルコマンドを C-x J や C-J などの大文字キーに退避するか、逆にそれらのオリジナルコマンドを元の設定のまま残して、SKKの標準設定を変更するかどうかをユーザー側にて検討する必要がある。Emacsのオリジナルコマンドの退避などを、将来のバージョンのSKKにおいて自動化を検討する予定である。See 拡張アイディア.

サーバーのインストール
===========

サーバーを使用する場合は、本節に従いインストールを行なう必要がある。

サーバーの概略
-------

skkservは、SKKのための辞書サーバである。skkserv(サーバ)は、SKK/Emacs(クライアント)とは独立に動作する。一つのサーバは、複数のクライアントの要求を処理することができる。

サーバは、起動されると最初にSKK形式の辞書を読みこむ。次に、無限ループに入り、クライアントからの要求を待つ。サーバは、接続を要求したクライアントごとに通信路を作り、以後、そのクライアントから文字列変換の要求が起きる毎に辞書を検索して変換文字列を返す。クライアントは、文字列変換要求以外に、サーバのバージョン番号要求や接続終了などのメッセージをサーバに送る。

サーバとクライアントの間の通信には、BSD系UNIXのソケットを利用する。 System V系UNIXでもBSD系のネットワーク機能を取りこんでいるものは動作することがある。詳しくは skkserv/Makefile の記述を参照のこと。 skkservのテストは、SunOS 4.0.3, 4.1.1、NEWS OS 4.1.1、Ultrix V4.1、 System V release 4.0 の上で行った。また、ユーザのレポートによると、インストール時に適切な設定をすることにより、HP-UX、MassComp、386BSD、FreeBSD、 Linuxなどの上でも動作することがわかっている。

サーバとクライアントは、ネットワークで接続された異なる計算機上で動かすことができる。

共通の設定
-----

サーバーを使用する場合には、.emacs や .skk を使って skk-server-host、skk-server-prog 及び skk-server-jisyo の設定を行なわなければならない。

skk-server-host
     辞書サーバーを走らせるホスト名。

skk-server-prog
     辞書サーバープログラム(フルパスで指定する)。

skk-server-jisyo
     サーバーに渡す辞書(フルパスで指定する)。

hogehoge ホストの、 /usr/local/libexec/emacs に辞書サーバープログラムを、

/usr/local/share/emacs/site-etc に置くのであれば、

     (setq skk-server-host "hogehoge")
     (setq skk-server-prog "/usr/local/libexec/emacs/skkserv")
     (setq skk-server-jisyo "/usr/local/share/emacs/site-etc/SKK-JISYO.L")

のように指定する。また、上記の設定は、環境変数を利用して下記のように設定することで代えることができる。

Bシェルの場合

          export SKKSERVER=hogehoge
          export SKKSERV=/usr/local/libexec/emacs/skkserv
          export SKK_JISYO=/usr/local/share/emacs/site-etc/SKK-JISYO.L

Cシェルの場合

          setenv SKKSERVER hogehoge
          setenv SKKSERV /usr/local/libexec/emacs/skkserv
          setenv SKK_JISYO /usr/local/share/emacs/site-etc/SKK-JISYO.L

なお、既に skkserv が立ち上がっている場合は、上記の skk-server-host、skk-server-prog、skk-server-jisyo あるいはそれらの環境変数はいずれも参照されないが、skkserv が立ち上がっていないときは、これらの変数を参照して skkserv を立ち上げようとするので、安全のためにこれらの変数を設定しておく方が良い。

スーパーユーザの権限を持つ人の場合
-----------------

まず、skkserv/Makefile を編集する。自分の計算機の状況に応じて、以下の変数の値を変更する。

SERVERDIR
     skkservがインストールされるディレクトリであり、通常 $EMACS/ETC にする。Emacs 19.29以上のバージョンでは、wakeup など、かつて $EMACS/ETC に置かれていたプログラムは、 /usr/local/libexec/emacs/19.33/i586-pc-linux-gnu/ のような libexecディレクトリに配置されるようになったので、SERVERDIR もこちらを指定するのが良いであろう。

JISYODIR
     辞書がインストールされるディレクトリであり、通常 $EMACS/ETCにする。

JISYO
     SKK辞書の名前であり、通常 SKK-JISYO.L とする。

次に skkserv をコンパイルする。

     % make

最後にスーパーユーザになり、skkserv をインストールする。

     % su
     Password: XXXXXXXX
     # make install

次に/etc/services に以下の行を追加する。

     skkserv         1178/tcp

また、/etc/rc.local に以下の行を追加する。

     if [ -x /your/path/to/skkserv ]; then
             /your/path/to/skkserv /your/path/to/SKK-JISYO.L
     fi

NIS(旧名YP)を使っている場合は、更にNISのマスタサーバとなっている計算機でスーパーユーザになり、/etc/services に

     skkserv               1178/tcp        skk-jisyo-server

という行を加えた後、

     # cd /var/yp (または cd /etc/yp)
     # make services

とする。

スーパーユーザの権限を持たない人の場合
-------------------

まず、skkserv/Makefile を編集する。

SERVERDIR
     skkserv の置き場所である。任意のディレクトリを設定する。

Makefile の後の項目については、スーパーユーザの権限を持つ人の場合 を参照のこと。

次に、skkserv を作り、インストールする。

     % make
     % make install

~/.emacs や ~/.skk に

     (setq skk-server-portnum 1178)

を追加する  (この変数は、バージョン8までは、skk-portnum という名前だったので注意すること。)。

SKKを使う前に skkserv を動かす計算機の上で、自分で

     % skkserv /your/path/to/SKK-JISYO.L

としてサーバーを起動する。これは、サーバーがSKK呼出し時に自動的に起動されるようになっているのだが、必ずしも成功しないためである。 SKK-JISYO.L をフルパスで指定する代りに環境変数 SKK_JISYO を利用することもできる。See 共通の設定.

基本的な使用方法
********

基本的な使用方法をまとめた本章を読むことで、とりあえずSKKを使ってみるには困らないはずである。SKKの変換方法に慣れるには、付属のチュートリアルプログラムが最適なので、お試しいただきたい。

なお、次章の「便利な応用機能とユーザーオプション」は、興味のある個所のみをピックアップしてお読みになれば良いと思う。

起動と終了
=====

SKKを起動するには C-x C-j、もしくは C-x j とタイプする。起動すると、モードラインの左端が--かなとなるので、これで確認できる。また、カーソルの色がreverseVideoがoffのときはcoral4に、onのときは pinkになる  (カラーディスプレイを使用し、カラー表示をサポートしているWindow System下で対応するEmacsを使用している場合。Emacs 18にはカーソル色の変更機能はない。)。

起動時にタイプした C-x C-j、もしくは C-x j を再度タイプすることで、SKKを終了しオリジナルのモードに戻る。カーソル色はreverseVideoが offのときはblackに、onのときはwhileに戻る。但し、変換を行なわないモードである「アスキーモード」では C-j のキーバインドがSKK用に変更されている以外は、SKKを起動する前のオリジナルのモードと変わりがないので、 SKKを終了する必要はほとんどない。See アスキーモード.

C-x j とタイプすれば、オートフィルモード (see Auto Fill (GNU Emacs Manual).)をオンにし、かつSKKを起動する。既にオートフィルモードがオンになっているバッファで C-x j をタイプすると、SKKは起動されるが、オートフィルモードはオフになるので注意すること。バッファの状態にかかわらず強制的にオートフィルモード付でSKKモードを起動したい場合は、M-1 C-x j や C-u C-x j などとタイプし、このコマンドに正の引数を渡す  (「引数」については、Arguments (GNU Emacs Manual) を参照のこと。)。オートフィルモードをオフにし、かつSKKモードも終了したい場合には M-- C-x j や C-u -1 C-x j などとタイプし、このコマンドに負の引数を渡す。

C-x C-c でEmacsを終了しようとすると skk-jisyo に個人辞書の内容を自動的に保存する。See 個人辞書. skk-backup-jisyo に保存を行なう前の辞書が退避される。個人辞書を保存せずEmacsを終了させたい場合には、

     M-x skk-kill-emacs-without-saving-jisyo

とタイプする。個人辞書の保存動作について更に詳しくは、個人辞書の保存動作 を参照のこと。

モード
===

SKKが起動されている状態を「SKKモード」という。SKKモードは、いわゆるマイナーモードの変形 (何故「変形」なのかと言うと、SKK用のキーマッピングにEmacs19で装備された minor-mode-map-alist を利用していないため。) としてインプリメントされており、他のメジャーモードやマイナーモードの動作に可能な限り影響を与えないように設計されている (self-insert-command をそのメジャーモード独自のコマンドに割り付けるようなモード、もしくは、該当のキーマップが suppress-keymap されており、多くのキーが undefined に割り付けられるようなメジャーモードでは、SKKモードの起動により受ける影響は大きくならざるを得ない。「可能な限り」と断わりを入れたのはこのためである。)。 SKKモードは、更に文字種類による4種類の「入力モード」と、変換状態によ

り3つの「変換モード」を持つ。本章では、入力モードと変換モードについて説明する。 See マイナーモード (GNU Emacs Manual).

入力モード
-----

入力モードは、文字種別により下記の4種類に分類される。

「かなモード」
     英小文字で入力されたローマ字をひらがなに変換するモード。モードラインの最左部分は、--かなとなる。カーソルの色がreverseVideoがoffのときはcoral4に、onのときはpinkになる。

「カナモード」
     英小文字で入力されたローマ字をカタカナに変換するモード。モードラインの最左部分は、--カナとなる。カーソルの色がreverseVideoがoffのときはforestgreenに、onのときはgreenになる。

「全英モード」
     英小文字、英大文字を全角アルファベットに変換するモード。モードラインの最左部分は、--全英となる。カーソルの色がgoldになる(reverseVideo のoff/onともに同一色)。

「アスキーモード」
     変換を行なわないモード。入力されたキーは C-j を除いて通常のEmacsのコマンドとして解釈される。モードラインの最左部分は、--SKKとなる。カーソルの色がreverseVideoがoffのときはivory4に、onのときはgrayになる。

入力モードに伴なうカーソル色の変更方法については、入力モードを示すカーソル色に関する設定 を参照のこと。

各入力モードの変更を行なうキーは下記の通り。

q
     「かなモード」、「カナモード」間をトグルする。

l
     「かなモード」または「カナモード」から「アスキーモード」へ。

L
     「かなモード」または「カナモード」から「全英モード」へ。

C-j
     「アスキーモード」または「全英モード」から「かなモード」へ。

実際にはカナモードや全英モードで長時間入力を続けることはほとんどないので、かなモードのままでカナ文字や全英文字を入力する便法が用意されている。 See 入力モードの一時変更.

変換モード
-----

変換モードは、次の3種類のいずれかである。

「確定入力モード(■モード)」
     漢字変換は行われないが、入力モードに応じて、ローマ字からひらがな、ローマ字からカタカナ、あるいはアスキー文字から全角アルファベットへの文字変換を行なうモード。

「▽モード」
     漢字変換の対象となる文字列を入力するモード。

「▼モード」
     ▽モードで漢字変換の対象となる文字列を確定した後、その文字列の変換を行うモード。

また、▽モードの変種として SKK abbrev mode があり、▼モードのサブモードとして、「辞書登録モード」がある。

■モード
....

確定入力モードを「■モード」と呼ぶ。■モードでは、漢字変換は行われないが、入力モードに応じて、ローマ字からひらがな、ローマ字からカタカナ、あるいはアスキー文字から全角アルファベットへの文字変換を行なう。変換を行なうカレントバッファにこのモード特有のマークは表示されない。

かなモード、カナモードで、かつ■モードである場合、入力方法はいわゆるローマ字入力である。訓令式、ヘボン式のどちらによっても入力することができる。主な注意点のみ以下に述べる。

  * んは n n または n ' で入力する。直後に n、 y 以外の子音が続くときは n だけで入力できる。

  * 促音は、c h o t t o => ちょっと、m o p p a r a => もっぱらのように次の子音を重ねて入力する。

  * 促音や拗音(ひらがなの小文字)を単独で入力するときは、x a => ぁ、x y a => ゃなどのように x を用いる。

  * 長音には、- を用いる。- => ー。

▽モード
....

「▽モード」では、変換の対象となる文字列を入力する。かなモード、もしくはカナモード  (see かなモード、カナモード.) で、かつ、■モードであるときに 、ローマ字入力を大文字で開始することで、 ▽モードに入る。例えば、

     K a n j i

     ------ Buffer: foo ------
     ▽かんじ
     ------ Buffer: foo ------

のようにタイプすることで、▽モードに入り、続けて漢字変換の対象となる文字列を入力してゆくことができる。▽マークは、▽モードであるという表示であり、また、変換開始点を示す表示でもある。

K の文字を大文字で入力し忘れた場合は、変換の対象としたい文字列の先頭までポイント (see ポイント (GNU Emacs Manual).)を戻し Q をタイプすることで▽モードに入ることができる。例えば、下記のように行なう(-!-の地点にカーソルがある)。

     k a n j i

     ------ Buffer: foo ------
     かんじ-!-
     ------ Buffer: foo ------

     C-u 3 C-b, Q

     ------ Buffer: foo ------
     ▽-!-かんじ
     ------ Buffer: foo ------

     C-e

     ------ Buffer: foo ------
     ▽かんじ-!-
     ------ Buffer: foo ------

誤って▽モードに入ってしまったときは C-j とタイプし、■モードに戻るか C-g とタイプし▽モードで変換と対象となっている文字列を消去するかの 2 通りの処理の方法がある。具体例を下記に示す。

     K a n j i

     ------ Buffer: foo ------
     ▽かんじ
     ------ Buffer: foo ------

     C-j

     ------ Buffer: foo ------
     かんじ
     ------ Buffer: foo ------

あるいは、

     K a n j i

     ------ Buffer: foo ------
     ▽かんじ
     ------ Buffer: foo ------

     C-g

     ------ Buffer: foo ------

     ------ Buffer: foo ------

7がつ24にちのように大文字から始めることができない文字列について、 ▽モードにしたい場合は Q をタイプし、▽モードにしてから7がつ24にちの文字列を入力する。なお、▽モードでは、文字列の間に空白を含めることはできない  (これは、辞書の見出し語に空白を含めることができない制限からきている。)。

▼モード
....

「▼モード」では実際の変換作業を行なう。▽モードで変換対象とする文字列を入力した後 SPC をタイプすることで▼モードに入る。▽マークから SPC をタイプしたときのポイントまでの文字列σが変換の対象となる文字列として確定し、▽マークは▼マークで置き換えられ、文字列σが辞書の中で検索される。仮に、辞書に

     かんじ /漢字/幹事/

というエントリ  (本マニュアルでは、見出し語と候補群を合わせた一行の意味で使用している。詳細は、辞書の形式 を参照のこと。) を含むとして、例を示す。

     K a n j i

     ------ Buffer: foo ------
     ▽かんじ-!-
     ------ Buffer: foo ------

     SPC

     ------ Buffer: foo ------
     ▼漢字-!-
     ------ Buffer: foo ------

この例では、▽モードにおける▽マークからポイントまでの間の文字列かんじが変換対象の文字列σとして確定し、その文字列σについて辞書内での検索が行なわれている。実際の変換動作では、候補部分がハイライト表示される  (ハイライト表示はEmacsのOverlaysの機能を使用している。Emacs 18ではOverlaysが実装されていない。)。

漢字が求める語である場合は C-j をタイプすれば、この変換が確定し、ハイライト表示も▼マークも消える。また C-j をタイプせずに、続けて新たな確定入力を行ない、あるいは新たな変換を開始することができる。この場合、直前の変換は自動的に確定される。これを「暗黙の確定」と呼ぶ。副作用として確定を伴なうキーは、印字可能な文字全てと RET である。但し、暗黙の確定のタイミング 参照のこと。

求めるものが漢字でなければ、更に続けて SPC をタイプすることで、文字列σに対する次候補を検索する。

     ------ Buffer: foo ------
     ▼漢字
     ------ Buffer: foo ------

     SPC

     ------ Buffer: foo ------
     ▼幹事
     ------ Buffer: foo ------

候補が5つ以上あるときは5番目以降の候補は7つずつまとめてエコーエリアに表示される。例えば、辞書が

     きょ /距/巨/居/裾/嘘/拒/拠/虚/挙/許/渠/据/去/

というエントリを含むときに K y o の後に SPC を5回続けて打てば、

     -------------------- Echo Area --------------------
     A:嘘  S:拒  D:拠  F:虚  J:挙  K:許  L:渠  [残り 2]
     -------------------- Echo Area --------------------

がエコーエリア  (エコーエリアとミニバッファは視覚的には同一の場所にあるが、エコーエリアが単にユーザーへのメッセージを表示するのみであるのに対し、ミニバッファは独立のバッファとして機能する点が違う。) に表示される。ここで仮に許を選択したければ、kを入力する。A, S, D, F, J, K, L の各文字は、押し易さを考慮してキーボードのホームポジションから横方向に一直線に配置されているキーが選定されている。また、候補の選択のために押すキーは、大文字、小文字のいずれでも良い。候補の選択に用いるキーの変更については、候補の選択に用いるキー を参照。

SPC を連打してしまい、誤って求める候補を通過してしまったときは x により前候補/前候補群に戻ることができる  (x は小文字で入力する必要がある)。

候補を次々と探しても求めるものがなければ、自動的に辞書登録モードになる (辞書登録モードは▼モードのサブモードである) 。これについては辞書登録モード にて後述する。

次に送り仮名のある単語について説明する。動くを変換により求めたいときは U g o K u のように、まず▽モードに入るために U を大文字で入力し、次に送り仮名の開始をSKKに教えるために K を大文字で入力する。送り仮名の K をタイプした時点で SPC をタイプすることなく、▼モードに入り変換が行なわれる。送り仮名の入力時、ローマ字プレフィックスが挿入された瞬間に、プレフィックスの直前に * を一瞬挿入し、送り仮名の開始時点を明示する。プレフィックスに続くキー入力で、かな文字が完成した時点で * は消える。キー入力を分解して追いながらもう少し詳しく言うと、下記のようになる。

     U g o

     ------ Buffer: foo ------
     ▽うご
     ------ Buffer: foo ------

     K

     ------ Buffer: foo ------
     ▽うご*k
     ------ Buffer: foo ------

     u

     ------ Buffer: foo ------
     ▼動く
     ------ Buffer: foo ------

SKKではこのように送り仮名の開始地点をユーザーが明示的に入力するために、システム側で送り仮名を分解する必要がなく高速でヒット効率が高い変換が可能である。See 送り仮名の自動処理.

但しサ変動詞の変換では、サ変動詞の語幹となる名詞を「送りなし変換」 (詳細は、送りなし変換 を参照のこと。) として変換し、その後するを■モードで入力した方が現状では効率が良い。See サ変動詞の入力.

辞書登録モード
.......

SKKは独立の辞書登録モードは持たない。辞書にない単語についての変換を行なった場合に、変換の継続動作として辞書登録モードに入る。例えば辞書に

     へんかんちゅう /変換中/

のエントリがない場合に、変換中を得ようとして、H e n k a n t y u u SPC とタイプすると、下記のように、カレントバッファは▼モードのまま へんかんちゅう に対して変換ができない状態で休止し、同時にミニバッファに へんかんちゅう というプロンプトが表示される。

     ------ Buffer: foo ------
     ▼へんかんちゅう
     ------ Buffer: foo ------

     ------ Minibuffer -------
     へんかんちゅう-!-
     ------ Minibuffer -------

辞書登録モードでは、入力はミニバッファに対して行われる。仮に辞書に

     へんかん /変換/
     ちゅう /中/

のようなエントリがあるとして、ミニバッファで変換中の文字列を変換と中とに分けて作る。

     H e n k a n SPC T y u u SPC

     ------ Minibuffer -------
     へんかんちゅう 変換▼中
     ------ Minibuffer -------

ここで RET をタイプすれば 変換中 が個人辞書に登録され、辞書登録モードは終了する  (ここでも暗黙の確定が行なわれるのでC-j をタイプする必要はない。但し、▼モードでのRET を参照のこと。)。同時に変換を行なっているカレントバッファには、変換中 が挿入され確定される。See 個人辞書.

送り仮名のある単語の登録では、ミニバッファで作る候補に送り仮名そのものを登録しないように注意しなければならない。仮に辞書に

     うごk /動/

というエントリがないとして、例を一つ述べる。

     U g o K u

     ------ Buffer: foo ------
     うごく
     ------ Buffer: foo ------

     ------ Minibuffer -------
     うご*く-!-
     ------ Minibuffer -------

ミニバッファで辞書登録すべき文字列は、動のみであり、送り仮名のくは含めない。動くを登録してしまうと、次に U g o K u とタイプしたときに出力される候補が動くくになってしまう。

     D o u SPC

     ------ Minibuffer -------
     うご*く 動-!-
     ------ Minibuffer -------

     RET

     ------ Buffer: foo ------
     動く
     ------ Buffer: foo ------

サ変動詞(名詞の後にするを付けた形で構成される動詞) については、するを送り仮名とした送りあり変換  (送り仮名を伴なう変換。詳細は、送りあり変換 を参照のこと。) を行なわず、運動とすると分けて入力した方が効率が良い (名詞とそのサ変動詞とを別々に辞書に持ったのでは空間的な効率が悪いので、基本的に、辞書がサ変動詞を送りありとして意識した作りとしていない。従い、するを送り仮名とした送りあり変換では、辞書に候補がなく辞書登録モードに入ってしまう可能性が大きいので、名詞として分解して入力することを勧めている。一方、このように名詞に分解して入力することで、サ変動詞になり得ない名詞が候補として出てくることもあり(例えば孝行する という変換を行ないたい場合に高校が出てくるなど)、候補の絞り込みという点では必ずしも効率が良くないので、将来のバージョンにおいて改善する方向で検討を進めている。詳細は、拡張アイディア を参照のこと。)。例えば運動するは U n d o u SPC s u r u とタイプすることにより得られる。名詞から作られる形容詞等も同様である。

誤まって辞書登録モードに入ったときは C-g をタイプするか、もしくは何も登録せず RET をタイプすると▽モードに戻る。

ミニバッファを再帰的に使い辞書登録を再帰的に行なうことができる。仮に辞書に

     さいきてき /再帰的/
     さいき /再帰/

のようなエントリがなく、かつ

     さい /再/
     き /帰/
     てき /的/

のようなエントリがあるとする。ここで S a i k i t e k i SPC とタイプすると、文字列さいきてきに対する候補を見つけられないので、ミニバッファにさいきてきというプロンプトを表示して辞書登録モードに入る。

さいきてきに対する辞書エントリを作るため S a i k i SPC とタイプすると、更にこの候補も見つけられないので、ミニバッファにさいきというプロンプトを表示して、再帰的にさいきの辞書登録モードに入る。S a i SPC K i SPC とタイプすると、ミニバッファは、

     ------ Minibuffer -------
     さいき 再▼帰
     ------ Minibuffer -------

となる。ここで RET をタイプすると、個人辞書には

     さいき /再帰/

というエントリが登録され、ミニバッファはさいきてきの辞書登録モードに戻り、プロンプトはさいきてきとなる。今度は再帰が変換可能なので S a i k i SPC T e k i SPC とタイプすると、

     ------ Minibuffer -------
     さいきてき 再帰▼的
     ------ Minibuffer -------

となる。ここで RET をタイプすることで、さいきてきの辞書登録モードから抜け、個人辞書に

     さいきてき /再帰的/

というエントリが登録される。カレントバッファのポイントには、再帰的が挿入される。

改行文字を含む文字列を辞書に登録するには、辞書登録モードで改行文字を C-q C-j により入力する。例えば、

     〒980
     仙台市青葉区片平2-1-1
     東北大学電気通信研究所

を辞書に登録するには、辞書登録モードで、

     〒980,
     C-q C-j,
     仙台市青葉区片平2-1-1,
     C-q C-j,
     東北大学電気通信研究所,
     RET

と入力する。

インクリメンタル・サーチ
============

SKKでは、専用のインクリメンタル・サーチプログラムをEmacs添付のisearch.el のラッパーとして実装しており、日本語の文字列についてのインクリメンタル・サーチ(通常の文字列も正規表現を用いたものも両方)をアスキー文字と同様の操作で行なうことができる。しかも大部分の動作は、オリジナルのインクリメンタル・サーチのもののままである。従ってオリジナルのインクリメンタル・サーチのコマンド(M-y の isearch-yank-kill や M-p の isearch-ring-retreat, M-n の isearch-ring-advance など)やユーザー変数でのカスタマイズ(search-highlight など)もそのまま利用できる。オリジナルのインクリメンタル・サーチについては、 Incremental Search (GNU Emacs Manual) を参照のこと。

インクリメンタル・サーチ中の入力方法は、通常のバッファにおける各入力モード、変換モードでの入力方法と同一である。

C-s や C-r、あるいは M-C-s や M-C-r でインクリメンタル・サーチを起動すると、インクリメンタル・サーチを起動したバッファの入力モードと同一の入力モードで、キーとなる文字の入力が可能となる。入力モードに合わせて、インクリメンタル・サーチのプロンプトが表示される。プロンプトの種類は、以下の5つである。

I-search: [aa]
     アスキーモード

I-search: [か]
     かなモード

I-search: [カ]
     カナモード

I-search: [英]
     全英モード

I-search: [--]
     インクリメンタル・サーチモードで C-x C-j などをタイプしてSKKを終了した場合は、このプロンプトが表示される。

便利な応用機能とユーザーオプション
*****************

予備知識
====

以下のセクションで応用機能とユーザーオプションについて述べるが、その前に SKKのファイル構成やユーザーオプションの設定についての一般的注意を述べる。また、辞書の形式や設定方法についても詳述しておく。辞書の形式や設定方法を理解することで、様々な応用機能がどう動くのかを理解する助けとなる。

ファイル構成
------

SKKバージョン9.6では、応用機能を提供するプログラムのほとんどを skk.el とは別のファイルに収め、必要に応じ、オートロードするように設計されている。各応用機能の概略と該当のファイル名について説明する。

skk-auto.el
     送り仮名の自動処理を行なうプログラムを集めたファイル。 See 送り仮名の自動処理.

skk-comp.el
     見出し語の補完を行なうプログラムを集めたファイル。See 見出し語の補完.

skk-e18.el
     Emacs 18専用プログラムを集めたファイル。

skk-e19.el
     Emacs 19専用プログラムを集めたファイル。

skk-gadget.el
     プログラム実行変換を行なうプログラムを集めたファイル。 See プログラム実行変換.

skk-kakasi.el
     KAKASIインターフェイスプログラムを集めたファイル。 See リージョン一括変換.  See KAKASI.

skk-kcode.el
     漢字コードまたはメニューによる文字入力を行なうプログラムを集めたファイル。 See 漢字コードまたはメニューによる文字入力.

skk-num.el
     数値変換を行なうプログラムを集めたファイル。See 数値変換.

skk-server.el
     SKKサーバーインターフェイスプログラムを集めたファイル。 See サーバー関連.

skk-tree.el
     有限状態オートマトンを用いた変換を行なうプログラムを集めたファイル。 See 有限状態オートマトンを用いた変換.

skk-vip.el
     VIPインターフェイスプログラムを集めたファイル。See VIPとの併用.

なお、Elibより avltree.el、elib-node.el、queue-m.el、 stack-m.el、string.el の各ファイルをピックアップしている。その内、avltree.el は、オリジナルのバグと思われる個所を修正してある。また、string.el は、スピードアップを図って少し手を入れている。いずれもオリジナルの動作とは何ら違わないので、SKK配布のものを使用せずに既に持っているElibを使用しても問題はない。

ユーザーオプションの設定方法
--------------

以前のバージョンのSKKでは、どのようなカスタマイズが行なわれている場合でもチュートリアル使用時に標準設定に戻す目的で変数の宣言に defconst を使用していた関係からSKKに関する全ての設定は ~/.skk で行なう必要があったが、バージョン9より defvar を使用した宣言を行なうようにしているので、他のEmacs Lispパッケージ同様 ~/.emacs で設定を行なうことができるようになった。また、従来通り ~/.skk が使える他、各種フックを利用することもできる。上記のファイルやフックを利用した設定がいつ有効になるのか、という点について下記に述べる。

.emacs
     Emacsを起動したときに一度だけ評価される。バッファに関係しないグローバル変数の設定やフックの設定などを行なう場合が多い。OSがMSDOSの場合は _emacs である。 See .emacs (GNU Emacs Manual).

.skk
     SKKを起動したときに一度だけロードされる。バッファに関係しないグローバル変数の設定などを行なう場合が多い。OSがMSDOSの場合は _skk というファイル名がディフォルトである。~/.skk のファイル名は skk-init-file で変更することができる。また、このファイルを自動的にバイトコンパイルする機能がインプリメントされている。詳細は、 skk-init-fileのバイトコンパイル を参照のこと。

skk-mode-hook
     C-x C-j とタイプしてSKKモードを起動するたびにコールされる。バッファローカルの設定などを行なう場合が多い。

skk-auto-fill-mode-hook
     C-x j とタイプしてSKKモードをオートフィルモード付きで起動するたびにコールされる。バッファローカルの設定などを行なう場合が多い。

skk-load-hook
     skk.el のロードを完了した時点でコールされる。.skk はSKKモードを起動しなければロードされないのに対し、このフックは、skk.el をロードしたらSKKモードを起動しなくともコールされる点が違う。

skk-auto-load-hook
skk-comp-load-hook
skk-e18-load-hook
skk-e19-load-hook
skk-gadget-load-hook
skk-kakasi-load-hook
skk-kcode-load-hook
skk-num-load-hook
skk-server-load-hook
skk-tree-load-hook
skk-vip-load-hook
     skk-auto.el, skk-comp.el, skk-e18.el, skk-e19.el, skk-gadget.el, skk-kakasi.el, skk-kcode.el, skk-num.el, skk-server.el, skk-tree.el, skk-vip.el の各ファイルがロードを完了した直後にコールされるフック。

skk-vip-mode-hook
     VIPを併用している場合で、skk-mode を起動したときにコールされるフック。See VIPとの併用.

メニューバー (see メニューバー (GNU Emacs Manual).)が使用できる環境では、SKKモード起動時にメニューバーを使って、オン/オフトグルに設定できるユーザーオプションの設定が変更できる (例えば skk-roma-kana-a など、オン/オフの設定ではなく複雑なリストを指定しなければならないユーザーオプションについては、メニューバーからは設定できない。これらの簡便な設定ユーザーインターフェイスについては、将来のバージョンにて検討する。See 拡張アイディア.)。ここで変更した設定はEmacs終了時に保存するかどうかを確認され、保存を選択した場合は、その設定が .skk に保存される。.emacs より後に .skk がロードされるので、メニューバーよりユーザーオプションの設定の変更が行なわれた場合は、.skk にその設定が保存される。

辞書の形式
-----

辞書の種別は大きく分けて「共有辞書」と「個人辞書」の2つがある。

共有辞書
     付属の SKK-JISYO.S(「S辞書」), SKK-JISYO.M(「M辞書」), SKK-JISYO.L(「L辞書」) などがあり、通常は個人辞書よりもサイズが大きく、省資源の面からユーザー間で共有され、参照のみされる辞書で、使用中にSKKにより内容の変更が行なわれることはない。

個人辞書
     変数 skk-jisyo で指定されるファイルであり、SKKを一番最初に使い始めたときにホームディレクトリに自動的に作られ、その後の使用により日々刻々と更新されてゆく辞書である。

他には skk-initial-search-jisyo や skk-kakutei-jisyo などがあるが、これらは個人毎に持つものを使用しても良いし、ユーザー間で共有しているものを使用しても良く、共有辞書、個人辞書という区分にはいずれにも属さない。その性格から、辞書内容の更新は行なわれず、参照のみ行なわれる。また使用目的から通常はサイズが小さい。

個人辞書、skk-initial-search-jisyo, skk-kakutei-jisyo は Emacsのバッファに読み込んで検索を行なう。共有辞書は設定によりEmacsのバッファに読み込んで使用する方法と、サーバー経由で使用する方法とがある。

個人辞書の一例を挙げる。

     ;; okuri-ari entries.
     たとe /例/[え/例/]/
     もt /持/[つ/持/]/[って/持/]/[た/持/]/[て/持/]/[ち/持/]/[と/持/]/
     たすk /助/[け/助/]/
     うごk /動/[く/動/]/[か/動/]/[け/動/]/[き/動/]/[こ/動/]/
     ふくm /含/[め/含/]/[む/含/]/[ま/含/]/[み/含/]/[も/含/]/
     ...
     ;; okuri-nasi entries.
     てん /点/・/天/
     ひつよう /必要/
     さくじょ /削除/
     へんこう /変更/
     じゅんじょ /順序/
     ぐん /群/郡/
     こうほ /候補/
     いち /位置/一/壱/
     ...

てん /点/・/天/ を例に取ると、てんが見出し語であり、その候補が、点、・、天である。候補はそれぞれ、/によって区切られている。見出し語と候補群を合わせた てん /点/・/天/ の一行を「エントリ」と呼ぶ。

辞書はプレーンなテキストファイルで、最低限下記の2つの行を持つ。

     ;; okuri-ari entries.
     ;; okuri-nasi entries.

この2つの行は、それぞれ送り仮名あり、送り仮名なしのエントリの開始地点を示すマークである。;; okuri-ari entries. までの行で ; を行頭に持つ行はコメント行として無視される。;; okuri-ari entries. 以降にコメント行を含むことはできないので、注意すること。

;; okuri-ari entries. と ;; okuri-nasi entries. の間に囲まれた上半分の部分が送り仮名ありのエントリである。これを「送りありエントリ」と呼ぶ。;; okuri-nasi entries. 以下の下半分部分が送り仮名なしのエントリである。これを「送りなしエントリ」と呼ぶ。また送りありエントリを検索する変換を「送りあり変換」、送りなしエントリを検索する変換を「送りなし変換」と呼ぶ。SKKでは送り仮名の有無が変換方法の1つの種別となっているので、基本的には、送り仮名がある変換では送りありエントリのみが検索され、送り仮名がない変換では送りなしエントリのみが検索される。

1つの見出し語についてのエントリは1行内に書かれる(2行以上にまたがることはできない)。改行を含む候補については、(concat "改\n行") のように、評価すると改行を該当個所に挿入するようなLispプログラム (see プログラム実行変換)に候補を変換して辞書に収めている。行頭から空白までの文字列が見出し語である。空白以降/ と / とに囲まれた文字列がそれぞれの候補である。例えば、

     じしょ /辞書/自署/

は、見出し語じしょについてのエントリで、その候補は、辞書と自署の2つである。

送りありエントリは、基本的にはもt /持/のようになっており、送り仮名部分は、送り仮名をローマ字表現したときの1文字目(あるかな文字をローマ字表現したときの1文字目を「ローマ字プレフィックス」と呼ぶ。)で表現されている。この1エントリで 持た、持ち、持つ、持て、持との5つの候補に対応している。その5つの候補の送り仮名をローマ字プレフィックスで表現すれば、いずれも t になる。

さて、個人辞書の送りありエントリには [ と ] に囲まれたブロックがあるが、これは、そのブロックの先頭にある平仮名を送り仮名に取る候補群である。上記の例で見ると、見出し語たとeの場合はえを送り仮名とする1つのブロックから構成されており、見出し語ふくmの場合は、ま、み、む、め、もを送り仮名とする5ブロックに分けられている。

この送り仮名毎のブロック部分は、skk-henkan-okuri-strictly あるいは
 skk-auto-okuri-process のいずれかの変数が non-nil である場合に、検索の際、見出し語としてはマッチしても、更に送り仮名もマッチするのかどうかをテストするために使用される。例えば、

     おおk /大/多/[く/多/]/[き/大/]/

というエントリがあれば、同じ見出し語おおkであっても送り仮名がきであれば、候補は大のみであって多は無視される。 See skk-henkan-okuri-strictly. See skk-auto-okuri-process.

現在のところ、付属の共有辞書では、[ と ] を使用した送り仮名毎のブロックの形式に対応していない。個人辞書のみがこの形式で書き込まれてゆく。skk-henkan-okuri-strictly が nil であっても送り仮名のブロック形式で書き込まれる。但し skk-process-okuri-early の値が non-nil であれば、送り仮名を決定する前に変換を開始することになるので、送り仮名を明示的に入力していても個人辞書には [ と ] に囲まれた送り仮名毎のブロックは作られないので注意すること (変換開始の直前に内部変数に送り仮名を保存するのだが、送り仮名の確定前に変換を開始するので、個人辞書も送り仮名対応ブロックが作られない。ただ、確定時点では送り仮名が分っているので、確定時点で送り仮名を検索し直し、個人辞書に送り仮名対応ブロックを作ることは可能だが、skk-process-okuri-early を利用するユーザーにとっては、それは無駄なことなのであろう。)

 (SKKバージョン8では、送り仮名毎のブロックが個人辞書内に既に作られていても
 skk-process-okuri-early を non-nil にして確定すると、該当する送りありエントリの送り仮名ブロックの部分が削除されていたが、バージョン9より、既に存在する送り仮名ブロックを保存されるように改良した。skk-process-okuri-early を常に non-nil で使用するユーザーにとってはあまり有り難い話ではないのかもしれないが、色々なユーザーオプションを試してみようとするユーザーにとっては、skk-process-okuri-early を一時期 non-nil にしたばっかりに個人辞書の送り仮名情報がことごとく破壊されるのは酷であろう。ちなみにここで言う「送り仮名ブロックの保存」にかかるコストは大したことはない。)。 See skk-process-okuri-early.

共有辞書では、送りありエントリは ;; okuri-ari entries. から順に下方向に、見出し語をキーとして降順に配置されている。送りなしエントリは、 ;; okuri-nasi entries. から順に下方向に、見出し語をキーとして昇順に配置されている。降順、昇順に配置されているのは、辞書サイズが大きいことに配慮してバイナリサーチを行なうためである。なお、ソートする際には、見出し語をunsigned-charと見なしている。この順序はEmacsが string< で文字列を比較するときの順序であり、UNIXの sort コマンドでの標準の順序とは異なるので注意が必要である。Emacsのコマンド sort-lines を用いればファイルをこの順序でソートすることができる  (Emacsコマンドの sort-columns は内部的にUNIXコマンドの sort を使っているので、辞書のソートには使わないこと。)。

一方、個人辞書は上の例でも見たように、それぞれ ;; okuri-ari entries.,

;; okuri-nasi entries. を基点として、一番最後に変換を行なったものがそれぞれのミニマムポイント  (正確に言えば、送りあり変換では skk-okuri-ari-min + 1 の位置、送りなし変換では
 skk-okuri-nasi-min + 1 の位置である。) に挿入され辞書が更新される。個人辞書は通常は共有辞書程はサイズが大きくないので、検索時にはそれぞれの基点からリニアサーチが行なわれる。個人辞書で見つけられなかった候補については共有辞書から検索され、そこで見つかり確定された場合はその候補が個人辞書に取り込まれ、次に同じ見出し語の検索を行なった場合に同候補を最初に出力すべく、それぞれのミニマムポイントに挿入される。

辞書に関する設定
--------

skk-search-prog-list の各要素に辞書検索プログラム名、辞書名、引数をセットにしたリストを埋め込むことにより、辞書ファイルの指定、検索方法、検索される辞書の順序などを指定することができる。 skk-search-prog-list の具体例を示しながら更に詳しく説明する。

     '((skk-search-kakutei-jisyo-file skk-kakutei-jisyo 10000 t)
       (skk-search-jisyo-file skk-initial-search-jisyo 10000 t)
       (skk-search-jisyo-file skk-jisyo 0 t)
       (skk-okuri-search)
       (skk-search-jisyo-file skk-large-jisyo 10000)
       (skk-search-server skk-aux-large-jisyo 10000) )

関数、skk-search-kakutei-jisyo-file, skk-search-jisyo-file, skk-okuri-search,

skk-search-server は辞書検索プログラムである。

skk-search-kakutei-jisyo-file
     「確定変換」を行なう検索プログラム。第1引数は検索対象辞書。第2引数はリージョンの大きさを指定する。一つの見出し語に対する変換動作に対し、検索対象のリージョンの大きさが第2引数に指定されたサイズより小さくなるまではバイナリサーチが行なわれ、最後にリニアサーチが1回行なわれる。第2引数に0 を指定すると常にリニアサーチのみが行なわれる。第3引数は辞書をバッファに読み込むときにミニバッファに読み込んでいる旨のメッセージを出力するかどうかを指定する。検索対象の辞書ファイルはEmacsのバッファに読み込む。検索対象のファイルから候補を見つけると、内部変数 skk-kakutei-flag を立てて、いきなり確定する(ユーザーが確定する必要はない)。

skk-search-jisyo-file
     通常の検索を行なうプログラム。個人辞書の検索や、共有辞書でサーバーを使わない検索を行なう場合はこのプログラムを使用する。第1引数、第2引数、第3引数はそれぞれ skk-search-kakutei-jisyo-file のそれと同じ。辞書ファイルはEmacsのバッファに読み込む。

skk-okuri-search
     自動送り処理を行なうプログラム。引数はない。個人辞書の送りありエントリを検索対象としているので、個人辞書のバッファを流用し、専用の辞書バッファは作らない。skk-auto-okuri-process の値が nil であれば、 skk-search-prog-list に (skk-okuri-search) が含まれていても単に無視され、スキップされるので、skk-okuri-search を動かしたいときは必ず skk-auto-okuri-process の値を non-nil に設定する。

skk-search-server
     サーバー経由で検索するプログラム。第1引数、第2引数、第3引数はそれぞれ skk-search-kakutei-jisyo-file のそれと同じ。サーバーが使用不能になると辞書ファイルをEmacsのバッファに読み込んで検索を行なう。第2引数及び第3引数は、辞書ファイルをEmacsのバッファに読み込んだときのみ利用される。

変数、skk-kakutei-jisyo, skk-initial-search-jisyo, skk-jisyo, skk-large-jisyo, skk-aux-large-jisyo は辞書ファイルである。

skk-kakutei-jisyo
     確定変換用  (see 確定変換.)の辞書。候補は1つのみ許される(複数の候補を書いても良いが無視される)。見出し語の配置は、サイズが大きければ共有辞書と同じ配置 (see 共有辞書の配置.)  にしてバイナリサーチを行ない、サイズが小さければ適当な配置でリニアサーチを行なうのが良い。この辞書は、標準の配布パッケージには含まれていないので、使用するのであればユーザー側で用意する必要がある。

skk-initial-search-jisyo
     skk-jisyo の前に検索を行なう辞書。skk-jisyo の前に検索が行なわれるので skk-jisyo にカバーを掛け、最初に出てくる候補を操作することができるので、例えば、複数の専門用語毎の辞書を用意しておいて skk-initial-search-jisyo の値を切り替えることにより、専門分野毎の専門用語を切り替えて入力することができて便利かもしれない。見出し語の配置は、サイズが大きければ共有辞書と同じ配置にしてバイナリサーチを行ない、サイズが小さければ適当な配置  (使用頻度の高い候補から降順に配置することができればリニアサーチを行なう場合最も効率が良いが、作業は楽ではないだろう。例えば、 skk-initial-search-jisyo を使って一定時間文章を書いた後 skk-jisyo に挿入されたエントリの内、skk-initial-search-jisyo にあるものを skk-jisyo に挿入されている順の配置で抜き出して skk-initial-search-jisyo の見出し語の配置を変えてゆけば不可能ではないが、結構な労力になろう。) でリニアサーチを行なうのが良い。この辞書は、標準の配布パッケージには含まれていないので、使用するのであればユーザー側で用意する必要がある。

skk-jisyo
     個人辞書。SKKを一番最初に起動したときにファイルがなければ自動的に作られる。個人辞書より先に検索するのは、確定辞書と skk-initial-search-jisyo のみの設定とすべき。個人辞書の見出し語は、常に一番最近に変換された語がミニマムポイントに挿入され、その配置はランダムなものになるので、バイナリサーチを行なってはならない。

skk-large-jisyo
     共有辞書。ユーザーの用途と資源に合わせて、S辞書、M辞書、L辞書の中から選ぶ。skk-search-jisyo-file と対にすることを想定した辞書ファイル。

skk-aux-large-jisyo
     共有辞書。ユーザーの用途と資源に合わせて、S辞書、M辞書、L辞書の中から選ぶ。skk-search-server と対にして使用することを想定した辞書ファイル。

また、skk-search-prog-list には含まれないが(勿論検索されない)、個人辞書のバックアップ辞書として skk-backup-jisyo がある。

上記の例では、

 1. skk-kakutei-jisyo, skk-initial-search-jisyo, skk-jisyo の順に検索を行ない、

 2. 次に個人辞書を使って送り仮名の自動処理を行ない、

 3. その後、skk-large-jisyo の検索を行ない、

 4. 最後に skk-aux-large-jisyo にサーバー経由でアクセスしている。

もし確定辞書で候補が見つかったらそのまま自動的に確定される。1回 SPC を押す動作に対し、プログラム側では新たな候補を見つけるまで上記の動作を進める。例えば、

 1. 確定辞書では候補は見つけられなかったが skk-initial-search-jisyo に候補があれば、そこで一旦止まりユーザーにその候補を表示する。

 2. 更に SPC が押されると、次は個人辞書を検索する。そこで候補が見つかり、しかもその候補が skk-initial-search-jisyo で見つけた候補とは異るものであったときは、そこでまた一旦止まりその候補をユーザーに表示する。以降、共有辞書についても同様の繰り返しを行なう。

skk-search-prog-list の設定方法としては、例えば skk-large-jisyo にS辞書かM辞書を指定し、S辞書、M辞書はEmacsのバッファに読み込んで検索し skk-aux-large-jisyo に L辞書を指定して、L 辞書にはサーバー経由でアクセスする、という選択肢もある。

また、サーバー経由のアクセスも決して遅くはないので (Perlベースの pskkserv を使用すれば、DBM化された辞書にアクセスする時間はかなり高速な部類に入る。See pskkserv.)、

     (skk-search-jisyo-file skk-large-jisyo 10000)

を削除するという選択肢もある。ちなみに辞書ファイルの値が nil であれば、そのファイルを引数とした検索プログラムが skk-search-prog-list に指定されていても、その検索は行なわれない。

skk-auto.el をロードすると、

     (skk-okuri-search)

というリストが skk-search-prog-list に自動的に追加される (skk-auto-okuri-process を non-nil に設定すると skk-auto.el がオートロードされる。)。追加される位置は、 skk-jisyo を検索するリストの次である。あるいは

     (skk-okuri-search)

というリストを skk-search-prog-list の任意の位置に明示的に指定すると、skk-okuri-search を使って最初に検索したときに skk-auto.el がオートロードされる。

skk-server.el をロードすると、

     (skk-search-server skk-aux-large-jisyo 10000)

というリストが skk-search-prog-list に自動的に追加されるあるいは skk-server-host もしくは skk-servers-list を設定するとSKKモードを起動したときに skk-server.el がオートロードされる。これらの場合、追加される位置は、skk-search-prog-list の末尾である。あるいは

     (skk-search-server skk-aux-large-jisyo 10000)

というリストを skk-search-prog-list の任意の位置に明示的に指定すると skk-search-server を使って最初に検索を行なったときに skk-server.el がオートロードされる。

入力モードの一時変更
==========

日常の入力では、一般的に、かなモードを使用することが圧倒的に多いと考えられるが、ひらがなの中にカタカナ、全角アルファベットをちりばめて入力したい、という要求も多いと考えられる。カタカナの入力にはカナモードを、全角アルファベットの入力には全英モードを用いることは前述の通り (see カナモード、全英モード.)であるが、一時的にカナ文字、全英文字を入力して、また、かなモードに戻ることができる。

また、アスキーファイルを見出し語として使用するために、かなモードから一時的にアスキー文字を入力する機能が提供されている。▽モードの変種である SKK abbrev mode がそれである。この機能を使用することにより、 is => インクリメンタル・サーチのような変換を行なうことができる。

ひらがな/カタカナの一時的入力
---------------

かなモードもしくはカナモードで、/ キー以外で一旦▽モードにして文字列を挿入し、その文字列の末尾で q をタイプすることで (/ キーでSKK abbrev modeに入ってしまうと q キー入力が q 文字の入力として扱われてしまう。) ▽マークから q をタイプしたポイントまでの文字列が変換され確定される。変換は、▽とポイント間の文字列の種類  (正確に言うと▽の次の位置にある文字列をもって文字種の判別を行なっているので、途中で文字種類の違う文字が混在していても無視される。) をキーとして下記の規則に基づき行なわれる。

  * カタカナはひらがなへ

  * ひらがなはカタカナへ

  * 全英文字はアスキー文字へ

  * アスキー文字は全英文字へ

一例を挙げる。

     K a t a k a n a

     ------ Buffer: foo ------
     ▽かたかな-!-
     ------ Buffer: foo ------

     q

     ------ Buffer: foo ------
     カタカナ-!-
     ------ Buffer: foo ------

このトグル変換を上手く利用することにより、かなモードのまま一時的にカタカナを入力したり、またその逆が可能となるので、一々 q キーにより入力モードを2度切り換える必要がなく、ひらがな/カタカナ混じり文を書くときには非常に便利であろう。

全英文字とアスキー文字のトグルでの変換を行なうことができるので、少し混乱があるかもしれないが、全英モードやアスキーモードでは Q やその他の大文字により▽モードに入ることができないので、上記のトグル変換は行なうことができないので注意すること。かなモード/カナモードにおいて、既に入力された全英文字、アスキー文字に対して上記の変換を行なうことができるのみである。

なお、上記の変換は、いずれもリージョンに対するコマンドにて行なうこともできる。See リージョン一括変換.

全英文字の一時的入力
----------

/をタイプした後、全角アルファベットとして入力したい文字列を挿入し、その文字列の末尾で C-q  (SKK abbrev modeに入っている。C-q は skk-abbrev-map にマッピングされたキーバインドである。See アスキー文字を見出し語とした変換.) をタイプすることで、▽マークから C-q をタイプしたポイントまでの文字列が全角アルファベットに変換され確定される。

     / f i l e

     ------ Buffer: foo ------
     ▽file-!-
     ------ Buffer: foo ------

     q

     ------ Buffer: foo ------
     ｆｉｌｅ-!-
     ------ Buffer: foo ------

なお、この変換を行なうために、

     file /ｆｉｌｅ/

のような辞書エントリを持つ必要がない。辞書を参照せず、アスキー文字を1文字づつ全英文字に変換しているためである。

■モードにおける文字入力
============

かなモード/カナモードにおける入力
-----------------

ローマ字仮名変換ルール
...........

SKKでは、skk-roma-kana-a, skk-roma-kana-i, skk-roma-kana-u, skk-roma-kana-e, skk-roma-kana-o という5つの連想リストを持ち、母音が入力された時点で対応する連想リストを走査して入力すべきかな/カナ文字を決定する。

例えば、skk-roma-kana-i の値は、下記のようになっている。

     '(("" . ("い" . "イ"))
       ("b" . ("び" . "ビ")) ("by" . ("びぃ" . "ビィ"))
       ("ch" . ("ち" . "チ")) ("cy" . ("ちぃ" . "チィ"))
       ("d" . ("ぢ" . "ヂ")) ("dh" . ("でぃ" . "ディ"))
       ("dy" . ("ぢぃ" . "ヂィ"))
       ("f" . ("ふぃ" . "フィ")) ("fy" . ("ふぃ" . "フィ"))
       ("g" . ("ぎ" . "ギ")) ("gy" . ("ぎぃ" . "ギィ"))
       ("h" . ("ひ" . "ヒ")) ("hy" . ("ひぃ" . "ヒィ"))
       ("j" . ("じ" . "ジ")) ("jy" . ("じぃ" . "ジィ"))
       ("k" . ("き" . "キ")) ("ky" . ("きぃ" . "キィ"))
       ("m" . ("み" . "ミ")) ("my" . ("みぃ" . "ミィ"))
       ("n" . ("に" . "ニ")) ("ny" . ("にぃ" . "ニィ"))
       ("p" . ("ぴ" . "ピ")) ("py" . ("ぴぃ" . "ピィ"))
       ("r" . ("り" . "リ")) ("ry" . ("りぃ" . "リィ"))
       ("s" . ("し" . "シ")) ("sh" . ("し" . "シ"))
       ("sy" . ("しぃ" . "シィ"))
       ("t" . ("ち" . "チ")) ("th" . ("てぃ" . "ティ"))
       ("ty" . ("ちぃ" . "チィ"))
       ("v" . ("う゛ぃ" . "ヴィ")) ("w" . ("うぃ" . "ウィ"))
       ("x" . ("ぃ" . "ィ")) ("xw" . ("ゐ" . "ヰ"))
       ("z" . ("じ" . "ジ")) ("zy" . ("じぃ" . "ジィ")) )

ちを挿入すべく t i という入力を行なったとすると、最後の母音である i の入力時点で、skk-roma-kana-i を走査することが決定される。この連想リストの走査キーは、入力される仮名文字のローマ字プレフィックス  (see ローマ字プレフィックス.)で、この例では ``t'' となる。走査結果は、

     ("t" . ("ち" . "チ"))

となる。かなモードのときは、この結果から cadr (cdr の car。)の``ち''を、カナモードのときは、 cddr  (cdr の cdr。)の``チ''を取り出し、カレントバッファに挿入する。

ch や f などヘボン式でしか使用しないキーの割付けをやめたいときは、~/.emacs や ~/.skk に不要なセルを除いた skk-roma-kana-i を直接書くか、skk-load-hook を利用して、下記のように書く。

     (add-hook 'skk-load-hook
               (function
                (lambda ()
                  (setq skk-roma-kana-i
                        (delq (assoc "ch" skk-roma-kana-i) skk-roma-kana-i)
                        skk-roma-kana-i
                        (delq (assoc "f" skk-roma-kana-i) skk-roma-kana-i) ))))

上記の

     (assoc "ch" skk-roma-kana-i)

の代りに

     ("ch". ("ち" . "チ"))

と書いても良いが、その場合は、delq の代りに delete を使用すること。

旧バージョンのSKKでは長さ2以上のプレフィックスについて skk-roma-kana-[aiueo] を変更したら、対応して skk-prefix-list も変更する必要があったが、バージョン9.6ではこれを内部変数  (改名されて skk-prefix-tree という変数になった。ElibのAVL木パッケージを利用したAVL木構造となっている。skk-prefix-list の長さは24と結構長く、skk-kana-input で頻繁に参照、走査されるので member による逐次走査よりもAVL木を利用したバイナリーサーチの方が有利と判断した。) として、SKKモードを起動する毎に自動計算するようになった。既にSKKモードになっているバッファで skk-roma-kana-[aiueo] を変更した場合は、 C-x C-j もしくは C-x j を2度タイプして skk-mode もしくは skk-auto-fill-mode を起動し直す必要があるので注意すること。 skk-roma-kana-[aiueo] がユーザー変数であるために、SKK起動後にこれらの変数が変更される可能性があるので毎度計算し直すように設計されている。

有限状態オートマトンを用いた変換
................

ローマ字かな変換は、skk-roma-kana-a, skk-roma-kana-i, skk-roma-kana-u, skk-roma-kana-e, skk-roma-kana-o という5つの連想リストに従い行われることは前節で述べた通りだが、 skk-rom-kana-rule-list により表現される有限状態オートマトンを用いた変換も併用される (順序としては、オートマトンの状態遷移規則を用いたリストが先に参照され、そこに該当の規則がなければ、次に上記5リストが参照される。)。このリストのディフォルト値は、下記の通りである。

     '(("nn" nil ("ン" . "ん"))
       ("n'" nil ("ン" . "ん")) )

リストの各要素は、オートマトンの状態遷移規則:

     <現在の状態, 入力, 次の状態, 出力>

を

     (現在の状態@入力 次の状態 出力)

という形のリストで表現したものである。ここで状態とは変換される前のローマ字の文字列であり、入力は今タイプされた文字を長さ1の文字列とみなしたものである。@ は文字列の連接を表わす。出力は次の状態に遷移するときにバッファに挿入される文字列のリストであり、かなモードでは当該リストの car、カナモードでは cdr がバッファに挿入される。「次の状態」が nil のときには最終状態に遷移し、ローマ字かな変換を終了する。

従い、上記のディフォルト値は、nn または n' をタイプすると、かなモードではんが、カナモードではンがカレントバッファに挿入されることを示している。また、

     (setq skk-rom-kana-rule-list
           '(("nn" "n" ("ン" . "ん"))
             ("n'" nil ("ン" . "ん")) ))

とすれば、

     hannou ==> はんのう
     han'ou ==> はんおう

のようにローマ字かな変換が行われる。ところで、

     ohsaka ==> おおさか
     ohta ==> おおた
     ohhira ==> おおひら

のように oh は特別に処理される。従い、ohhonn とタイプするとおおほんとなりおっほんとはならない。

     ohhonn ==> おっほん

のように変換したければ、規則

     ("oh" "h" ("" . ""))

を追加する。

この他、

     tp ==> 東北大学
     skk ==> skk
     skK ==> SKK

といった変換も、

     ("tp" nil ("東北大学" . "東北大学"))
     ("sk" "sk" ("" . ""))
     ("skk" nil ("skk" . "skk"))
     ("skK" nil ("SKK" . "SKK"))

のような規則を追加すれば可能である。自分の名前を入力することはよくあるので、適当な省略形を用いて、このリストに追加しておくと便利かもしれない。

更に skk-rom-kana-rule-list を用いればT-codeやTUT-codeによる日本語入力を実現することもできる。この場合はルールの数が数千になり、このままではルールへのアクセスに多くの時間を要するようになる。このようにルールの数が多いときは、以下のようにしてあらかじめルールのリストを木の形にコンパイルしておくと効率が良い。

 1. まず、.emacs などに下記のフォームを追加する。

          (setq skk-rom-kana-rule-tree
                (skk-compile-rule-list skk-rom-kana-rule-list) )

 2. このままではSKKを起動するときに毎回 skk-compile-rule-list を計算することになるので、うまくゆくことが分れば、上記のフォームに代えて、

          (skk-compile-rule-list skk-rom-kana-rule-list)

     の値を直に ~/.emacs などに書いておく。

数字や記号文字の入力
..........

かなモード/カナモードにおける次のキーは、skk-self-insert 関数にバインドされている。

     !  #  %  &  '  *  +

     -  0  1  2  3  4  5

     6  7  8  9  :  ;  <

     =  >  ?  "  (  )  [

     ]  {  }  ^  _  `  |

     ~

これらの数字や記号文字のキーに対応し挿入される文字は、ベクトル skk-input-vector の値により決定される。skk-input-vector のディフォルト値は、下記の通り。

     [nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  "！" nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  "、" "ー" "。" nil
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  "：" "；" nil  nil  nil  "？"
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  "「" nil  "」" nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil]

このベクトルは、キーのアスキーコード順に対応する文字列を並べたものである。例えば ! のアスキーコードは33で  (! をEmacsのchartypeで表現した ?! をEmacsの lisp-interaction-mode で評価すると33が返ってくる。)、このベクトルの33番目  (0から数える。)の要素には全角文字の！が割り振られているので、!のキー入力に対し、全角文字である！がバッファに挿入される。

要素が nil のところは使用されないか、または入力キーがそのまま挿入されることを示している。具体例を言えば、▽モードへ入るキーの1つに A があるが、このキーは、skk-set-henkan-point に割り付けられており  (Aをタイプするとあを挿入する他、▽モードに入る、という仕事をしなければならないので、skk-self-insert ではなく、skk-set-henkan-point に割り付けられている。)、 skk-input-vector では参照されないので、A のアスキーコードである65番目の要素は nil である。また、* は、前述の通り skk-self-insert に割り付けられているが、そのアスキーコードは42であり、skk-input-vector の42番目の要素は nil なので、そのまま * が挿入される。

あるインデックスに対するベクトルの要素を簡単に調べるには、Emacsの組み込み関数である aref を使い、

     (aref skk-input-vector 33)

のようにする。返り値が対応する値である。

かなモード/カナモードで * にて対応し全角文字の＊を入力したければ、~/.skk ~/.emacs に42番目の要素が全角文字の``＊''であるような skk-input-vector を直接書いておくか、 ~/.skk や skk-load-hook を利用して下記のような式を評価する (aset の第2引数の42の代りに ?* のように * のchar type表現をそのまま書いても良い。aset を使って skk-input-vector の値を変更するのは、skk.el のロード後でなければならないので、この式を .emacs などで設定してはならない)。

     (aset skk-input-vector 42 "＊")

バッファに依存して異なる skk-input-vector を用いるには、バッファローカルな同名の変数を作り、その変数の値の設定を変更すればよい (skk-input-vector が元々グローバル変数であることに注意。)。例えば、下記の関数をあるバッファで実行すれば、そのバッファでは区切記号 !, ,, ., :, ;, ? の各キー入力に対して、対応するアスキー文字をそのまま入力できるようになる (初期値が nil でないバッファローカル値に破壊的関数を使用すると、カレントバッファだけでなく、他のバッファから見える値まで変更されてしまう。詳細については、skk.el の skk-make-henkan-marker関数のコメントを参照願いたい。skk-ascii-punc では、初期値がnilでない skk-input-vector をバッファローカル化し、aset で直接書換えするので、予め copy-sequence で複写し、バッファローカル化された skk-input-vector が指す実体をグローバル変数 skk-input-vector の指すものから変更している。)。

     (defun skk-ascii-punc ()
       "use ascii punctuation marks."
       (interactive)
       (make-local-variable 'skk-input-vector)
       (setq skk-input-vector
             (copy-sequence (default-value 'skk-input-vector)))
       (aset skk-input-vector ?! nil)
       (aset skk-input-vector ?, nil)
       (aset skk-input-vector ?. nil)
       (aset skk-input-vector ?: nil)
       (aset skk-input-vector ?; nil)
       (aset skk-input-vector ?? nil) )

Emacsのモード固有のフックなどを利用して上記のような関数を実行すれば、モードに依存して自動的に skk-input-vector をカスタム化できる。

skk-self-insert は、Emacsのオリジナル関数である self-insert-command をエミュレートしているので、引数を渡すことにより同じ文字を複数、一度に挿入することが可能である  (残念ながら、あなどを入力する skk-insert-[aiue] や ▽あ などを入力する skk-set-henkan-point では引数渡しできない。)。

     C-u 2 !

     ------ Buffer: foo ------
     ！！
     ------ Buffer: foo ------

全英モードにおける入力
-----------

全英モードにおける印字可能な全てのキーは skk-zenkaku-insert に割り付けられており skk-zenkaku-vector の値により挿入される文字が決定される。skk-zenkaku-vector のディフォルト値は、下記の通り。

     [nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil
      "　"  "！" "”" "＃" "＄" "％" "＆" "’"
      "（" "）" "＊" "＋" "，" "−" "．" "／"
      "０" "１" "２" "３" "４" "５" "６" "７"
      "８" "９" "：" "；" "＜" "＝" "＞" "？"
      "＠" "Ａ" "Ｂ" "Ｃ" "Ｄ" "Ｅ" "Ｆ" "Ｇ"
      "Ｈ" "Ｉ" "Ｊ" "Ｋ" "Ｌ" "Ｍ" "Ｎ" "Ｏ"
      "Ｐ" "Ｑ" "Ｒ" "Ｓ" "Ｔ" "Ｕ" "Ｖ" "Ｗ"
      "Ｘ" "Ｙ" "Ｚ" "［" "＼" "］" "＾" "＿"
      "‘" "ａ" "ｂ" "ｃ" "ｄ" "ｅ" "ｆ" "ｇ"
      "ｈ" "ｉ" "ｊ" "ｋ" "ｌ" "ｍ" "ｎ" "ｏ"
      "ｐ" "ｑ" "ｒ" "ｓ" "ｔ" "ｕ" "ｖ" "ｗ"
      "ｘ" "ｙ" "ｚ" "｛" "｜" "｝" "〜" nil]

挿入される文字の変更方法等については、数字や記号文字の入力 を参照のこと。

skk-zenkaku-insert もEmacsオリジナルの関数 self-insert-command をエミュレートしている関係から、引数を渡すことにより同じ文字を複数、一度に挿入することができる。 skk-self-insert における動作と同じであるので、前述した例をご参照いただきたい。See 数字や記号文字の入力.

1回のadvertised-undo(undo)の対象
---------------------------

SKKモードになっていないEmacsオリジナルバッファでは、連続する20文字の挿入が一度のアンドゥの対象となっている。かな・カナ・全英モードにおける入力も、このオリジナルの動作をエミュレートしている (buffer-undo-list にEmacsが挿入したアンドゥの境目の目印を取り除く方法でエミュレートしている。)。正確に言えば、skk-insert-[aiue], skk-insert-comma, skk-insert-period, skk-kana-input, skk-self-insert, skk-set-henkan-point, skk-zenkaku-insert (SKK abbrevモードでは、アスキー文字入力がEmacsオリジナルの self-insert-command により行なわれているので、エミュレートのための内部変数である skk-self-insert-non-undo-count をインクリメントすることができず、アンドゥをエミュレートできない。しかも、カンマやピリオドを挿入した時点で、skk-abbrev-comma や skk-abbrev-period を使うことになるので、オリジナルのアンドゥの機能も損なってしまう。ただ、現実問題としては、元来SKK abbrevモードは省略形としての見出し語を挿入するためのモードであるので、長い見出し語を挿入することはあまりなく、問題も小さいと考えられる。)の各関数にバインドされたキー入力については、連続して入力された20文字を1つのアンドゥの対象としている  (`20'はEmacsのソースファイルの一部である keyboard.c に定められたマジックナンバーと一致する。)。但し、上記のSKKの関数とEmacsのオリジナルの self-insert-command を織り混ぜてキー入力した場合  (かなモードでの入力中、アスキーモードに移行してタイプした場合などがこれにあたるであろう。)は、このエミュレート機能は正常に働かないので注意すること。このエミューレート機能は、Mule-2.3添付の egg.el を参考にした。

     a i u e o k a k i k u k e k o s a s i s u s e s o t a t i t u t e t o

     ------------------------- Buffer: foo -------------------------
     あいうえおかきくけこさしすせそたちつてと ; 連続する20文字。
     ------------------------- Buffer: foo -------------------------

     C-_

     ------------------------- Buffer: foo -------------------------
                            ; 20文字全てがアンドゥの対象となる。
     ------------------------- Buffer: foo -------------------------

     a i u e o k a k i k u k e k o s a s i s u s e s o t a t i t u t e t o n a

     -------------------------- Buffer: foo --------------------------
     あいうえおかきくけこさしすせそたちつてとな ; 連続する21文字。
     -------------------------- Buffer: foo --------------------------

     C-x u

     -------------------------- Buffer: foo --------------------------
     あいうえおかきくけこさしすせそたちつてとな ; 最後の1文字のみがアンドゥの対象となる。
     -------------------------- Buffer: foo --------------------------

対になる文字列の一括入力
------------

例えば、`「' を入力したら、必ずと言って良いほど `」' を後で入力する必要がでてくる。`「' の入力時点で、対になる文字を自動挿入してくれるとタイプ数を減らすことができ、入力忘れの防止にもなる。 skk-auto-insert-paren の値を non-nil にすると、上記の自動挿入を行なう。

     ------ Buffer: foo ------
     彼はこう言った-!-
     ------ Buffer: foo ------

     [

     ------ Buffer: foo ------
     彼はこう言った「-!-」
     ------ Buffer: foo ------

上記のように `「' の入力時点で対となる`」'を自動挿入し、`「'と`」'の間にポイントを再配置するので、その位置からかぎかっこに囲まれた文字列を即始めることができる。

自動挿入すべきペア文字列は、skk-auto-paren-string-alist で指定する。そのディフォルト値は下記の通り。

     '(("「" . "」") ("『" . "』") ("(" . ")") ("（" . "）") ("{" . "}")
       ("｛" . "｝") ("〈" . "〉") ("《" . "》") ("[" . "]") ("［" . "］")
       ("〔" . "〕") ("【" . "】") ("\"" . "\"") ("“" . "”") )

各リストの car に指定された文字列を挿入すると、cdr に指定された文字列を自動挿入する。このリストの各要素の car に指定された文字列は、対になる文字列の自動挿入のために、例えアスキー文字であっても skk-input-vector に指定する必要があるが、この処理はSKKが内部で自動的に行なっているので、ユーザーが行なう必要はない。既にSKKモードになっているバッファで skk-auto-paren-string-alist を変更した場合は、 C-x C-j もしくは C-x j を2度タイプして skk-mode もしくは skk-auto-fill-mode を起動し直す必要があるので注意すること。

キーとなる文字の挿入が行なわれても、その挿入後のポイントに自動挿入すべき文字が既に存在している場合には、自動挿入は行なわれない。

     ------ Buffer: foo ------
     -!-」
     ------ Buffer: foo ------

     [

     ------ Buffer: foo ------
     「-!-」
     ------ Buffer: foo ------

対になる文字を複数挿入したい場合は、引数を渡して文字を指定する。具体例を述べる。

     C-u 2 [

     ------ Buffer: foo ------
     「「-!-」」
     ------ Buffer: foo ------

このような場合、最初のかぎかっこに対する文章から書き始めることが多いと考えられるので、ポイントは「「-!-」」ではなくて、「-!-「」」に再配置されるべきかもしれない。将来のバージョンにて検討する。See 拡張アイディア.

yatex-mode など、既に同種の機能が付いているモードがある。そのようなモードにおいてもこの自動挿入の機能が邪魔になることはないと考えるが、そのモードにおいてのみこの機能をオフにしたい場合は、該当のモードに入ったときにコールされるフックを利用して設定を行なうことができる。

     (add-hook 'yatex-mode-hook
               (function
                (lambda ()
                  (if skk-auto-insert-paren
                      (set (make-local-variable 'skk-auto-insert-paren) nil)))))

特定のモードにおいて、自動挿入すべき文字を変更したい場合にも同様にフックを用いて操作できる。

     (add-hook 'tex-mode-hook
               (function
                (lambda ()
                  (if skk-auto-insert-paren
                      (progn
                        (make-local-variable 'skk-auto-paren-string-alist)
                        (setq skk-auto-paren-string-alist
                              (cons '("$" . "$") skk-auto-paren-string-alist) ))))))

特定のペアを削除したい場合は、例えば下記のように設定する  (何故 copy-sequence を使用するのかについては、数字や記号文字の入力 を参照。)。

     (add-hook 'tex-mode-hook
               (function
                (lambda ()
                  (if skk-auto-insert-paren
                      (progn
                        (make-local-variable 'skk-auto-paren-string-alist)
                        (setq skk-auto-paren-string-alist
                              (delete
                               '("$" . "$")
                               (copy-sequence skk-auto-paren-string-alist) )))))))

ポイントを戻して▽モードへ
=============

見出し語の入力を大文字で開始することを忘れた場合の▽マークの付け方については前述したが  (see ▽マークの付け忘れ.)、これを簡略化し、ワンアクションで行なう方法について説明する。

M-Q  (Q は大文字で入力する必要がある。)とタイプするとポイントの直前の文字列について走査し、同種の文字  (ひらがな、カタカナ、全角アルファベット、アルファベットの4種類のいずれか。)が続く限りbackward方向にポイントを戻して▽モードに入り、またポイントを M-Q 入力時の地点に戻す。

     k a n j i

     ------ Buffer: foo ------
     かんじ-!-
     ------ Buffer: foo ------

     M-Q

     ------ Buffer: foo ------
     ▽かんじ-!-
     ------ Buffer: foo ------

変換開始ポイントの走査時には、スペース文字、タブ文字、長音を表わすーは無条件にスキップされる。但し、ひらがなの場合はをの直前で、カタカナの場合はヲの直前で変換開始ポイントの走査を止め、▽モードに入る。変換開始ポイントをを、ヲの直前で止めるのは、文章が事情を考慮するのように×××を○○○の形態になっており、 ○○○のみを変換の対象としたい場合が圧倒的に多いからである。

無引数で M-Q を実行した場合は上記のように文字の種類によりポイントを必要数のみbackward方向へ戻すが、明示的に戻す文字数を指定するには C-u 5 M-Q のように引数を渡して実行する。この場合は文字種別を問わず、与えられた文字数だけ無条件にポイントを戻す。

なお、backward方向にポイントを戻す途中で行頭に到達した場合は、更に上の行について行末の文字列から同様の走査を行ない、必要があれば更にポイントを戻す。skk-allow-spaces-newlines-and-tabs の値を nil にすることで、行を超えての走査をやめることができる。

確定変換とそのアンドゥ
===========

確定変換を行なうプログラム skk-search-kakutei-jisyo-file と 確定辞書 skk-kakutei-jisyo については前節で述べたが、ここではその動作について具体的に説明する。例えば、

     せつめい /説明/

というエントリが確定辞書にあったとすると、

     S e t u m e i

     ------ Buffer: foo ------
     ▽せつめい
     ------ Buffer: foo ------

     SPC

     ------ Buffer: foo ------
     説明
     ------ Buffer: foo ------

のように確定動作をすることなしに(暗黙の確定もなく) いきなり確定する。仮に確定辞書に

     じしょ /辞書/

というエントリを挿入してしまったが、自署に変換したい場合は、確定直後に x をタイプすることにより確定変換をアンドゥして▽モードに戻ることができ、次に SPC をタイプしたときは、確定辞書は検索を行なわないので、個人辞書、あるいは共有辞書に

     じしょ /自署/

のエントリがあれば自署への変換を行なうことができる。

     Z i s y o SPC

     ------ Buffer: foo ------
     辞書
     ------ Buffer: foo ------

     x

     ------ Buffer: foo ------
     ▽じしょ
     ------ Buffer: foo ------

     SPC

     ------ Buffer: foo ------
     ▼自署
     ------ Buffer: foo ------

確定アンドゥ
======

一番最後に行なった変換についての確定をアンドゥして、再変換を行なうことができる。これを「確定アンドゥ」という。確定変換のアンドゥと混同しないこと。

下記に例を示す。辞書エントリが

     こうこう /高校/孝行/航行/

のようになっているとする。

     K o u k o u SPC

     ------ Buffer: foo ------
     ▼高校
     ------ Buffer: foo ------

     s u r u

     ------ Buffer: foo ------
     高校する-!-
     ------ Buffer: foo ------

     M-x skk-undo-kakutei

     ------ Buffer: foo ------
     ▼孝行-!-する
     ------ Buffer: foo ------

高校の確定についてアンドゥしたので、辞書の第一候補である高校をスキップして、次候補である孝行の変換を行なっている。候補孝行について▼モードに入ったところで、▼モードにおいて通常の変換で孝行を得た時点と全く同一の状態にあるので、更に SPC を押してこの例での次候補である航行を変換により求めたり、更にもう一度 SPC を押して辞書登録モードに入ることもできる。

確定した直後(上記の例では、送り仮名であるするの入力のための s の入力前) でなくともアンドゥが可能である。より正確には、次の新たな確定  (C-j をタイプして明示的に確定した場合は勿論、暗黙の確定を行なった場合も同様である。)を行なうまではアンドゥに関する情報が保持されているので、アンドゥが可能である。

変換、確定に関連しない文字列は、確定アンドゥを行なっても削除されない。上記の例では、するがそのままカレントバッファに残っていることに注意。

見出し語関連
======

見出し語の補完
-------

▽モードで TAB を押すと、見出し語(▽モードにおける入力文字列)に対する補完が行われる。TAB を押す直前に▽モードで入力された文字列をσ とすると、個人辞書  (共有辞書はサーチされない。共有辞書では一般的に先頭の文字を共通にする見出し語が多すぎて、望みの補完が行なえる可能性が低いからである。)の送りなしエントリの中で、先頭がσと一致し長さがσよりも長い見出し語を捜して、そのようなτがもしあれば、σの代わりにτが表示される。見出し語の補完を上手に利用することで、タイプ数を減らすことができる。

▼モードで変換を行なった語の見出し語について、時間的に新しいものから先に補完が行なわれる。例えば、斉藤、佐藤の順で変換した後、さをキーにして見出し語の補完を行なうと、最初にさとうが、その次にさいとうが補完される。補完が意図したものでなかったときには TAB の直後に . (ピリオド)をタイプすると2番目の見出し語が表示される。以下同様に . を続けてタイプすると、見出し語の候補が順次表示される。意図した見出し語を通りすぎたときは , (コンマ)で前の候補に戻る。

     S a t o u SPC C-j

     ------ Buffer: foo ------
     佐藤
     ------ Buffer: foo ------

     S a

     ------ Buffer: foo ------
     ▽さ
     ------ Buffer: foo ------

     TAB

     ------ Buffer: foo ------
     ▽さとう
     ------ Buffer: foo ------

     .

     ------ Buffer: foo ------
     ▽さいとう (さとうの次に補完される見出し語は、個人辞書の
     内容に依存する。)
     ------ Buffer: foo ------

     ,

     ------ Buffer: foo ------
     ▽さとう
     ------ Buffer: foo ------

     SPC

     ------ Buffer: foo ------
     ▼佐藤
     ------ Buffer: foo ------

     C-j

     ------ Buffer: foo ------
     佐藤
     ------ Buffer: foo ------

なお、個人辞書の検索は、見出し語を得るために行なわれるので、一旦 SPC をタイプして▼モードに入れば skk-search-prog-list の順に候補が検索される(skk-search-prog-list で個人辞書の前に検索を行なうように設定されている検索もスキップせずに行なう)。例えば、 skk-search-prog-list で確定変換を行なう設定を行なっており、確定辞書にその見出し語があれば、見出し語を補完した際にも確定変換が行なわれる。

skk-dabbrev-like-completion の値を non-nil にすることで、 . で2番目以降の補完を行なったときに、最初に補完された語について補完が行われる。つまり上記の例ではさに対し、最初に補完された語は、さとうであるので、以後の補完は、さとうを含む語(例えば、さとうせんせいなど) について行なわれる。

見出し語を補完しながら▼モードへ
----------------

前節で見出し語の補完について述べたが、その見出し語の補完動作を行なった後、 SPC をタイプし、▼モードに入るまでの動作をワンアクションで行なうことができる。補完される見出し語が予め把握できている状況では、キータイプがワンアクション省略できる。長い見出し語の専門用語を連続して入力する場合などに威力を発揮する。

     K a s i t a n n p o s e k i n i n n

     ------ Buffer: foo ------
     ▽かしたんぽせきにん
     ------ Buffer: foo ------

     SPC, RET

     ------ Buffer: foo ------
     瑕疵担保責任
     ------ Buffer: foo ------

     K a

     ------ Buffer: foo ------
     ▽か
     ------ Buffer: foo ------

     M-SPC

     ------ Buffer: foo ------
     ▼瑕疵担保責任
     ------ Buffer: foo ------

空白・改行・タブを含んだ見出し語の変換
-------------------

下記のようにオートフィルモードで折り返された文字列に対し、折り返された状態のまま変換を行なうことができる。

     ---------------- Buffer: foo ------------------
     仮名漢字変換プログラムをさ
     くせいしました。-!-
     ---------------- Buffer: foo ------------------

     C-u 10 C-b Q

     ---------------- Buffer: foo ------------------
     仮名漢字変換プログラムを▽-!-さ
     くせいしました。
     ---------------- Buffer: foo ------------------

     C-u 5 C-f

     ---------------- Buffer: foo ------------------
     仮名漢字変換プログラムを▽さ
     くせい-!-しました。
     ---------------- Buffer: foo ------------------

     SPC

     ---------------- Buffer: foo ------------------
     仮名漢字変換プログラムを▼作成-!-しました。
     ---------------- Buffer: foo ------------------

上記の例では改行だが、空白、タブ文字を中間に含む文字列に対しても変換を行なうことができる。skk-allow-spaces-newlines-and-tabs の値を nil にすることで2行以上にまたがる文字列に対する変換を禁止することができる。

カタカナの見出し語
---------

q によりかなモード、カナモードを度々切り替えて入力を続けていると、カナモードで誤って▼モードに入ってしまうことがあるので、カナモードで▼モードに入ろうとすると、まず見出し語をひらがなに変換するように設計されている。

更に、送りあり変換で、送り仮名もカタカナにしたい場合については、カナモードでの変換の送り仮名の処理 を参照のこと。

あまりないケースだとは思うが、見出し語をカタカナのまま残して変換を行ないたい場合には SPC に代えて C-u SPC のように SPC に数値引数を渡せば良い。

送り仮名関連
======

送り仮名の厳密なマッチ
-----------

例えば、個人辞書に

     おおk /大/多/[く/多/]/[き/大/]/

という送りありエントリがあれば O o K i i SPC とタイプした場合、標準では大きいと多きいという 2 通りの候補が出力可能であるが、この内多きいを選択することは有り得ない。送りあり変換で、見出し語が同じ文字列であっても選択する可能性のある候補とない候補が混在している場合が多く、更に候補の絞り込みをしたいという要請が出てくる。

変数 skk-henkan-okuri-strictly の値を non-nil にすると、見出し語がマッチするかどうかのチェックの上に、送り仮名がマッチするかどうかのチェックが行なわれ、送り仮名がマッチしない候補を出力しない。上記の場合では、送り仮名きがマッチする大きいのみを出力し、多きいを出力しない。個人辞書の送りありエントリが充実しておれば、標準の設定よりも候補が絞り込まれるので変換効率がアップするが、個人辞書の送りありエントリが充実していなければ、すぐに辞書登録モードに入ってしまい逆効果となる。

このユーザーオプションは skk-process-okuri-early の値を non-nil にした状態と共存できない。詳細は送りあり変換の変換開始のタイミング を参照のこと。メニューバーを使用してこのユーザーオプションをオンにすると、自動的に skk-process-okuri-early の値を nil にすることができる。

変数 skk-henkan-okuri-strictly の値を non-nil にすると、辞書登録モードに入っても送り仮名のマッチが厳密に行なわれるので、辞書登録時に漢字を得るのに一苦労する羽目になる。下記のようにフックを設定することで辞書登録時のみ、一時的に送り仮名の厳密なマッチをしないようにすることができる  (minibuffer-setup-hook と minibuffer-exit-hook はEmacs 19でのみ使用可能なフック)。

     (add-hook 'minibuffer-setup-hook
               (function
                (lambda ()
                  (if (and (boundp 'skk-henkan-okuri-strictly)
                           skk-henkan-okuri-strictly
                           (not (eq last-command 'skk-purge-jisyo)) )
                      (progn
                        (setq skk-henkan-okuri-strictly nil)
                        (put 'skk-henkan-okuri-strictly 'temporary-nil t) )))))

     (add-hook 'minibuffer-exit-hook
               (function
                (lambda ()
                  (if (get 'skk-henkan-okuri-strictly 'temporary-nil)
                      (progn
                        (put 'skk-henkan-okuri-strictly 'temporary-nil nil)
                        (setq skk-henkan-okuri-strictly t) )))))

下記のように設定できればもっと簡潔なのだが、 skk-henkan-okuri-strictly の値は辞書バッファで参照されるために、ミニバッファのバッファローカル値を変更しても狙った効果は得られないので注意すること。

     (add-hook 'minibuffer-setup-hook
               (function
                (lambda ()
                  (if (and (boundp 'skk-henkan-okuri-strictly)
                           skk-henkan-okuri-strictly )
                      (set (make-local-variable 'skk-henkan-okuri-strictly)
                           nil )))))

将来のバージョンでは、これを改良し、辞書バッファでの動作に影響するユーザー変数をバッファローカル化できるようにする予定である。See 拡張アイディア.

送り仮名の自動処理
---------

どのように変換されるか
...........

変数 skk-auto-okuri-process を non-nil にセットすると、文法的な知識を用いない送り仮名の自動処理が行なわれる。送り仮名の最初のローマ字表現を大文字で始める必要がない (see 送り仮名の入力.)という利点があるが、同時にユーザがシステムに与える情報が少なくなるので、意図しない変換をされる割合が増えるという欠点がある。また下記に述べるようにこの自動処理は個人辞書に依存しているので、個人辞書の送りありエントリが貧弱な場合は、自動処理ができない可能性が高い。ただ、skk-auto-okuri-process を non-nil にセットしていても、送り仮名の開始位置を大文字のキーをタイプして明示的に指定することも可能であり、かつ、送り仮名を明示した場合の変換には影響を与えないので、送りなし変換で意図しないものまで拾う可能性がある他はデメリットもなく、むしろ送り仮名を正確に思い出せない場合に送り仮名を指定しなくとも変換できるメリットがあるので、この変数の値を常に non-nil にするのも良い選択かもしれない  (専ら補完的に自動送り処理を利用するのであれば、(skk-okuri-search) を skk-search-prog-list の最後にもってくるのが良いであろう。)。

例えば、 T a t i a g e r u SPC とタイプした場合、たちあげるという見出し語に対し、送り仮名を明示されていないので、まず送りなし変換として扱い辞書を検索する。このときは、通常の変換同様、個人辞書及び指定された共有辞書他を検索する。通常はそのような見出し語はないので、今度は個人辞書のみを検索の対象として、見出し語を最後尾から1文字づつ切り詰め、「切り詰めの結果残った文字列」と、「切り捨てられた先頭の文字のローマ字プレフィックス」を連結した文字列を送りあり変換の見出し語として、検索する。この例において検索される見出し語の変化を追うと、

     たちあげる => たちあげr => たちあg
     => たちa => たt

のようになる。仮に個人辞書エントリが、

     たちあg /立ち上/[げ/立ち上/]/[が/立ち上/]/
     たt /建/断/経/立/[つ/建/断/経/立/]/[ち/建/断/経/立/]/[て/経/立/建/]/

の2つのエントリを含むとすると、見出し語を後方から順に切り詰める過程でたちあgとたtの2つの見出し語の検索時にこれらの辞書エントリがマッチする。

次に、マッチしたエントリの各候補に対し、切り捨てられた先頭の文字を送り仮名として取るかどうかをチェックする。たちあgの場合の送り仮名チェックの対象は、切り捨てられた最初の文字のげであるので、

     [げ/立ち上/]

の部分のみに注目する。また、たtの場合の送り仮名チェックの対象は、ちであるので、

     [ち/建/断/経/立/]

のみに注目する。もうお分りのように、マッチする見出し語に対しチェックするのは送り仮名ブロック部分だけであり、送り仮名に対応していない全候補を含む部分(たt の場合は、候補の最初の /建/断/経/立/ の部分)は単に無視される。

送り仮名がマッチする候補立ち上、建、断、経、立の5つを文字列の長さ順に昇順にソートし、それぞれの候補と該当の見出し語から切り捨てられた文字列と連結したもの(「該当の見出し語から切り捨てられた文字列」を送り仮名とみなして処理している。)を、送り仮名の自動処理の最終候補として返す。上記の例では、立ち上げる、建ちあげる、断ちあげる、経ちあげる、立ちあげる の5つが最終候補である。長さ順にソートするのは、変換された部分がより長い候補を先順位として出力するためである。上記の例の立ち上げると建ちあげるとでは、立ち上げるの方が変換された部分が長いので、立ち上げるを建ちあげるより先順位で出力する。

辞書登録の際に注意すべきこと
..............

個人辞書に見出し語わたsについてのエントリが全くない場合、あるいは個人辞書のエントリが

     わたs /渡/[し/渡/]/

のような送り仮名のブロックを持たない場合、W a t a s i t a SPC とタイプすると、送り仮名のマッチができないので、候補の選定ができず辞書登録モードに入る。

     W a t a s i t a SPC

     ------ Buffer: foo ------
     ▼わたした
     ------ Buffer: foo ------

     ------ Minibuffer -------
     わたした-!-
     ------ Minibuffer -------

辞書登録モードで W a t a S i t a RET と送り仮名を明示的にタイプし、渡したと変換し登録する。この場合、登録する語の最後が平仮名で終るので、その最後の平仮名の文字列(上記の例では、した)が見出し語の最後と一致するかを調べ、一致する場合には、辞書の登録を送りありエントリとして行なうのかどうかの確認を求めてエコーエリアにプロンプトを出す (y-or-no-p はミニバッファを使用しているのではなく、エコーエリアにプロンプトを表示して次の1文字を待っている。yes-or-no-p はミニバッファを使用している。)。

     W a t a S i t a
     ------ Minibuffer -------
     わたした 渡した
     ------ Minibuffer -------

     RET

     -------------------------- Echo Area --------------------------
     Shall I register this as okuri-ari entry: わたs /渡/ ? (y or n)
     -------------------------- Echo Area --------------------------

プロンプトに対し、 y と回答した場合は、

     わたs /渡/[し/渡/]/

という辞書エントリが個人辞書の送りありエントリに書き込まれる。n で回答した場合は、個人辞書の送りなしエントリに

     わたした /渡した/

というエントリが書き込まれてしまうので、この例では適当でない。

送り仮名部分をローマ字プレフィックスに分解する際には、ユーザー変数 skk-kana-rom-vector の値が参照される。この変数のディフォルト値は、下記の通り。

     ["x" "a" "x" "i" "x" "u" "x" "e" "x" "o" "k" "g" "k" "g" "k" "g"
      "k" "g" "k" "g" "s" "z" "s" "j" "s" "z" "s" "z" "s" "z" "t" "d"
      "t" "d" "x" "t" "d" "t" "d" "t" "d" "n" "n" "n" "n" "n" "h" "b"
      "p" "h" "b" "p" "h" "b" "p" "h" "b" "p" "h" "b" "p" "m" "m" "m"
      "m" "m" "x" "y" "x" "y" "x" "y" "r" "r" "r" "r" "r" "x" "w" "x"
      "x" "w" "n"]

このベクトルは、それぞれ下記のかな文字をそのローマ字プレフィックスで現わしたものである。

     ぁ  あ  ぃ  い  ぅ  う  ぇ  え  ぉ  お  か  が  き  ぎ  く  ぐ
     け  げ  こ  ご  さ  ざ  し  じ  す  ず  せ  ぜ  そ  ぞ  た  だ
     ち  ぢ  っ  つ  づ  て  で  と  ど  な  に  ぬ  ね  の  は  ば
     ぱ  ひ  び  ぴ  ふ  ぶ  ぷ  へ  べ  ぺ  ほ  ぼ  ぽ  ま  み  む
     め  も  ゃ  や  ゅ  ゆ  ょ  よ  ら  り  る  れ  ろ  ゎ  わ  ゐ
     ゑ  を  ん

従い、ディフォルトでは、例えば見出し語中の送り仮名のじは、 j に、ちは、t に、ふは、h のローマ字プレフィックスに分解される。これらの送り仮名のローマ字プレフィックスをそれぞれ z、c、f に変更したい場合は、該当の個所を "z"、 "c"、"f" とするようなベクトルを .emacs や .skk に書いておく。

ありがさつきに対し有賀さつきを登録したい場合は、上記と同様に辞書登録をし、

     Shall I register this as okuri-ari entry: ありがs /有賀/ ? (y or n)

のプロンプトに対し n と回答する。この結果、個人辞書の送りなしエントリには、

     ありがさつき /有賀さつき/

というエントリが書き込まれる。

送りあり変換の変換開始のタイミング
-----------------

skk-process-okuri-early の値を non-nil にすることで、送りあり変換の変換開始のタイミングを早め、送り仮名のローマ字プレフィックスの入力時点で変換を開始することができる。

     U g o K

     ------ Buffer: foo ------
     ▼動k
     ------ Buffer: foo ------

送り仮名が分らないまま変換していることになるので skk-jisyo が送り仮名に対応した形に成長しない。つまりうごk /動/のような形態のままとなる。但し、

     うごk /動/[く/動/]/[か/動/]/[け/動/]/[き/動/]/[こ/動/]/

のようなエントリが既に skk-jisyo にあれば、それを破壊しない (辞書の形式 を参照のこと。)。このユーザーオプションを non-nil にしてSKKモードを起動すると、両立できないオプションである下記オプションは nilにセットされる。

     skk-kakutei-early,
     skk-auto-okuri-process, skk-henkan-okuri-strictly

SKKモード起動後にこのオプションの設定を変更した場合で、カレントバッファでは既にSKKモードに入っているときは、C-x C-j もしくは C-x j を2回タイプしてSKKモードを起動し直すことで、これらのユーザーオプション間の衝突を調整できる。またはメニューバーからこのユーザーオプションをオンにすると、自動的に上記の衝突を調整できる。 See skk-kakutei-early. See skk-auto-okuri-process. See skk-henkan-okuri-strictly.

カナモードでの変換の送り仮名の処理
-----------------

カナモードのまま変換を行なうと、見出し語をひらがなに変換してから辞書の検索を行なうことは前述の通りだが(see カタカナの見出し語)、カナモードで送りあり変換を行なうと、

     ------ Buffer: foo ------
     考えル。
     ------ Buffer: foo ------

のように送り仮名の第1文字だけが、ひらがなのまま残ってしまう。カナモードでの変換が誤って行なわれた場合はこれで良いことが多いのだが、漢字・カナ混じり文を書いているときは、送り仮名の第1文字もカタカナ変換された方が便利である。skk-convert-okurigana-into-katakana の値を non-nil にすることで、カナモードにて送りあり変換を行なった場合、送り仮名の第1文字もカタカナに変換するようになる。

自動変換開始
======

▽モードで見出し語の入力中に、単語や文節の区切りとなるような文字を打鍵すると、▽マークからポイントの直前の文字までを見出し語とし(最後に入力された文字は見出し語には含まれない)、SPC を打鍵することなく自動的に変換を開始し▼モードに入るようになっている  (某メーカーのMSDOS上の FEPの仕様を参考にした。)。単語や文節の区切りとなるような文字列は、 skk-auto-henkan-start-keyword-list にて指定する。

     K a n j i

     ------ Buffer: foo ------
     ▽かんじ
     ------ Buffer: foo ------

     w o
     ------ Buffer: foo ------
     ▼漢字を
     ------ Buffer: foo ------

skk-auto-okuri-process を non-nil にして 送り仮名の自動処理(see 送り仮名の自動処理)を行なっている場合は、下記のような変換も可能である(辞書に できr /出来/[る/出来/]/ というようなエントリがあるとして)。

     D e k i r u n n d e s u

     ------ Buffer: foo ------
     ▽できるんです
     ------ Buffer: foo ------

     .
     ------ Buffer: foo ------
     ▼出来るんです。
     ------ Buffer: foo ------

skk-auto-henkan-start-keyword-list のディフォルト値は下記の通りである。

     '("を" "、" "。" "．" "，" "？" "」" "！" "；" "：" ")" ";"
       ":" "）" "”" "】" "』" "》" "〉" "｝" "］" "〕" "}"
       "]" "?" "." "," "!" )

この自動変換開始機能をオフにしたければ、skk-auto-henkan-start の値を nil にする。

特殊変換
====

数値変換
----

数をパラメータ(引数)とする語には、４月１５日、第１２回などがある。日本語ではこれらを四月一五日や第12回、第一二回、第十二回などとも表現することができるが、これらに別々の辞書見出しを与えていたのでは変換効率をダウンさせる要因となる。従いSKKでは第１２回というような変換を行ないたい場合には、その数字部分を # で置き換えた見出し語第#回を用いる。

これに対応する辞書のエントリとしては、例えば、

     だい#かい /第#0回/第#1回/第#2回/第#3回/

のような文字列を与える。# の文字に数字 0、1、 2、3、4、9 を加えた文字列は、数字をタイプ別に表わしたもので、その意味は下記の通りである。

#0
     タイプ0。アスキー文字での数字。上記の例では 12 と変換される。

#1
     タイプ1。全角文字での数字。上記の例では１２と変換される。

#2
     タイプ2。漢数字で位取りなし。5500 は五五〇〇と変換される。

#3
     タイプ3。漢数字で位取りあり。5500 は五千五百と変換される。

#4
     タイプ4。数値再変換。見出し語中の数字そのもの  (p125 という見出し語であれば、その数値部分である 125 が再変換の見出し語となる。)をキーとして辞書を再検索し #4 の部分を再検索の結果の文字列で入れ替える。例を後述する。

#9
     タイプ9。将棋の棋譜の入力用。全角数字 + 漢数字に変換される。例を後述する。

いくつか例を述べる。辞書に

     # /#3/

というエントリがあるときに、

     Q 1 0 0 2 0 0 3 0 0 4 0 0 5 0 0 SPC  (または /
     1 0 0 2 0 0 3 0 0 4 0 0 5 0 0 SPC。)

とタイプすれば、百兆二千三億四十万五百と変換される  (数字を大文字で入力し始めるわけにはゆかないので Q または / で▽ モードに入る必要がある。)。

辞書エントリ

     #m#d /#0月#0日/

に対し / 2 m 2 5 d SPC とタイプすれば、2月25日と変換される  (m や d などアスキー文字を見出し語として入力したい場合は / キーを最初にタイプしSKK abbrev modeで入力する必要がある。See SKK abbrev mode.)。

辞書エントリ

     #kin /#9金/

に対し、/ 3 4 k i n SPC とタイプすれば、３四金と変換される。

辞書エントリ

     p# /#4/
     125 /東京都葛飾区/

に対し、/ p 1 2 5 SPC タイプすれば、見出し語 p125 の候補が #4 であるので、見出し語の数字部分の 125 に対し辞書が再検索され、東京都葛飾区と変換される。

辞書登録の例を1つ述べる。２月２５日を得るために、

     Q 2 g a t u 2 5 n i t i SPC

とタイプしたときに、辞書に見出し語

     #がつ#にち

がないときは、辞書登録時のプロンプトは、#がつ#にちとなる。全角数字のタイプは、#1 なので、２月２５日の全角数字部分を #1 で置き換えた文字列#1月#1日をミニバッファで作り登録する。辞書エントリは、

     #がつ#にち /#1月#1日/

となる。

なお、Emacs 19では、skk-numeric-conversion-float-num の値を non-nil にすると、浮動小数点数を使った見出し語に対応して変換を行なう。但し、その場合は、

     #.# /#1．#1/#0月#0日/

などの辞書見出しが使用できなくなるので、注意すること。

数値変換を行ないたくないときは、変数 skk-use-numeric-conversion の値を nil にする。

アスキー文字を見出し語とした変換
----------------

SKK abbrev mode では、アスキー文字を見出し語とした変換を行なうことができる。

まず、かなモードで / を入力することで、見出し語入力の間一時的にこのモードに入る。続けて入力する文字は、アスキー文字としてカレントバッファに挿入される。見出し語となるアスキー文字を入力し終った時点で SPC を押せば、その見出し語についての変換が得られる。仮に、

     is /インクリメンタル・サーチ/

というようなエントリが辞書にあるとして、

     /

     ------ Buffer: foo ------
     ▽
     ------ Buffer: foo ------

     is

     ------ Buffer: foo ------
     ▽is
     ------ Buffer: foo ------

     SPC

     ------ Buffer: foo ------
     ▼インクリメンタル・サーチ
     ------ Buffer: foo ------

     C-j

     ------ Buffer: foo ------
     インクリメンタル・サーチ
     ------ Buffer: foo ------

のように変換が行なわれる。

入力したアスキー文字をそのまま全角アルファベットに変換したい場合については、全角アルファベットへの変換 を参照のこと。

なお、SKK abbrev modeにおいても見出し語の補完を行なうことができる。 See 見出し語の補完.

今日の日付の入力
--------

かな/カナモードで @ をタイプすれば、今日の日付が入力される。

日付の形式は変数 skk-date-ad と skk-number-style により決定される。skk-date-ad の値が non-nil であれば西暦で、 nil であれば元号で表示する。skk-date-ad のディフォルト値は nil である。

また skk-number-style には下記の種類がある。

0
nil
     半角数字。1996年7月21日(日) のようになる。

1
t
     全角数字。１９９６年７月２１日(日) のようになる。

2
     漢数字。一九九六年七月二一日(日) のようになる。

上記の 1996年、１９９６年、一九九六年 の例は、いずれも skk-date-ad の値が nil であれば 平成8年 のように元号で表示される。skk-number-style のディフォルト値は、1 である。

L辞書  (see L辞書.)には, 見出し語 today のもとに、skk-date-ad と skk-number-style の全ての組み合わせがプログラム実行変換機能  (see プログラム実行変換.)を用いて登録されている。従い、/ t o d a y SPC とタイプすれば、今日の日付が上の形式で順次候補として表示される。

@ による日付けの変換入力を行ないたくない場合は、 skk-mode-hook などを利用して、

     (add-hook 'skk-mode-hook (function (lambda () (local-unset-key "@"))) )

のようにすることにより、アスキー文字の @ が挿入されるようになる。あるいは、全角文字の ＠ を挿入したい場合は、

     (aset skk-input-vector 64 "＠")
     (add-hook 'skk-mode-hook
               (function (lambda ()
                           (define-key skk-map "@" 'skk-self-insert) )))

のようにする  (aset の第2引数の64は、Emacsのchar type ?@を評価したときの数値である。skk-input-vector の変更方法についての詳細は、数字や記号文字の入力 を参照のこと。)。

プログラム実行変換
---------

辞書の候補にEmacs Lispのプログラムが書いてあれば、そのプログラムをEmacs の機能で実行し、返り値をカレントバッファに挿入する。これを「プログラム実行変換」という。例えば、辞書に

     now /(current-time-string)/

というエントリがあるときに / n o w SPC とタイプすれば、カレントバッファには current-time-string の返値である

     Sun Jul 21 06:40:34 1996

のような文字列が挿入される。

実行変換プログラムの返り値は文字列である必要がある。プログラム実行変換の辞書登録は通常の単語と同様に行なうことができるが、その中に改行を含んではならない。 (通常の単語は、物理的な改行を、評価するとその位置に改行を挿入するような実行変換プログラムに変換して辞書に書き込んでいる (see 辞書の形式)が、実行変換プログラムは、そのプログラム中の改行だけを取り出して、上記のように改行を表現することができない。)。

今日の日付の入力  (see 今日の日付の入力.) で説明した today の辞書エントリは下記のような実行変換プログラムとなっている。

     today /(let ((skk-date-ad) (skk-number-style t)) (skk-today))/.../

skk-gadget.el  (gadget は「上手く工夫した道具」の意味。「色々飛び出す気のきいたおもちゃ箱」というような意味で名付けられた。余談だが、X Windowで使用される Widget という言葉は、 window+gadget から作られた造語らしい。)には、西暦/元号変換プログラムや、簡単な計算プログラムなど、実行変換プログラムが集められている。その中の1つを説明する。下記は、引数としてoperatorを取り、見出し語の数字に対しその演算を行なう簡単な計算プログラムである。

     (defun skk-calc (operator)
       ;;2つの引数を取って operator の計算をする。
       ;;注意: '/ は引数として渡せないので (defalias 'div '/) などとし、別の形で
       ;;skk-calc に渡す。
       ;;辞書見出し例; #*# /(skk-calc '*)/
       (int-to-string (apply operator (mapcar 'string-to-int skk-num-list))) )

数値変換  (see 数値変換.)で説明した通り、見出し語における数字は # で表わして辞書登録を行なうので 111*45 のような乗算を行ないたいときは、

     #*# /(skk-calc '*)/

という辞書エントリを用意する。Q 1 1 0 * 4 5 SPC とタイプしたときの 111 と 45 の2つの数字は、SKK内部では変換時に skk-num-list に ("111" "45") のように文字列のリストとして保存される。このリストの各要素に対し乗算を行ないたいので、各要素を一旦数値に変換し、その数値にoperatorを適用し、その結果を文字列に変換して返す、という作業を行なっている。

接頭辞・接尾辞
=======

辞書の見出し語の一部に >, <, ? を用いることにより接頭辞(prefix)、接尾辞(suffix)の入力をサポートしている。例えば、辞書に

     >し /氏/

というエントリーがあるとき、小林氏を接尾辞入力を用いて、以下のように入力することができる(-!-はポイントを表わす)。

     K o b a y a s h i

     ------ Buffer: foo ------
     ▽こばやし-!-
     ------ Buffer: foo ------

     SPC

     ------ Buffer: foo ------
     ▼小林-!-
     ------ Buffer: foo ------

     >

     ------ Buffer: foo ------
     小林▽>-!-
     ------ Buffer: foo ------

     s i

     ------ Buffer: foo ------
     小林▽>し-!-
     ------ Buffer: foo ------

     SPC

     ------ Buffer: foo ------
     小林▼氏-!-
     ------ Buffer: foo ------

     C-j

     ------ Buffer: foo ------
     小林氏-!-
     ------ Buffer: foo ------

このように入力することで、見出し語しに対応する語で、接尾辞になり得ないものを候補に入れずに辞書が構成可能になるので、候補の絞り込みの点で有利である。同様に辞書に

     ちょう> /超/

というエントリーがあるとき、超大型を接頭辞入力を用いて以下のように入力することができる。

     T y o u

     ------ Buffer: foo ------
     ▽ちょう-!-
     ------ Buffer: foo ------

     >

     ------ Buffer: foo ------
     ▼超-!-
     ------ Buffer: foo ------

     O o g a t a

     ------ Buffer: foo ------
     超▽おおがた-!-
     ------ Buffer: foo ------

     SPC

     ------ Buffer: foo ------
     超▼大型-!-
     ------ Buffer: foo ------

     C-j

     ------ Buffer: foo ------
     超大型-!-
     ------ Buffer: foo ------

接頭辞・接尾辞の入力の指定に使用するキーは、 skk-special-midashi-char-list の値を変更することによりカスタマイズできる。この変数のディフォルト値は、

     (?> ?< ??)

である。? をタイプした時点で接頭辞・接尾辞入力に移行するのではなく、全角文字？を挿入したい場合には ? を skk-special-midashi-char-list から外して

     (setq skk-special-midashi-char-list '(?> ?<))

とする。

暗黙の確定のタイミング
===========

標準の設定では、▼モードにおいて印字可能な文字または RET をタイプすると、暗黙の確定が行なわれ直ちに確定する。具体的には下記のようになる。

     K a k u t e i

     ------ Buffer: foo ------
     ▽かくてい
     ------ Buffer: foo ------

     SPC

     ------ Buffer: foo ------
     ▼確定
     ------ Buffer: foo ------

     s

     ------ Buffer: foo ------
     確定s
     ------ Buffer: foo ------

     u

     ------ Buffer: foo ------
     確定す
     ------ Buffer: foo ------

skk-kakutei-early の値を non-nil にすることで、暗黙の確定が行なわれるタイミングを、カッコ類((, ), [, ])や句読点(,, .)の入力時、次の変換開始時(A から Z までの大文字)、あるいは RET 入力時まで後へずらすことができる。

     K a k u t e i

     ------ Buffer: foo ------
     ▽かくてい
     ------ Buffer: foo ------

     SPC

     ------ Buffer: foo ------
     ▼確定
     ------ Buffer: foo ------

     s

     ------ Buffer: foo ------
     ▼確定s
     ------ Buffer: foo ------

     u r u

     ------ Buffer: foo ------
     ▼確定する
     ------ Buffer: foo ------

     .

     ------ Buffer: foo ------
     確定する。
     ------ Buffer: foo ------

区切の良いところまで一気に入力しておき、後で候補を選択する、というような使い方をするときには便利なユーザーオプションであろう。なおこのユーザーオプションは skk-process-okuri-early とは共存できないので、 skk-process-okuri-early の値を nil にしておく必要がある。メニューバーからこのユーザーオプションをオンにしたときは、これらのユーザーオプション間の衝突は自動的に調整される。

リージョン一括変換
=========

下記のコマンドを M-x により呼ぶことでリージョン一括変換を行なうことができる。変換の種類と対応するコマンドは以下の通り。

カタカナをひらがなへ変換。
     M-x skk-hiragana-region

ひらがなをカタカナへ変換。
     M-x skk-katakana-region

全英文字をアスキー文字へ変換。
     M-x skk-ascii-region

アスキー文字を全英文字へ変換。
     M-x skk-zenkaku-region

漢字をひらがなへ変換。
     M-x skk-gyakubiki-region  具体的な変換例をあげると、

          ``漢字をひらがなへ変換。'' ==> ``かんじをひらがなへへんかん。''

     のようになる。引数を渡して、C-u M-x skk-gyakubiki-region のようにすることで、複数の候補がある場合は、`{}' でくくって表示する。例えば、

          ``中島'' ==> ``{なかしま|なかじま}''

     のようになる。送り仮名がある語は、送り仮名まで含めてリージョンに指定しないと誤変換の原因となる。例えば、五月蝿い について、送り仮名いを含めずにこのコマンドを実行すると、ごがつはえ に変換されてしまう。

漢字をカタカナへ変換。
     M-x skk-gyakubiki-katakana-region  具体的な変換例は上記を参照のこと。引数を渡して、C-u M-x skk-gyakubiki-katakana-region のようにすることで、複数の候補がある場合は、`{}' でくくって表示する。

漢字にふりがなを付ける。
     M-x skk-hurigana-region  具体的には例えば、

          ``漢字の脇に'' ==> ``漢字[かんじ]の脇[わき]に''

     のようにふりがなが振られる。引数を渡して、C-u M-x skk-hurigana-region のようにすることで、複数の候補がある場合は、 `{}' でくくって表示する。

漢字にカタカナのふりがなを付ける。
     M-x skk-hurigana-katakana-region  変換例は、上記を参照のこと。引数を渡して、C-u M-x skk-hurigana-katakana-region のようにすることで、複数の候補がある場合は、`{}' でくくって表示する。

漢字、ひらがな、カタカナ、全英文字を全てローマ字へ変換。
     M-x skk-romaji-region  ディフォルトでは、ローマ字への変換様式にヘボン式を用いる。例えば、

          ``し'' ==> ``shi''

     skk-romaji-*-by-hepburn の値を nil にすると、訓令式(「日本式」とも言うようだ)を用いる。例えば、

          ``し'' ==> ``si''

     昭和29年12月9日付内閣告示第一号によれば、原則的に訓令式(日本式)を用いるかのように記載されているが、今日一般的な記載方法は、むしろ、ヘボン式であるように思う。

メニューバーが使用できる環境では、メニューバーを使ってこれらの一括変換コマンドを起動することができる。 See メニューバー (GNU Emacs Manual).

上記の内、最後の5つについては、KAKASIがインストールされていなければ使用することができない。See KAKASI.

また、KAKASI関連コマンドと同様の変換を行なうが、リージョンの文字列を置き換えるのではなく、変換結果をエコーエリアに表示するコマンドがある。コマンド名のみ紹介する。上述のリージョン一括変換コマンドの説明と下記のコマンド名から容易に動作を想像することができるであろう。引数を渡してコールした場合の動作も同様である。

  * M-x skk-gyakubiki-message

  * M-x skk-gyakubiki-katakana-message

  * M-x skk-hurigana-message

  * M-x skk-hurigana-katakana-message

  * M-x skk-romaji-message

漢字コード関連
=======

漢字コードまたはメニューによる文字入力
-------------------

\ キーをタイプすることにより、漢字コード(JISまたはEUCコード) またはメニューによる文字入力が可能となる。ミニバッファには、 JIS or EUC code (00nn or CR for Jump Menu):  というプロンプトが出る。

漢字コードが予め分っている場合にはそのプロンプトに対し、漢字コードを入力する。例えば℃の漢字コードは、JIS コードでは 216e、EUCコードでは a1ee なので、いずれかの漢字コードを入力すれば℃がカレントバッファに挿入される。

漢字コードが不明の文字の入力には2段階メニューを用いた入力が可能である。プロンプトに対し RET キーをタイプすると、第1段階のメニューが次のように表示される。

     A:　  S:‾  D:〜  F:｝  G:＝  H:¢  Q:◆  W:  E:∩  R:  T:≡  Y:

第1段階のメニューでは、JIS漢字をコードの順に16文字毎に1文字抽出し、ミニバッファに一度に12文字づつ表示される。上記の例では、JISコード 2121 の全角スペースが A:　 として、以下 2131、 2141、2151 ... の文字がそれぞれ B:‾、 C:〜、D:｝ ... として表示される。ここで SPC をタイプすると、漢字コードの値を 16x12 == 192 づつ増やし次の候補群を表示する。x により1つ前の候補群に戻ることができる。

メニューのキー a, s, d, f, g, h, q, w, e, r, t, y のいずれかをタイプすれば (大文字でも小文字でも可。)、そのキーに対応する文字から始まる16個の文字が漢字コード順に表示される。これを第2段階のメニューという。例えば、第1段階のメニューが上記の状態のときに d をタイプすると第2段階のメニューは以下のようになる。

     A:〜 S:‖ D:｜ F:… G:‥ H:‘ J:’ K:“ L:” Q:（ W:） E:〔 R:〕 T:［ Y:］ U:｛

第2段階のメニュー中のキーをでタイプすると、対応する文字がカレントバッファに挿入されてメニューによる入力が終了する。第2段階のメニューが表示されているときも SPC と x キーで第2段階のメニューを前進、後退させることができる。また <、> によりメニューを1文字分だけずらすことができる。例えば、第2段階のメニューが上記の状態のときに < をタイプすると、メニューは以下のようになる。

     A:＼ S:〜 D:‖ F:｜ G:… H:‥ J:‘ K:’ L:“ Q:” W:（ E:） R:〔 T:〕 Y:［ U:］

第1段階あるいは第2段階のメニューが表示されているときに ? をタイプすると、そのときのキー A に対応する文字(上記の例では、＼) の文字コードが表示される。第1段階も第2段階もメニューのメニューのキーは、ユーザーが変更することができる。これについては、候補の選択に用いるキー を参照のこと。

漢字コードを知る方法
----------

かな/カナモードで $ をタイプすれば、ポイントにある漢字コードをミニバッファに表示する。例えば、カーソルを文字Аの上に置いて $ をタイプすると

     『А』  EUC: a7a1 (167, 161), JIS: 2721 ( 39,  33)

がエコーエリアに表示され、この文字がロシア文字であることがわかる。

▼モードの特殊キー
=========

確定動作を行なうキー
----------

明示的な確定動作は skk-kakutei-key の値により指定されるキーにより行なわれる。標準設定ではその値は ``\C-j'' となっている。

候補の選択に用いるキー
-----------

変換において、候補が5つ以上あるときは5番目以降の候補は7つずつまとめてエコーエリアに下記のように表示される  (see ▼モード.)。

     -------------------- Echo Area --------------------
     A:嘘  S:拒  D:拠  F:虚  J:挙  K:許  L:渠  [残り 2]
     -------------------- Echo Area --------------------

この際、候補の選択に用いるキーは、 skk-henkan-show-candidates-keys に7つのchar typeのキーを持つリストを代入して変更できる。ディフォルト値は、下記の通りである。

     '(?a ?s ?d ?f ?j ?k ?l)

このリストには7つの小文字のchar typeのキーを含まなければならない。 x, SPC 及び C-g は、それぞれ候補選択中における前候補群の表示、 次候補群の表示、取り止めのために割り付けられているので、 skk-henkan-show-candidates-keys の中に含めてはならない。

メニューによる文字入力 (see 漢字コードまたはメニューによる文字入力.)の際に候補の選択に用いられるキーは、下記の2変数により変更することができる。

skk-input-by-code-menu-keys1
     第1段階のメニューにおける候補の選択キー。

skk-input-by-code-menu-keys2
     第2段階のメニューにおける候補の選択キー。

skk-input-by-code-menu-keys1 のディフォルト値は、

     '(?a ?s ?d ?f ?g ?h ?q ?w ?e ?r ?t ?y)

である。このリストには12個の文字のchar typeのキーを含む必要がある。

また skk-input-by-code-menu-keys2 のディフォルト値は、

     '(?a ?s ?d ?f ?g ?h ?j ?k ?l ?q ?w ?e ?r ?t ?y ?u)

である。このリストには16個の文字のchar typeのキーを含む必要がある。 skk-input-by-code-menu-keys1 と skk-input-by-code-menu-keys2 に共通であるが、このリストに小文字が指定された場合は、候補の選択の際にユーザーにより該当の大文字キーが入力されても候補の選択が可能となるようにSKK内部で処理されるが、このリストに大文字が指定された場合、ユーザーにより該当の小文字キーが入力されても候補の選択ができなくなってしまう。いずれのリストにも小文字で指定することをお勧めする。

▼モードでの RET
----------

標準設定では、

     K a k u t e i SPC

     ------ Buffer: foo ------
     ▼確定-!-
     ------ Buffer: foo ------

     RET

     ------ Buffer: foo ------
     確定
     -!-
     ------ Buffer: foo ------

のように、▼モードで RET を入力すると、確定し、かつ改行を行なうが、 skk-egg-like-newline の値を non-nil にすると、確定するのみで改行しない。

     K a k u t e i SPC

     ------ Buffer: foo ------
     ▼確定-!-
     ------ Buffer: foo ------

     RET

     ------ Buffer: foo ------
     確定-!-
     ------ Buffer: foo ------

辞書登録モードにおいて▼モードであるとき、RET の入力により確定動作と辞書登録動作が同時に行なわれたが、skk-egg-like-newline の値が non-nil であるときは、確定はするが改行しないので、結果的に辞書登録動作のためにもう一度 RET を入力する必要がある。辞書登録モードにおけるディフォルトの確定、登録の動作については、辞書登録モード を参照のこと。

▼モードでの BS
---------

標準設定では、▼モードで BS を押すと、前の一文字を削除し確定する。

     D e n k i y a SPC

     ------ Buffer: foo ------
     ▼電気屋
     ------ Buffer: foo ------

     BS

     ------ Buffer: foo ------
     電気
     ------ Buffer: foo ------

skk-delete-implies-kakutei の値を non-nil にすると、一つ前の候補を表示する。例えば、

     でんき /電気/伝記/

という辞書エントリがあったとすると、下記のようになる。

     D e n k i SPC SPC

     ------ Buffer: foo ------
     ▼伝記
     ------ Buffer: foo ------

     BS

     ------ Buffer: foo ------
     ▼電気
     ------ Buffer: foo ------

     BS

     ------ Buffer: foo ------
     ▽でんき
     ------ Buffer: foo ------

送りあり変換中の C-g
------------

送りありの変換中に C-g をタイプすると、▼モードを抜け、その見出し語と送り仮名をカレントバッファに挿入し、■モードに入る。

     N a K u

     ------ Buffer: foo ------
     ▼泣く
     ------ Buffer: foo ------

     C-g

     ------ Buffer: foo ------
     なく
     ------ Buffer: foo ------

skk-delete-okuri-when-quit の値を non-nil にすれば C-g のタイプにより送り仮名を消す。例えば、下記のようになる。

     N a K u

     ------ Buffer: foo ------
     ▼泣く
     ------ Buffer: foo ------

     C-g

     ------ Buffer: foo ------
     ▽な
     ------ Buffer: foo ------

skk-delete-okuri-when-quit の値を non-nil にすることによりそのままの状態で送り仮名の再入力が可能となるので、送り仮名の入力間違いを犯しやすい人には便利であろう。

辞書関連
====

個人辞書中の単語の削除
-----------

誤まって個人辞書  (see 個人辞書.)に登録した単語の削除は、削除したい単語を変換により求め、その単語が得られた時点でX を入力する。ミニバッファに確認のプロンプトが出るので、それに対し y e s とタイプしたとき個人辞書の対応するエントリが削除され、カレントバッファに削除のために一旦変換した単語も削除される。

     さいきてき /再起的/

というエントリを誤って登録したという仮定で、その誤登録を削除する場合を例にとって説明する。

     S a i k i t e k i SPC

     ------ Buffer: foo ------
     ▼再起的
     ------ Buffer: foo ------

     X

     ------------------ MiniBuffer ------------------
     Really purge ``さいきてき /再起的/''?(yes or no)
     ------------------ MiniBuffer ------------------

     y e s RET

     ------ Buffer: foo ------

     ------ Buffer: foo ------

個人辞書の保存動作
---------

個人辞書の保存動作について述べる。個人辞書の保存を行なうのは、次の3通りの場合がある。

 1. C-x C-c (または M-x save-buffers-kill-emacs) によりEmacsを終了させようとした場合。

 2. M-x skk-save-jisyo とタイプするか、メニューバーにより Save Jisyo を選択した場合。

 3. skk-jisyo-save-count で指定された回数辞書のアップデートを行なった場合にオートセーブ機能が働くとき。

保存動作を分解すると、まずEmacsに読み込んだ個人辞書が更新されているかどうかを調べ、更新されていたら保存動作に入る。Emacsの個人辞書バッファを一時ファイルに保存して、そのサイズが現存の(セーブ前の) skk-jisyo より小さくないかどうかをチェックする。一時ファイルのサイズが0である場合は直ちに保存動作を中止するので、

     M-x skk-kill-emacs-without-saving-jisyo

でEmacsを終了させ skk-jisyo, skk-backup-jisyo をチェックすべきである(skk-jisyo が既につぶれており、 skk-backup-jisyo につぶれる前の個人辞書が残っているかもしれない)。一時ファイルのサイズが0でなく、かつ skk-jisyo のそれより小さいときはミニバッファにプロンプトを出して保存動作を継続するかどうかユーザーに確認を求める。

     --------------------------- Minibuffer -----------------------------
     New ~/.skk-jisyo will be 11bytes smaller.  Save anyway?(yes or no)
     --------------------------- Minibuffer -----------------------------

ここで n o RET とタイプした場合は、そこで保存動作が中止されるので skk-jisyo はセーブする前の状態のままである。y e s RET とタイプした場合は skk-backup-jisyo を削除し、元の skk-jisyo を skk-backup-jisyo にリネームし、最後に一時ファイルに保存した新しい個人辞書を skk-jisyo にリネームする。

通常の使用の範囲では M-x skk-purge-from-jisyo した場合、あるいは個人辞書をユーザーが意図的に編集した場合に、個人辞書が小さくなる可能性があるぐらいで、他の場合はバグ以外には考えにくい。

個人辞書の保存時のサイズ比較の機能は、主に開発者が新機能の追加したときのバグで個人辞書を失なわないように自己防衛の目的で開発されたので、SKKが安定している状態では不要な機能であるかもしれない。 skk-compare-jisyo-size-when-saving の値を nil にすると、一時ファイルが0であるかどうかのみのチェックを行ない、セーブ前の skk-jisyo とのサイズ比較は行なわない。

個人辞書のオートセーブは skk-jisyo-save-count で指定された回数、個人辞書のアップデートを行なった場合に行なわれる。個人辞書のアップデート回数は確定回数でもある。同じ候補について確定した場合でもそれぞれ1回とカウントされる。これは、個人辞書のミニマムポイント  (送りあり変換では skk-okuri-ari-min + 1の位置、送りなし変換では skk-okuri-nasi-min + 1の位置がそれぞれミニマムポイントになる。) に常に最後に変換を行なったエントリを移動させるために  (厳密に言えば、同じ見出し語、同じ候補について続けて2度以上確定した場合は、該当するエントリを移動させる必要はないのだが、現実の処理としては、移動させようとするエントリがミニマムポイントにあるかどうかのチェックを省いているので、結果的には該当するエントリを一度削除してから同じ場所にそれを挿入していることとなる。従い、アップデート回数としては、同じ見出し語、同じ候補について続けて2度確定した場合は、それぞれ1回(合計2回)として数えている。同じ見出し語、同じ候補について連続して変換する場合がそれほど頻度としては多くないこと、チェックをしようとした場合は、見出し語がミニマムポイントにあるかどうかのチェックに加えて、移動しようとするエントリの候補群の並びが最後の変換時のそれと変わらないかどうか---異なる場合は見出し語の位置は同じでも候補群の順序を変更するために削除する必要がある---をチェックしなければならないこと、の2点から、個人辞書中の最後に変換した見出し語のエントリを削除すべきかどうか、のチェックをしない方が全体的な効率が良いと考えている。)、エントリ数、候補数が全く増えていなくとも、確定により個人辞書が更新されているからである。skk-jisyo-save-count のディフォルト値は、50である。 skk-jisyo-save-count の値を nil にすることで、オートセーブを一切行なわないようにすることができる。

変換及び個人辞書に関する統計
--------------

Emacsの終了時にSKKの変換及び個人辞書に関する統計が取られ、 ~/.skk-record に保存される。保存される内容は下記のような形式である。

     Sun Jul 28 09:38:59 1996  登録:   4  確定:  285  確定率:  98%  語数:  3042

統計の保存のためのファイルは skk-record-file で指定できる。また、統計を取るのをやめたければ skk-keep-record を nil にする。

なお、上記の「語数」の欄は1行を1語としてカウントしているので1つの見出し語に対し複数のエントリを持っている場合、2つ目以降の候補を無視しているが skk-count-private-jisyo-candidates-exactly の値を non-nil にすることで、その分余計に時間はかかるが、正確に語数をカウントすることができる。なお、この場合でも [ と ] に囲まれた送り仮名毎のブロック内は数えない。

辞書エントリの数えあげ
-----------

M-x skk-count-jisyo-entries により辞書エントリを数えることができる。

     M-x skk-count-jisyo-entries

     --------------- MiniBuffer --------------
     File: (default: /your/home/.skk-jisyo) ~/
     --------------- MiniBuffer --------------

     . s k k - j i s y o RET

     -------------- Echo Area --------------
     Counting jisyo candidates... 100% done
     -------------- Echo Area --------------

     ------ Echo Area ------
     3530 entries
     ------ Echo Area ------

[ と ] に囲まれた送り仮名毎のブロック内は数えない。

メニューバーが使用できる環境では、メニューバーを使ってこのコマンドを起動することができる。 See メニューバー (GNU Emacs Manual).

辞書バッファの文字コードの設定
---------------

skk-jisyo-code の値により辞書ファイルの漢字コードを設定することができる。``euc'', ``ujis'', ``sjis'', ``jis'' などの文字列の他 *euc-japan*, *sjis*, *junet* などのシンボルを指定することもできる。

skk-jisyo-code の値をディフォ値である nil にしておくと、 SKK側で辞書字コードの設定に関する動作は行なわない  (Mule側の機能に依存する。)。

辞書バッファのメジャーモード
--------------

各辞書を skk-search-kakutei-jisyo-file もしくは skk-search-jisyo-file によりEmacsのバッファに辞書を取り込んだとき (あるいは skk-search-server により検索していたが、サーバーと接続できなってバッファに取り込んだとき)は、辞書バッファの名前は、空白 +*+辞書ファイル名(ディレクトリ抜き)+* という規則に基づき付けられる。例えば、skk-large-jisyo に代入されているファイル名が /usr/local/libexec/emacs/19.33/etc/SKK-JISYO.L であると、これに対する辞書バッファ名は、 *SKK-JISYO.L* となる。このバッファのメジャーモードの実体は fundamental-mode であるが、メジャーモード名に skk-jisyo-mode、mode-name に``SKK辞書''を代入している。

これは、dabbrev.el において、カレントバッファと同じモードの他のバッファをサーチしてdabbrevを行なうように設定することができるのだが、仮に辞書バッファが fundamental-mode のままであるとすると、 fundamental-mode においてdabbrevを行なったときに、dabbrevのために辞書バッファを検索することになるためである。動的な補完を行なうこのパッケージの主旨から言って、辞書バッファを検索することは適当でないと考えるからである。

mode-name に``SKK辞書''を代入していることについては必然性がないが、メジャーモードを skk-jisyo-mode に変更しているのに mode-name が fundamental-mode のままでは、辞書バッファをのぞく好奇心旺盛なユーザーにとって混乱の種になるのではないかと考えたからである。

辞書バッファの buffer-file-name
------------------------

個人辞書の保存は、前述した通り、一旦一時ファイルに保存し、そのサイズを古い個人辞書のものと比較し、その後古い個人辞書をバックアップ辞書に退避して、一時ファイルを個人辞書にリネームする、という複雑な一連の動作をしており、単に buffer-file-name に依存して読み込んだファイルを保存するものではない。See 個人辞書の保存動作.

一方、buffer-file-name が non-nil になっている、特定のファイルと紐付きになっているバッファがあって、M-x compile など内部で save-some-buffers をコールしているコマンドを使ったとすると、一々その未セーブのバッファをセーブするかどうかをユーザーに尋ねる機能がEmacs には備えられている。仮に個人辞書のバッファが特定のファイルと紐付きになっていると、save-some-buffers がコールされる度に個人辞書のバッファをセーブするかどうかを尋ねられてしまう。

SKKバージョン9.6では、buffer-file-name に skk-jisyo 指定のファイルを代入していないので、個人辞書のバッファは、 save-some-buffers の対象でもなくなり、ユーザーがSKK以外のパッケージから個人辞書バッファのセーブを尋ねられることはない。

この変更に従い、辞書バッファについては、特定のファイルとの関係がなくなったので、辞書バッファを編集を行なうユーザーには注意すべき点がある。具体的に言えば、辞書バッファに読み込まれた個人辞書以外の辞書 (skk-large-jisyo, skk-aux-large-jisyo, skk-kakutei-jisyo, skk-initial-search-jisyo) を、ユーザーが辞書バッファに入り込んで編集した後、C-x C-c (save-buffers-kill-emacs)すると、Emacsからセーブするかどうかの確認を求められることなく編集した辞書バッファが捨てられる(つまり辞書ファイルは未編集のままの状態である)。どうしてもその編集した辞書バッファを保存したければ、明示的に C-x C-s (save-buffer) か、もしくは C-x C-w (write-file) でファイル名指定してやれば保存することは可能だが、保存後そのバッファは、保存時に指定したファイルが新たに buffer-file-name に代入されるので、SKKの辞書バッファではなく、そのファイルそのものをオープンされている状態となる (see 辞書バッファのネーミング規則。)。従いその後、その辞書バッファを skk-search-jisyo で検索すると再び読み込まれてしまう。再読み込みによる不都合は、メモリ消費以外には特にない。

デコレーション
=======

仮名文字のローマ字プレフィックスのエコー
--------------------

skk-echo により仮名文字のローマ字プレフィックス (see ローマ字プレフィックス.)のエコーの有無を調整できる。skk-code が non-nil であれば、仮名文字のローマ字プレフィックスが入力時点で一旦カレントバッファに挿入され、続く母音の入力により、かな文字に変換された時点でカレントバッファから消去される。

     t

     ------ Buffer: foo ------
     t
     ------ Buffer: foo ------

     a

     ------ Buffer: foo ------
     た
     ------ Buffer: foo ------

skk-echo の値を nil にすると、仮名文字のローマ字プレフィックスのエコーは行なわれなくなる。上記の例では t がカレントバッファに挿入されることはなくなり、ローマ字1文字が完成する母音 a が入力される直前にいきなりたの文字が挿入される。

入力モードを示すモードラインの文字列の変更
---------------------

下記の変数の値を変更することにより入力モードを示すモードラインの文字列を変更することができる。

skk-mode-string
     アスキーモードを示す文字列。ディフォルト値は、``--SKK:''。

skk-hirakana-mode-string
     かなモードを示す文字列。ディフォルト値は、``--かな''。

skk-katakana-mode-string
     カナモードを示す文字列。ディフォルト値は、``--カナ''。

skk-zenei-mode-string
     全英モードを示す文字列。ディフォルト値は、``--全英''。

入力モードを示すカーソル色に関する設定
-------------------

カラーディスプレイを使用し、カラー表示をサポートしているWindow System下で対応するEmacsを使用している場合には、入力モードの変更に合わせてカーソル色が変更される (Emacs 18にはカーソル色の変更機能はない。また、 Emacs 19であっても、-nw オプションを指定してEmacsを起動した場合は、この機能が使えない。)。この機能を使用したくない場合は、 skk-use-color-cursor の値を nil にする。

skk-use-color-cursor の値が non-nil の場合は、入力モードを示すカーソル色は、下記の変数によって決定されるので、これらの変数の値を変更することにより、カーソル色を変更することができる。

skk-default-cursor-color
     SKKモードがオフであることを示すカーソル色。カーソルのある該当フレームにおけるディフォルトのカーソル色が代入される。

skk-kana-cursor-color
     かなモードであることを示すカーソル色。ディフォルト値は、reverseVideoが offのときは``coral4''onのときは``pink''。

skk-katakana-cursor-color
     カタカナモードであることを示すカーソル色。ディフォルト値は、reverseVideo がoffのときは``forestgreen''onのときは``green''。

skk-zenkaku-cursor-color
     全角英字モードを示すカーソル色。ディフォルト値は、``gold''。

skk-ascii-cursor-color
     アスキーモードを示すカーソル色。ディフォルト値は、reverseVideoがoffのときは``ivory4''onのときは``gray''。

カーソル色の変更の際、カラーマップ切れが起きた場合にはエラーメッセージを表示し、ディフォルトのカーソル色を使う。このエラーメッセージの表示を止めるには、skk-report-set-cursor-error の値を nil にする。

▼モードにおける変換候補のハイライト表示
--------------------

skk-use-face が non-nil の場合、skk-henkan-face に指定されたface属性をもって変換候補をハイライト表示する。このハイライト表示はEmacsのOverlaysの機能を使っている  (以前のバージョンではText Propertiesを使用していたが、egg.el, canna.el, wnn-egg.el を参考にしてOverlaysを使用するように変更した。Overlays は、テキストの一部ではないので、Overlaysのかかったテキストから文字を切り出してもコピーの対象にならないし、アンドゥ時も無視されるので、変換された候補の表示を一時的に変更するにはText Propertiesよりも好都合なためである。 Emacs 18ではOverlaysが実装されていない。)。skk-henkan-face のディフォルト値は、highlight である。Emacs標準フェイスの default, modeline, region, secondary-selection, highlight, underline, bold, italic, bold-italic  (default 以外のface上で変換を行なっている場合は、変換によりfaceを default に変更しても意味があろうが、通常はそのようなケースは稀であるので、 default faceを利用することはまずないであろう。)の他、新たにfaceを作り、利用することも可能。

新たな face を作り指定するには skk-make-face を利用して、

     (skk-make-face 'DimGray/PeachPuff1)
     (setq skk-henkan-face 'DimGray/PeachPuff1)

のようにするのが手軽。この例では、foreroundがDimGrayで、background がPeachPuff1であるfaceを作り  (この配色は私が日常使用しているお気に入りのものである。少なくとも表現力乏しい私のノートパソコンの液晶では、過激な配色でなくやわらかい色に見えるため、目の疲れも少ないので重宝しているが、他の方のディスプレイ上ではどんな感じに映るのであろうか。ひょっとして恐ろしく趣味の悪い色に見えているかと想像すると少し不安である。)、この faceをもって変換候補の部分に色名を指定している。foregroundの色のみを変更するためのfaceを作りたい場合は、

     (skk-make-face 'RosyBrown1)

のようにする。foregroundとbackgroundの色指定だけでない凝ったfaceを作る場合は、skk-make-faceでは対応できないので、Emacsのhilit19.el のhilit-lookup-face-createなどを利用する。色名については、X Windowに添付されている rgb.txt を参照のこと。配色として参考になるものは、Mule-2.3標準添付である canna.el の canna:attribute-alist などがある。

エラーなどの日本語表示
-----------

ディフォルトでは、エラー・メッセージ・ミニバッファプロンプトを英語表示する。skk-japanese-message-and-error の値を non-nil にすることで、これを日本語で表示する。

VIPとの併用
=======

skk-use-vip の値を non-nil にすることで、VIエミュレーションパッケージであるVIPを併用することができる。See VIP (vip).  現時点では、正式に対応しているVIPのバージョンは3.5  (Mule-2.3 に標準添付のもの。なおVIP 3.5は、その後VIP 4に引き継がれ、いくつかのマイナーバージョンを経てVIP19, VIPERと発展している。Emacs 19に標準添付されているのはVIPERである。ちなみにVIP3.5の作者は、SKKの作者でもある佐藤雅彦 <masahiko@kuis.kyoto-u.ac.jp> であるが、VIPの後継バージョンはいずれも別人によるものである。)のみである。しかもVIP 3.5は、Emacs 18からEmacs 19へのバージョンアップに取り残されたままEmacs 19に添付されており、Emacs 19ではそのままでは上手く動作しない。従い、現状では、NemacsもしくはEmacs 18ベースのMule-1.xと vip.el 3.5という組み合わせでのみSKKを併用することができる。

SKKのディストリビューションにvip.el 3.5をEmacs 19ベースのMuleでとりあえず動かすためのパッチを添付している  (本質的には、 mark 関数の仕様が Emacs 18と19とでは違うので、これに対応しさえすれば良いのだが、コードが簡略化できる個所には少し手を入れていている。なお、 VIPERではこれらの簡略化も含めて既に改良済みである。)。VIPER対応までの間、 VIエミュレーションのEmacs19でSKKを動かしたいユーザーは一度お試しいただきたい。

将来のバージョンのSKKにおいてVIP 3.5の後継バージョンであるVIPER (see VIPER (viper).) の併用が可能になるよう改良される予定である。

I-search関連
==========

起動時の入力モードの指定
------------

skk-isearch-start-mode の値を指定することで、インクリメンタル・サーチを起動した元のバッファの入力モードにかかわらず、インクリメンタル・サーチの起動時の入力モードを指定することができる(但し、 skk-isearch-use-previous-mode の値は nil にしておく必要がある)。

ascii
     アスキーモード

kana
hirakana
     かなモード

eiji
     全英モード

一方 skk-isearch-use-previous-mode の値を non-nil にすることで、直前のインクリメンタル・サーチでの入力モードを用いるよう指定することもできる。

間に空白等を含む文字列の検索
--------------

検索という文字列をインクリメンタル・サーチによりマッチさせたい場合に、バッファが下記のような状態になっていることがある。

     -------- Buffer: foo --------
     この行末から始まる文字列を検
     索して下さい。
     -------- Buffer: foo --------

正規表現を用いたインクリメンタル・サーチ  (ディフォルトのキーバインドは M-C-s と M-C-r。)を行なうことにより、上記のように文字列の間に -, タブ文字、改行文字、復帰文字、 ^L 等が含まれていてもインクリメンタル・サーチによりマッチさせることができる。

変数 skk-isearch-whitespace-regexp の値が、検索の対象となる文字列の連続した日本語文字の間に挿入され、その結果が正規表現で表現され、検索の対象となる。skk-isearch-whitespace-regexp のディフォルト値は

     "\\(\\s \\|[ \t\n\r\f]\\)*"

である。skk-isearch-whitespace-regexp の値を

     "\\(\\s \\|[ \t\n\r\f<>|]\\)*"

のようにすることで、文字列が >> や | 等で引用されており、文字間に引用文字を含む場合であってもマッチするようにすることができる。

skk-init-file のバイトコンパイル
=======================

skk-byte-compile-init-file の値を non-nil にすることで、 skk-mode 起動時に skk-init-file (ディフォルト値は、 ~/.skk。) をチェックして、

 1. skk-init-file をバイトコンパイルしたファイルがないか、

 2. skk-init-file とそのバイトコンパイル済ファイルを比較して、前者の方が新しいとき

に skk-init-file を自動的にバイトコンパイルする。nil であれば、skk-init-file とそのバイトコンパイル済みファイルを比較して skk-init-file の方が新しいときは、そのバイトコンパイル済ファイルを(誤ってロードされることのないように)消す。

なお、skk-byte-compile-init-file は skk-init-file のロード前に参照されるので、この変数の設定の変更を skk-init-file に書いても効果がない。~/.emacs などを利用すること。

picture-mode との併用
=================

SKKモードを picture-mode において使用した場合は、下記の問題点があるが、これについては、picture-mode の側の問題であるので、現在のところ、SKK側では対処していない。

 1. SKKモードで全角文字を入力した場合に、BSで全角文字が消せないこと。現状では、backward 方向にある文字を消したい場合は、その文字にポイントを合わせ、C-c C-d で一文字づつ消すしか方法はない。

 2. picture-movement-up や picture-movement-down により上下に全角文字を挿入した場合にカラムがずれる場合があること。

いずれも move-to-column-force 関数の中で使用している move-to-column で全角文字を無視したカラム数が与えられたときにカーソル移動ができないことが原因である。

サーバー関連
======

skkserv の起動オプション
----------------

skkserv の起動時のオプションにより、ディフォルト辞書名の変更、ディバッグ・モードの指定などができる。オプションの指定方法は下記の通り。

     skkserv [-d] [-p NNNN] [JISHO]

また、各オプションの意味はそれぞれ下記の通り。

-d
     ディバッグ・モード。

-p NNNN
     通信用のポート番号として NNNN を使う。

JISHO
     JISHO を辞書として利用する。

オプションなしで起動すると、通常モード(ディバッグ・モードでない)で、サーバのコンパイル時に指定した辞書とポートを利用する。skkserv は、サーバとなるべき子プロセスを作った後、直ちに終了する。エラーがあっても何のメッセージも出さない。

ディバッグ・モードで走らせると、skkserv はそのままforegroundで走り、メッセージを出力する。キーボードから割りこみをかけることもできる。

skkserv の起動はスーパーユーザが行う必要はない。

skk-server.elのオプション
-------------------

skk-servers-list
     辞書サーバー毎の情報リスト。複数のマシーンで動いているサーバにアクセスできる場合には、以下のように、リストの各要素に順にホスト名、フルパスでのサーバー名、サーバーに渡す辞書名、サーバーが使用するポート番号を書き、設定をすることもできる。下記に例を示す。

          (setq skk-servers-list
                '(("mars" "/usr/local/soft/nemacs/etc/skkserv" nil nil)
                  ("venus" "/usr/local/nemacs/etc/skkserv" nil nil) ))

     この場合最初に指定したサーバにアクセスできなくなると、自動的に順次リストにある残りのサーバにアクセスするようになる。なおサーバーに渡す辞書およびサーバーが使用するポート番号で、サーバーをコンパイル時の値を使用する場合は nil を指定する。

skk-report-server-response
     non-nil であれば、変換時サーバーの送出する文字を受け取るまでに accept-process-output を何回実行したかを報告する。

skk-remote-shell-program
     リモートシェルのプログラム名。ディフォルト値は下記の通り。

          (or (getenv "REMOTESHELL")
              (and (boundp 'remote-shell-program) remote-shell-program)
              (cond
               ((eq system-type 'berkeley-unix)
                (if (file-exists-p "/usr/ucb/rsh") "/usr/ucb/rsh" "/usr/bin/rsh") )
               ((eq system-type 'usg-unix-v)
                (if (file-exists-p "/usr/ucb/remsh") "/usr/ucb/remsh" "/bin/rsh"))
               ((eq system-type 'hpux) "/usr/bin/remsh")
               ((eq system-type 'EWS-UX/V) "/usr/ucb/remsh")
               ((eq system-type 'pcux) "/usr/bin/rcmd")
               (t "rsh") ))

うまく起動できないときは
------------

skkserv とうまく接続できないときは、

     % ps ax | grep skkserv

などとして skkserv が走っていることを確かめた上で、Emacsの lisp-interaction-mode   (Emacsのディフォルトでは、 *scratch* バッファが lisp-interaction-mode になっている。) で以下のフォームを順次評価する。

     ;; network streamをopen。``foobar''の個所には skkserv を動かし
     ;; ているホスト名を書くこと。
     (open-network-stream "skkservd-debug" (current-buffer) "foobar" "skkserv")
     ;; 初期設定
     (cond ((fboundp 'set-process-kanji-code)
            (set-process-kanji-code (get-process "skkservd-debug") 0))
           ((fboundp 'set-process-coding-system)
            (set-process-coding-system
             (get-process "skkservd-debug") *euc-japan* *euc-japan* ))
           ((boundp 'kanji-fileio-code)
            (setq kanji-fileio-code 0) ))
     ;; 変換すべき文字列として `かんじ' を送信する。
     (process-send-string "skkservd-debug" "1かんじ ")
     ;; 成功すると、カレントバッファに、
     ;; 1/漢字/幹事/完治/完爾/寛治/感じ/
     ;; などとSKK-JISYO.Lに含まれる候補が挿入される。
     ;; 先頭の数字 `1' は `skkserv' が候補の検索に成功したことを示す。
     ;;serverをdisconnectする。
     (process-send-string "skkservd-debug" "0")

サーバー起動後の辞書の再読み込み
----------------

skkserv 起動後に skkserv の参照している辞書の内容を変更したい場合、単純に skkserv のプロセスをkillしてしまうとその時に同じ skkserv を利用してskkを使っているすべてのユーザに悪影響がある。

そこで skkserv を走らせたまま辞書を再読みこみする方法を付加した。なお、辞書のファイル名を変更するときはできない。つまり、コンパイル時または起動時に指定されたファイル名の位置に、新しい辞書を上書きする必要がある。

 1. 新しい辞書を skkserv の所定の場所に置く(cp の各引数は適当な文字列に直す)。

          % cp NEW-JISHO /usr/local/mule/etc/SKK-JISYO.L

 2. skkserv のプロセス番号を求める。

          % ps ax | grep skkserv

 3. skkserv に辞書再読み込みを指定するシグナルを送る。

          % kill -INT NNNN

     ここで NNNN は上記で求めた skkserv のプロセス番号とする。なお、signalを送ることができるのはスーパーユーザのみ(個人で skkserv を起動した場合は、スーパーユーザまたは起動した人のみ)である。

なお、下記の点に注意すること。

  * 上記手順で1と3の間(辞書ファイルの中身が書きかわったのに、まだ skkserv がそのことを知らないとき)では、skkserv は変な動作をすることがある。特に、辞書のサイズを小さくしたときには死んでしまうかもしれない。

  * 動作は、SparcStation-2/SunOS 4.1.1上でのみテストした。signalの取り扱いが異なるマシン上では動作しない可能性がある。

限界・改良の余地
--------

skkserv がディバッグ・モードでないときに合法的に殺す手段はない。 killする。

一つの計算機の上で使用できる同じ番号のTCPソケットは、一つしか存在できない。従い標準ポート番号を使う skkserv も一つしか動かない。ディバッグやテストの際にskkservを殺してすぐに起動すると、ポートが使われている、という趣旨のエラーが起きる。この場合は、少し待ってから再度起動する。

一つのサーバが受けつけられるクライアントの数の上限は、関数 getdtablesize により決まる。もし上限を越えた数のクライアントがコネクト要求をしてきた時はサーバは異常終了する。

本来のSKK辞書には, 見出し語の長さの上限はないが、skkserv では 512 バイトに限っている(skkserv.h の BUFSIZE の値)。なお、変換文字列の長さに制限はない。

辞書検索は、読みの第1文字目による場合分けを行った後は、線型探索を行なっている。現在の状況ではこれで十分であるが、場合によってはより高速な探索方法を検討する必要があるかもしれない。

辞書ユーティリティプログラム
**************

SKK辞書に関するユーティリティプログラムには、Emacs Lisp, Perl, C の各言語により書かれたものがある。

Emacs Lispユーティリティプログラム
======================

Emacsの中でコマンド skk-merge, skk-diff により、二つの辞書をマージしたり差分を計算することができる。

誤って貴重な辞書を破壊しないように、以下の作業は辞書をコピーしたものについて行うほうがよい。

skk-check-jisyo
---------------

 1. M-x skk-check-jisyo を実行する。辞書ファイル:  と聞いてくるので、チェックしたい辞書ファイルを指定する。

 2. 辞書をチェックした結果がバッファ *jisyo check* に表示される。このうち、

          単語がひとつもない.
          空単語.
          行の最後が「/」でない.
          読みの直後が「 /」でない.
          読みと単語の区切りがない.

     というメッセージのある行については、辞書に問題があるので適当に修正する。これ以外のメッセージは、ユーザへの注意なので無視してもよい。以上の修正を必要ならば行い、結果を再びもとの辞書ファイルにセーブする。

skk-merge
---------

skk-merge では辞書の見出し語のソートをshell scriptを用いて行う。これは最近の辞書のサイズが大きくなったためにEmacs Lispのソート関数を用いるとEmacsがcore dumpすることがあるためである。このshell scriptのファイル emacs-sort をディフォルトの位置以外に置いてある場合は .emacs または .skk の中で変数 skk-emacs-sort の値に正しいfull path nameを設定する必要がある。

二つのSKK形式の辞書をマージするコマンドである。

 1. 作業用のディレクトリを用意し、そこに cd する。

 2. マージしたい辞書を DIC1、DIC2 にコピーする。

 3. M-x cd 等により、Emacsの default-directory を上記の作業用のディレクトリと一致させる。

 4. M-x skk-merge を実行する。

 5. 辞書ファイル1 と辞書ファイル2 を聞いてくるので DIC1、 DIC2を答える。計算が終了すると結果が NEW-SKK-JISYO という名前のファイルに出力される。出力された新辞書はソートされている。

skk-diff
--------

二つのSKK形式の辞書の差分をつくるプログラムである。

  * 作業用のディレクトリを用意し、そこに cdする。

  * 差分をとりたい2つの辞書を DIC1、DIC2 にコピーする。

  * M-x cd 等により、Emacsの default-directory を上記の作業用ディレクトリと一致させる。

  * M-x skk-diff を実行する。辞書ファイル1と 辞書ファイル2 を聞いてくるので、それぞれ、DIC1 と DIC2 を答える。計算が終了すると、DIC1と DIC2 の差分が SKK-JISYO-DIFF という名前のファイルに書かれる。

Perlによるユーティリティプログラム
===================

Perlで書かれたユーティリティプログラムはskktoolsと総称され、SKKの distributionではディレクトリ contrib/skktools の下にある。

skktoolsは、辞書をマージしたり、pubdic辞書をSKK辞書の形式に変換したりするためのツール群である。SKK辞書は読みに対応する複数の漢字が / で区切られた構造をしているが、このツールでは読みと漢字が1対1に対応した形式 (これを「リスト形式」と呼ぶ)のファイルを中間形式として取り扱う。

skktoolsには以下のプログラムがある。

skk2list
     SKK辞書をリスト形式に変換する。

pubdic2list
     pubdic辞書の名詞エントリをリスト形式に変換する。

list2skk
     リスト形式をSKK辞書に変換する。

adddummy
     SKK辞書ソートのためにダミー文字を加える。

removedummy
     加えたダミー辞書を取り除く。

sub
     二つのリスト形式の辞書の差分を計算する。

skkconv
     漢字検索コマンド。

例えば、既存のSKK辞書とpubdic辞書をマージして新しいSKK辞書を作成するには次のように行なう。

     % (skk2list skk-jisyo ; pubdic2list kihon.u) \ ; リスト形式を連結
           | adddummy \                             ; ダミー文字追加
           | sort -u \                              ; ソート
           | removedummy \                          ; ダミー文字削除
           | list2skk \                             ; SKK辞書に変換
           > skk-jisyo.new

これらのツールではEUCの辞書のみ取り扱い可能である。それ以外の文字コードの辞書を使うときは後述のjis2ujisなどのコマンドを加える必要がある。

二つのリスト形式の辞書の差分を計算するには、

     % sub 旧リスト 新リスト

とする。比較する二つのファイルはあらかじめソートされていなければならない。

skkconv はSKKサーバを使用してコマンドラインでかな漢字変換するためのコマンドである。例えばかんじという読みをもつ漢字を以下のように検索できる。

     % skkconv kanji
     漢字
     幹事
     感じ
     ......
     %

この他に以下のPerlライブラリとコマンドがある。

codeconv.pl
     JIS, EUC, SJIS相互変換ライブラリ。

roma2kana.pl
     ローマ字 ==> 平仮名変換ライブラリ。

kana2roma.pl
     平仮名 ==> ローマ字変換ライブラリ。

jis2sjis
     JIS ==> SJIS変換コマンド。

sjis2jis
     SJIS ==> JIS変換コマンド。

jis2ujis
     JIS ==> EUC変換コマンド。

ujis2jis
     EUC ==> JIS変換コマンド。

roma2kana
     ローマ字 ==> かな(EUC)変換コマンド。

kana2roma
     かな(EUC) ==> ローマ字変換コマンド。

Cによるユーティリティプログラム
================

Cで書かれたユーティリティプログラムはjisyo-toolsと総称され、SKKの distributionではディレクトリ jisyo-toolsの下にある。

Emacs LispやPerlによる同様のプログラムでは辞書が巨大な場合は、Emacsがパンクしたり、実行時間が非常に長くなることがあるが、そのようなときに有用である。

プログラム作成方法
---------

Makefile を見て、必要があれば中の CC と CFLAGS の内容を変更してから make を実行する。

なお skkdic-expr では作業用のファイルとして辞書の2倍程度の大きさのものを作成する。このファイルが作成されるディレクトリは実行時に指定できるが、デフォールトとして /tmp を指定してる。もしも明らかに不足する場合には、

     -DTMPDIR=\".\"

を CFLAGS に追加すると、/tmp が溢れるといった災害を防ぐことができる。

skkdic-expr
-----------

複数のSKK辞書をマージしたり、他の辞書と同じ内容を引くのに使う。例えば、次のようにして使う。

     % skkdic-expr JISYO1 + JISYO2 - JISYO3 > RESULT

上記の例では、JISYO1 と JISYO2 にある JISYO1 と重複しない候補を加え、その後、JISYO3 と同じ候補があれば削除する。

また、次のオプションが使用できる。引数の辞書の直前に指定する。

-d
     作業用ディレクトリ。

-o
     出力ファイル。

その他の使用例をあげる。

 1. 複数の辞書を cat でつないだものを整理する。

          % skkdic-expr OLDDICT1 > NEWDICT1

     このように使用すると、重複する候補を削除したり、同じ読みが別々の行に複数存在していても一行のエントリにまとめる。例えば、

          じしょ /辞書/
          じしょ /璽書/
          じしょ /字書/

     のような辞書を

          じしょ /辞書/璽書/字書/

     と、一行にまとめることができる。候補の配列(候補が出力される際の優先順位) は上から順になる。

 2. 個人辞書にある分だけを取り出す。

          % skkdic-expr ~/.skk-jisyo - SKK-JISYO.L > PRIVATE

     この差分を将来のSKK辞書に反映させる方法については 謝辞とお願い を参照のこと。

 3. 2つの辞書の共通部分を取り出す。

          % skkdic-expr JISYO-A - JISYO-B > JISYO-TMP
          % skkdic-expr JISYO-A - JISYO-TMP > JISYO-COMMON

skkdic-sort
-----------

ソートされていない辞書を通常のSKK辞書の形式にソートし、 ;; okuri-ari entries. と ;; okuri-nasi entries. を適切な位置に挿入する。入力は標準入力のみ、出力は標準出力のみが指定できる。例をあげる。

     % skkdic-expr JISYO-A + JISYO-B | skkdic-sort > NEWDICT

一時的に使用するswapを小さくするためにあえて skk-jisyo-expr とは別のプログラムとしてある。

skkdic-count
------------

SKK辞書の中の候補の数を数える。[ と ] で囲まれた送り仮名毎のブロックも一つの候補として数える。

拡張アイディア
*******

将来のバージョンに託された拡張アイディアを順不同で述べる。これ以外にも要望、拡張の具体的アイディアがあれば、開発者にご連絡いただきたい。

  * 辞書の個々の見出し語、候補に属性を持たせて、

      1. 例えば、その属性の内容により、変換の際に候補の絞り込み条件を指定できるようにする。また、絞り込み条件はユーザーの任意に変更できるようにする。一例をあげれば、サ変動詞になり得る名詞に適当な属性を持たせ、〜するという送り仮名がタイプされた場合には、そのサ変動詞属性を持った名詞のみを候補として出力する、など活用の幅は非常に広い。サ変動詞の問題については、辞書登録モード も参照のこと。

      2. 例えば、候補に関する意味を属性として持たせ、意味を調べるような拡張変換を行なえるようにする。

      3. 例えば、候補に最終の変換時刻などを属性として持たせ、辞書のメンテナンスに利用する(一定期間アクセスのない候補を個人辞書から削除するなど)。

     言うは易しだが、色々な未解決の問題がある。多数の見出し語や候補に属性を持たせて、通常の変換効率をできる限り落さないで、かつ効率良く属性のメンテナンスを行なう方法を模索することがまず大変。Emacsのバッファに読み込む辞書とサーバー経由でアクセスしている辞書とがあることも検討事項。Emacs側の機能で対応した場合にサーバー経由の辞書属性をどうやって得るか、またはその逆が課題である。コーディング抜きであってもアイディアをいただけたら幸いである。

  * C-x C-j, C-x j など、SKKモードの起動に使用されるキーに元々割り付けられているEmacsのオリジナルのコマンドの自動退避。意外と難しい？ See .emacsの設定.

  * メニューバーから指定できるユーザーオプションを増やすこと。現状ではオン/ オフトグルに変更するようなコマンドのみの変更しかできない。 See ユーザーオプションの設定方法.

  * 対になる文字列の一括入力を一度に複数の文字について行なったときのポイントの位置を検討する。See 対になる文字列の一括入力.

  * いかなるユーザーオプション変数をバッファローカル化しても動作するようにすること。辞書バッファで参照されるユーザーオプションを、変換を行なっていたバッファの指定値から受け渡しして辞書バッファで参照するなどの配慮が必要か。 See 送り仮名の厳密なマッチ.

  * 送り仮名の厳密なマッチなしの送り仮名の自動処理を行なうオプションを作ること。現状の送り仮名の自動処理では、送り仮名のプレフィックスがマッチするだけでは候補として出力せず、更に送り仮名全体が厳密にマッチするかどうかをチェックしている。これは候補の絞り込みのためには有効に作用するが、個人辞書の内容が貧弱な場合は、逆にこれがあだとなってすぐに辞書登録モードに入ってしまう。オプション設定することにより、いずれの場合にも対応できるようにする。See 送り仮名の自動処理.  See 送り仮名の厳密なマッチ.

  * VIPER対応。See VIPとの併用.

  * SKKの起動後、2C-modeを起動するとモードラインが乱れる。これに対応する。

  * その他、どんどん増えるEmacsの標準添付パッケージとの親和性を高めること。

  * 有限オートマトンを用いた変換において、よりT-codeライクな操作を可能とするようにすること。

  * skk-num.el の skk-kanji-num-str2 で、100000000 ==> 一億万 になってしまうバグを修正すること。

  * 1995 ==> 壱阡九百九拾伍 のような数値変換を行なう skk-kanji-num-str3 を新設すること。内容証明郵便で支払の督促状を書くときなどに便利？

  * query-replace などのコマンドで、SKKの入力モードを認識するようなプロンプトを出す。こりゃ無理か？

  * 部首変換プログラムと辞書を作ること。現在作業中の辞書を中島が持っているので、作業にご協力いただける方はご連絡いただきたい。

  * あるパターンにマッチする語を変換・確定しても、その語を個人辞書に取り込まないようにすること。例えばカタカナのみからなる語を変換して使うことはあっても、その語で個人辞書を太らせることがないように設定することができる。

  * SKKが大きくなった元凶、数多くのユーザーオプションをほとんどなくした stripped skk.el を作ること。

SKKメーリングリスト
***********

ユーザーメーリングリスト
============

SKKに関する意見交換の場としてSKKメーリングリストが開設されている。これまでメーリングリストで話題になったこととしては、SKKの虫の報告/修正、質問/回答、SKK改良のための提案等がある。また、最新のSKKもメイリングリストを通して配布し、参加者の協力を得て、テスト、改良を重ねている。

メーリングリストへの参加したいとき。
     skk-join@kuis.kyoto-u.ac.jp へメールを送れば、自動的に発信者のメールアドレス(From: のアドレス)が登録される。

メーリングリストへの記事の投稿を行なうとき。
     skk@kuis.kyoto-u.ac.jp へ送れば自動的に全ての登録者に送付される。

メーリングリストに登録したアドレスを変更したいとき。
     新しいメールアドレスから skk-change@kuis.kyoto-u.ac.jp 宛に、本文の1行目に下記の書式で旧アドレスを書いたメールを送付する。

          Old: YOUR-OLD-NAME@YOUR-OLD-ADDRESS

メーリングリストから抜けたいとき。
     skk-leave@kuis.kyoto-u.ac.jp へメールを送る。

skk-source@kuis.kyoto-u.ac.jp 宛にメールを送付することで、過去の SKKメーリングリストへの投稿記事を入手することができる。入手したい記事の Mailinglist-ID: に従い、下記の要領で Subject: を指定し、メールを送付することで、指定された内容のメールが返送される。

Mailinglist-ID: が134の記事を入手する場合。
     Subject: 134

Mailinglist-ID: が100番から199番の記事を全部入手する場合。
     Subject: ml-contents-01

ただし、0〜99番の場合は ml-contents-00 と指定する。なお、 Mailinglist-ID:が欠番の部分もある。

開発者用メーリングリスト
============

SKKの開発に関する情報交換、及びテスト版の配布などを行う場としてSKK開発者用メーリングリストが開設されている。

メーリングリストへの参加したいとき。
     skk-develop-join@kuis.kyoto-u.ac.jp へメールを送れば、自動的に発信者のメールアドレスが登録される。

メーリングリストへの記事の投稿を行なうとき。
     skk-develop@kuis.kyoto-u.ac.jp へ送れば自動的に全ての登録者に送付される。

メーリングリストに登録したアドレスを変更したいとき。
     新しいメールアドレスから skk-develop-change@kuis.kyoto-u.ac.jp 宛に、本文の1行目に下記の書式で旧アドレスを書いたメールを送付する。

          Old: YOUR-OLD-NAME@ YOUR-OLD-ADDRESS

メーリングリストから抜けたいとき。
     skk-develop-leave@kuis.kyoto-u.ac.jp へメールを送る。

SKKの入手方法
********

メールによる入手方法
==========

skk-source@kuis.kyoto-u.ac.jp 宛にメールを送付することで、SKKのソースをメールを入手することができる。下記の要領で Subject: を指定し、メールを送付することで、指定された内容のメールが返送される。

skk.el が欲しい場合。
     Subject: skk.el

入手可能なファイルのインデクスが欲しい場合。
     Subject: index  index にはファイルサイズと最終更新日が入っている。

ファイルのバージョン等を知りたい場合。
     Subject: VERSIONS

SKKの最新版全体を入手したい場合。
     Subject: all  こうするとSKKのパッケージがいくつかのメールに分割されて送られてくる。

一度に多数のメールを受け取ることができない場合

      1. Subject: all-1 により、まずpart1を入手し、全体の個数を確認する。

      2. 次に Subject: all-2-10 のようにして受信可能な範囲で全体の一部(上の場合はpart2からpart10)を入手する。

      3. メールの取りこぼしがあったときは、例えば、Subject: all-22,31 とするとpart22とpart31が入手できる。

Anonymous Ftpによる入手方法
====================

IP接続のされているサイトからはanonymous ftpによりSKKを入手することもできる。

京都大学(skk.kuis.kyoto-u.ac.jp [130.54.22.225])及びスタンフォード大学(steam.stanford.edu[171.64.71.20])の /pub/skk 以下に SKKが置いてある。SKKのバージョンにより置かれているディレクトリが異なるので、注意すること。

また、これらのサイトでは公式リリースのものの他に最新のSKKも置いてある。

WWWを利用して入手する方法
==============

SKKのホームページが以下の場所に開設されている。

日本語版URL
     http://skk.kuis.kyoto-u.ac.jp/skk/index.html

英語版URL
     http://skk.kuis.kyoto-u.ac.jp/skk/index-e.html

Mosaicやchimera等のWWWクライアントを利用して、ホームページにアクセスすれば、ホームページからのリンクをたどることによって、ftpサーバ (skk.kuis.kyoto-u.ac.jp)にアクセスすることができる。

その他の入手方法
========

SKKは1988年4月に第1版をJUNETに投稿して以来、毎年4月にJUNETのニュースグループfj.sourcesに新しいバージョンを投稿している。この方式もひきつづき続けていきたいと考えている。

SKKはまたMuleのcontributed softwareでもあるので、Muleの一部としても入手することができる。

SKK関連ソフトウェア
***********

KAKASI
======

KAKASIとは、高橋裕信氏 <takahasi@tiny.or.jp> による「漢字かなまじり文をひらがな文やローマ字文に変換することを目的として作成したプログラムと辞書の総称」である。KAKASIは、Kanji Kana Simple Inverterにちなんで、また SKKの逆言葉として名付けられた。KAKASI は、SKKのcontribution softwareに含まれている。

skkfep
======

skkfepは、伊藤彰則、渡辺雅俊、金子裕の各氏による、SKKと似た入力方式の漢字入力フロントエンドプロセッサである。

現在サポートされているOSは、下記の通り。

     SunOS 4.x, AIX3.x, Linux, 386BSD, AIX/ESA, DOMAIN-IX SR9.x, HP-UX 8.x,
     SEIUX 3.x, EWS-UX/V Rel4.0, NEWS-OS 4.x, NEWS-OS 3.3

pskkserv
========

pskkservは佐藤正章氏 <msatoh@mrit.mei.co.jp> による skkserv 代替ソフトである。Perlスクリプトとしてインプリメントされており、サーバープログラムである pskkserv と、辞書のDBM化の際使用する makedbmdic がある。

pskkservは、SKK辞書をDBM化し、Perlの連想配列を用いて検索を行なう。 Perlの連想配列のインデクスキーは、内部的にハッシュテーブルに登録されており、連想配列に登録されているエントリの個数に影響を受けることなく、一定時間で高速な検索を行なうことができる。DBM関連の関数が使えるPerlであれば、バージョン4でも5でも動作可能である(Perl4専用プログラムとPerl5専用プログラムとに分れている)。

pskkservを利用するには、まず makedbmdic によりSKK辞書をDBM 化する必要がある。Berkeley DB形式の場合は、makedbmdicに -B オプションを、GDBMの場合は -G オプションを渡す。

     % makedbmdic -G SKK-JISYO.L

     makedbmdic by msatoh@mrit.mei.co.jp
     Make dbm format dic from SKK dic.
     The numbers mean how many lines have processed.
     A dot mean 20 lines, as you see.

     ..................................................1000[ 0.97%]
     ..................................................2000[ 1.95%]
     ..................................................3000[ 2.92%]
     ...
     ..................................................101000[98.34%]
     ..................................................102000[99.32%]
     ................................... done

makedbmdic により SKK-JISYO.L を処理すると、Berkeley DB形式の場合は、SKK-JISYO.L.db、GDBMの場合は SKK-JISYO.L.gdbm というDBM形式の辞書が生成される (拡張子が違うので要注意。)。この辞書は、元の SKK-JISYO.L の4倍弱のファイルサイズになる (中島の失敗談。MSDOSの改行コードであるCRLFに変換した SKK-JISYO.L を(CRLFになっていることを忘れて) makedbmdic により処理したら、正常に処理できたかのように見えたが、生成された辞書のサイズが非常に小さくなった。このDBM化辞書は、pskkserv により検索できなかったことは言うまでもない。)。

次に pskkserv をEmacsの exec-directory などに置き、下記のようなシェルスクリプト  (もちろん pskkserv のパスはご自分のマシンに合ったものをご指定いただきたい。)を rc.local などに追加して再起動する。

     echo Starting up pskkserv...
     if [ -x /your/path/to/pskkserv ]; then
             /your/path/to/pskkserv -G /your/path/to/SKK-JISYO.L.gdbm &
     fi

また、下記のようなフォームを ~/.emacs などに設定する。

     (setq skk-server-prog "/your/path/to/pskkserv")

ディレクトリが、exec-directory と同一ならば、下記のように指定することもできる。

     (setq skk-server-prog (concat exec-directory "pskkserv"))

pskkserv を使用する場合でも、設定は skkserv を使用するときと変りない。See 共通の設定. See スーパーユーザの権限を持たない人の場合.

SKK on Jed
==========

このセクションは、SKK on Jedの開発者である豊福親信氏により書かれた。

正式名称
     SKK on Jed

どのようなソフトウェアか
     Jed(Emacs系の軽いエディタ。C言語風の拡張言語S-Langを持つ)に移植された SKKです。

使用するために要求される環境
     日本語版Jedが動いていればその上で動きます。現在、多くのUNIX、MSDOS、 Win95/NT、OS2上で日本語版Jedは動いています。

最新バージョン、release の日付
     version 0.1.1(1996年12月15日)

開発者
     豊福 親信

配布条件
     SKKと同じです。

入手方法

     メールによる入手方法
          unbound@papaya.juice.or.jp にメールで連絡して下さい。

     WWWを利用して入手する方法
          WWWクライアントを利用して http://www.juice.or.jp/~toyofuku/jed.htmlから入手できます。

bug report,質問のためのアドレス
     unbound@papaya.juice.or.jp

その他
     まだいくつか未実装機能がありますがSKKの全機能実装を目指しています。

skkinput
========

このセクションは、skkinputの開発者である阪本崇氏により書かれた。

正式名称
     skkinput

どのようなソフトウェアか
     日本語テキスト入力を要求するX11のアプリケーションのための入力サーバ。現在はKinput Protocolにしか対応していませんが、将来的にはXIMやKinput2 Protocolに対応させる予定です。

使用するために要求される環境
     UNIX + X11R5またはX11R6(R6.1)

最新バージョン ,release の日付
     0.16e, 平成8年12月23日(月)

開発者
     阪本 崇(sakamoto@yajima.kuis.kyoto-u.ac.jp,

     PXG01715@niftyserve.or.jp)

配布条件
     ありません。

入手方法

          http://yase.yajima.kuis.kyoto-u.ac.jp/staffs/sakamoto/skkinput/skkinput.html

     から入手できます。

bug report、質問のためのアドレス
     sakamoto@yajima.kuis.kyoto-u.ac.jp もしくは PXG01715@niftyserve.or.jp まで御願い致します。

その他
     SKK 8.6にはかなり近付けたと思うのですが、まだまだ異なる部分が残っています。特に操作体系で異なると感じられた方は私までレポートを御願い致します。

謝辞とお願い
******

謝辞
==

SKKの設計方針はTAO/ELIS上の日本語入力システムKanzenの影響を受けています。 Kanzenのデモを行ってくださり、またKanzenを使う機会を与えてくださったNTT の竹内郁雄さんに感謝します。

第1版の辞書作成のための読みの入力を行ってくださった東北大学電気通信研究所佐藤研究室の 安藤大君、猪岡美紀さん、奥川淳一君、佐々木昭彦君、佐藤克志君、山岸信寛君に感謝します。

SKK辞書第2, 3, 4, 5, 6, 7, 8版作成のためのデータを提供してくださった方々に感謝します。

SKK辞書第6, 7版作成にあたり協力してくださった高橋裕信氏に感謝します。

その他、SKK改良のためにプログラム等を提供してくださった大勢の方々に感謝します。

お願い
===

SKK辞書は多くのユーザの方々から提供された辞書によりコピーフリーの辞書としては最大規模の辞書になっています。今後もこの方式によりSKK辞書をより充実したものにしていきたいと思います。毎年1月頃を目途にアナウンスしますが、 SKK辞書の充実にご協力いただける方は、随時以下のアドレスまで個人辞書と SKK-JISYO.L との差分をお送りください。お送りいただいた辞書を整理して次年度の辞書に含めさせていただきます。差分ファイルの作成方法については skkdic-expr をご参照下さい。

また, SKK-JISYO.L の誤りを発見された方は多少にかかわらず、下記のアドレスまでお知らせください。

     skk-jisyo@kuis.kyoto-u.ac.jp

あとがき
====

本マニュアルは、佐藤と亀山がLatexinfoを使用してSKKバージョン8.6について書いたものを、中島がTexinfo形式で加筆・修正し、酒井清隆氏に校正していただいたものである。加筆や修正の大部分は、SKKの拡張機能に伴なうものである。

このマニュアルは、中島がTexinfoを使って書いた初めてのものであることを最後に付け加えておく。中島自身が LaTeX ユーザーにすぎず、Plain TeX を知らないので、執筆前は、「Texinfoは使えないんじゃないか」と思っていたが、Texinfoのマニュアルを読むと意外と LaTeX 気分で書けることに気が付いた。Texinfoはなかなかすごいソフトである。