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.

Short Table of Contents

Table of Contents


GNU GENERAL PUBLIC LICENSE

Version 2, June 1991
Copyright © 1989, 1991 Free Software Foundation, Inc.
675 Mass Ave, Cambridge, MA 02139, USA

Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.

Preamble

The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software—to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation’s software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too.

When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.

To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.

For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.

We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.

Also, for each author’s protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors’ reputations.

Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone’s free use or not licensed at all.

The precise terms and conditions for copying, distribution and modification follow.

  1. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The “Program”, below, refers to any such program or work, and a “work based on the Program” means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term “modification”.) Each licensee is addressed as “you”.

    Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.

  2. You may copy and distribute verbatim copies of the Program’s source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.

    You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.

  3. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
    1. You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
    2. You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
    3. If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)

    These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.

    Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.

    In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.

  4. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:
    1. Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
    2. Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
    3. Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)

    The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.

    If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.

  5. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
  6. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.
  7. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients’ exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
  8. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.

    If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.

    It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.

    This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.

  9. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
  10. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

    Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and “any later version”, you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.

  11. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
  12. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
  13. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

How to Apply These Terms to Your New Programs

If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.

To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found.

one line to give the program's name and an idea of what it does.
Copyright (C) 19yy  name of author

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

Also add information on how to contact you by electronic and paper mail.

If the program is interactive, make it output a short notice like this when it starts in an interactive mode:

Gnomovision version 69, Copyright (C) 19yy name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
type `show w'.  This is free software, and you are welcome
to redistribute it under certain conditions; type `show c' 
for details.

The hypothetical commands ‘show w’ and ‘show c’ should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than ‘show w’ and ‘show c’; they could even be mouse-clicks or menu items—whatever suits your program.

You should also get your employer (if you work as a programmer) or your school, if any, to sign a “copyright disclaimer” for the program, if necessary. Here is a sample; alter the names:

Yoyodyne, Inc., hereby disclaims all copyright
interest in the program `Gnomovision'
(which makes passes at compilers) written 
by James Hacker.

signature of Ty Coon, 1 April 1989
Ty Coon, President of Vice

This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.


1 概要

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

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

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 2 の中のいくつかのプログラムを利用している。

辞書サーバ用のCプログラム

亀山幸義 <kameyama@kuis.kyoto-u.ac.jp> により作成された。

辞書

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

ユーティリティプログラム

増井俊之氏<masui@csl.sony.co.jp>、前田憲男氏および高橋裕信氏 <takahasi@tiny.or.jp> により作成された。


2 インストール


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

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

% ./configure
% make 
% make install

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

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

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


2.2 .emacs の設定

.emacs 3に以下 のフォームを挿入する。

(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-hookisearch-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.LSKK-JISYO.SSKK-JISYO.M に変更する。

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


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

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


2.3.1 サーバーの概略

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などの上でも動作することがわかっている。

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


2.3.2 共通の設定

サーバーを使用する場合には、.emacs.skk を使って skk-server-hostskk-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-hostskk-server-progskk-server-jisyo あるいはそれらの環境変数はいずれも参照されないが、skkserv が立ち 上がっていないときは、これらの変数を参照して skkserv を立ち上げよ うとするので、安全のためにこれらの変数を設定しておく方が良い。


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

まず、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

とする。


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

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

SERVERDIR

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

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

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

% make
% make install

~/.emacs~/.skk

(setq skk-server-portnum 1178)

を追加する 4

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

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

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


3 基本的な使用方法

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

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


3.1 起動と終了

SKKを起動するには C-x C-j、もしくは C-x j とタイプする。起動 すると、モードラインの左端が‘--かなとなるので、これで確認でき る。また、カーソルの色がreverseVideoがoffのときはcoral4に、onのときは pinkになる 5

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

C-x j とタイプすれば、オートフィルモード 6をオン にし、かつSKKを起動する。既にオートフィルモードがオンになっているバッファ で C-x j をタイプすると、SKKは起動されるが、オートフィルモードはオ フになるので注意すること。バッファの状態にかかわらず強制的にオートフィル モード付でSKKモードを起動したい場合は、M-1 C-x jC-u C-x j などとタイプし、このコマンドに正の引数を渡す 7。 オートフィルモードをオフにし、かつSKKモードも終了したい場合には M-- C-x jC-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

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


3.2 モード

SKKが起動されている状態を「SKKモード」という。SKKモードは、いわゆる マイナーモードの変形8 としてインプリメントされており、他のメジャーモードやマイナーモードの動作 に可能な限り影響を与えないように設計されている 9。 SKKモードは、更に文字種類による4種類の「入力モード」と、変換状態によ

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


3.2.1 入力モード

入力モードは、文字種別により下記の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.2.2 変換モード

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

「確定入力モード(■モード)」

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

「▽モード」

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

「▼モード」

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

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


3.2.2.1 ■モード

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

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

  • ’は 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’ を用いる。
  • 長音には、‘-’ を用いる。‘-’ ⇒ ‘’。

3.2.2.2 ▽モード

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

K a n j i

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

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

K’ の文字を大文字で入力し忘れた場合は、変換の対象としたい文字列の 先頭までポイント 11を戻し ‘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にち’の文字列を入力する。なお、▽モードでは、文字列の間に空白を含め ることはできない 12


3.2.2.3 ▼モード

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

かんじ /漢字/幹事/

というエントリ 13 を含むとして、例を示す。

K a n j i

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

SPC

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

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

漢字’が求める語である場合は 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 --------------------

がエコーエリア 15 に表示される。ここで仮に‘’を選択したければ、‘k’を入力する。‘A’, ‘S’, ‘D’, ‘F’, ‘J’, ‘K’, ‘L’ の各文字は、 押し易さを考慮してキーボードのホームポジションから横方向に一直線に配置さ れているキーが選定されている。また、候補の選択のために押すキーは、大文字、 小文字のいずれでも良い。候補の選択に用いるキーの変更については、 候補の選択に用いるキー を参照。

SPC を連打してしまい、誤って求める候補を通過してしまったときは ‘x’ により前候補/前候補群に戻ることができる 16

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

次に送り仮名のある単語について説明する。‘動く’を変換により求めたい ときは 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 送り仮名の自動処理.

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


3.2.2.4 辞書登録モード

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 をタイプすれば ‘変換中’ が個人辞書に登録され、辞書 登録モードは終了する 18。 同時に変換を行なっているカレントバッファには、‘変換中’ が挿入され確 定される。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 ------

サ変動詞(名詞の後に‘する’を付けた形で構成される動詞) については、 ‘する’を送り仮名とした送りあり変換 19 を行なわず、‘運動’と‘する’と分けて入力した方が効率が良い 20。 例えば‘運動する’は 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

と入力する。


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

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

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

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

I-search: [aa]

アスキーモード

I-search: [か]

かなモード

I-search: [カ]

カナモード

I-search: [英]

全英モード

I-search: [–]

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


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


4.1 予備知識

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


4.1.1 ファイル構成

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


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

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

.emacs

Emacsを起動したときに一度だけ評価される。バッファに関係しないグローバル 変数の設定やフックの設定などを行なう場合が多い。OSがMSDOSの場合は _emacs である。 See .emacs in 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との併用.

メニューバー 21が使 用できる環境では、SKKモード起動時にメニューバーを使って、オン/オフトグル に設定できるユーザーオプションの設定が変更できる 22。 ここで変更した設定はEmacs終了時に保存するかどうかを確認され、保存を選択 した場合は、その設定が .skk に保存される。.emacs より後に .skk がロードされるので、メニューバーよりユーザーオプションの設定 の変更が行なわれた場合は、.skk にその設定が保存される。


4.1.3 辞書の形式

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

共有辞書

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

個人辞書

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

他には skk-initial-search-jisyoskk-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-strictlynil であっても送り仮 名のブロック形式で書き込まれる。但し skk-process-okuri-early の値 が non-nil であれば、送り仮名を決定する前に変換を開始することにな るので、送り仮名を明示的に入力していても個人辞書には ‘[’ と ‘]’ に囲まれた送り仮名毎のブロックは作られないので注意すること 23

24。 See skk-process-okuri-early.

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

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


4.1.4 辞書に関する設定

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

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

skk-initial-search-jisyo

skk-jisyo の前に検索を行なう辞書。skk-jisyo の前に検索が行 なわれるので skk-jisyo にカバーを掛け、最初に出てくる候補を操作す ることができるので、例えば、複数の専門用語毎の辞書を用意しておいて skk-initial-search-jisyo の値を切り替えることにより、専門分野毎の 専門用語を切り替えて入力することができて便利かもしれない。見出し語の配置 は、サイズが大きければ共有辞書と同じ配置にしてバイナリサーチを行ない、サ イズが小さければ適当な配置 29 でリニアサーチを行なうのが良い。この辞書は、標準の配布パッケージには含ま れていないので、使用するのであればユーザー側で用意する必要がある。

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 辞書にはサーバー経由でアクセスする、という選択肢もある。

また、サーバー経由のアクセスも決して遅くはないので30

(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-processnon-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 がオートロードされる。


4.2 入力モードの一時変更

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

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


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

かなモードもしくはカナモードで、‘/’ キー以外で一旦▽モードにして文 字列を挿入し、その文字列の末尾で ‘q’ をタイプすることで 32’マークから ‘q’ をタイプしたポイントまでの文字列が変換され 確定される。変換は、‘’とポイント間の文字列の種類 33 をキーとして下記の規則に基づき行なわれる。

  • カタカナはひらがなへ
  • ひらがなはカタカナへ
  • 全英文字はアスキー文字へ
  • アスキー文字は全英文字へ

一例を挙げる。

K a t a k a n a

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

q

------ Buffer: foo ------
カタカナ∗
------ Buffer: foo ------

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

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

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


4.2.2 全英文字の一時的入力

/’をタイプした後、全角アルファベットとして入力したい文字列を挿入し、 その文字列の末尾で C-q 34 をタイプすることで、‘’マークから C-q をタイプしたポイントま での文字列が全角アルファベットに変換され確定される。

/ f i l e

------ Buffer: foo ------
▽file∗
------ Buffer: foo ------

q

------ Buffer: foo ------
file∗
------ Buffer: foo ------

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

file /file/

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


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


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


4.3.1.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 を走査することが決 定される。この連想リストの走査キーは、入力される仮名文字のローマ字プレ フィックス 35で、こ の例では “t” となる。走査結果は、

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

となる。かなモードのときは、この結果から cadr 36の“ち”を、カナモードのときは、 cddr 37の“チ”を取り出し、カ レントバッファに挿入する。

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ではこれを内 部変数 38 として、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起動後にこれ らの変数が変更される可能性があるので毎度計算し直すように設計されている。


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

ローマ字かな変換は、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 により表現される有限状態オートマトンを用い た変換も併用される39。 このリストのディフォルト値は、下記の通りである。

'(("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 などに書いておく。


4.3.1.3 数字や記号文字の入力

かなモード/カナモードにおける次のキーは、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で 40、 このベクトルの33番目 41の要素には全角文字の‘’ が割り振られているので、‘!’のキー入力に対し、全角文字である‘’ がバッファに挿入される。

要素が nil のところは使用されないか、または入力キーがそのまま挿入 されることを示している。具体例を言えば、▽モードへ入るキーの1つに ‘A’ があるが、このキーは、skk-set-henkan-point に割り付けら れており 42skk-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 を直接書いておくか、 ~/.skkskk-load-hook を利用して下記のような式を評価する 43

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

バッファに依存して異なる skk-input-vector を用いるには、バッファ ローカルな同名の変数を作り、その変数の値の設定を変更すればよい 44。 例えば、下記の関数をあるバッファで実行すれば、そのバッファでは区切記号 ‘!’, ‘,’, ‘.’, ‘:’, ‘;’, ‘?’ の各キー入力 に対して、対応するアスキー文字をそのまま入力できるようになる 45

(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 をエミュレートしているので、引数を渡すことに より同じ文字を複数、一度に挿入することが可能である 46


C-u 2 !

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

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

全英モードにおける印字可能な全てのキーは 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
 " "  "!" "”" "#" "$" "%" "&" "’"
 "(" ")" "*" "+" "," "−" "." "/"
 "0" "1" "2" "3" "4" "5" "6" "7"
 "8" "9" ":" ";" "<" "=" ">" "?"
 "@" "A" "B" "C" "D" "E" "F" "G"
 "H" "I" "J" "K" "L" "M" "N" "O"
 "P" "Q" "R" "S" "T" "U" "V" "W"
 "X" "Y" "Z" "[" "\" "]" "^" "_"
 "‘" "a" "b" "c" "d" "e" "f" "g"
 "h" "i" "j" "k" "l" "m" "n" "o"
 "p" "q" "r" "s" "t" "u" "v" "w"
 "x" "y" "z" "{" "|" "}" "〜" nil]

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

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


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

SKKモードになっていないEmacsオリジナルバッファでは、連続する20文字の挿入 が一度のアンドゥの対象となっている。かな・カナ・全英モードにおける入力も、 このオリジナルの動作をエミュレートしている 47。 正確に言えば、skk-insert-[aiue], skk-insert-comma, skk-insert-period, skk-kana-input, skk-self-insert, skk-set-henkan-point, skk-zenkaku-insert 48の各関数にバインドされたキー入力については、連続して 入力された20文字を1つのアンドゥの対象としている 49。但し、上記のSKKの関数とEmacsのオリジナルの self-insert-command を織り混ぜてキー入力した場合 50は、このエミュレート機能は正常に働かないので注意すること。この エミューレート機能は、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 --------------------------

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

例えば、‘「’ を入力したら、必ずと言って良いほど ‘」’ を後で入力する必要 がでてくる。‘「’ の入力時点で、対になる文字を自動挿入してくれるとタイプ 数を減らすことができ、入力忘れの防止にもなる。 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) ))))))

特定のペアを削除したい場合は、例えば下記のように設定する 51

(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) )))))))

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

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

M-Q 53とタイプする とポイントの直前の文字列について走査し、同種の文字 54が続く限 り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 にするこ とで、行を超えての走査をやめることができる。


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

確定変換を行なうプログラム 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 ------


4.6 確定アンドゥ

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

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

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

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

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’ の入力前) でなくともアンドゥが可能である。より正確には、次の 新たな確定 55を行なうまではアンドゥに関する情 報が保持されているので、アンドゥが可能である。

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


4.7 見出し語関連


4.7.1 見出し語の補完

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

▼モードで変換を行なった語の見出し語について、時間的に新しいものから先に 補完が行なわれる。例えば、‘斉藤’、‘佐藤’の順で変換した後、 ‘’をキーにして見出し語の補完を行なうと、最初に‘さとう’が、そ の次に‘さいとう’が補完される。補完が意図したものでなかったときには 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 ------
▽さいとう(57)
------ 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番目以降の補完を行なったときに、最初に補完された語について補 完が行われる。つまり上記の例では‘’に対し、最初に補完された語は、 ‘さとう’であるので、以後の補完は、‘さとう’を含む語(例えば、 ‘さとうせんせい’など) について行なわれる。


4.7.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 ------


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

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

---------------- 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行以上にまたがる文字列に対する変換を禁止すること ができる。


4.7.4 カタカナの見出し語

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

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

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


4.8 送り仮名関連


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

例えば、個人辞書に

おお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 にすると、辞 書登録モードに入っても送り仮名のマッチが厳密に行なわれるので、辞書登録時 に漢字を得るのに一苦労する羽目になる。下記のようにフックを設定することで 辞書登録時のみ、一時的に送り仮名の厳密なマッチをしないようにすることがで きる 58

(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 拡張アイディア.


4.8.2 送り仮名の自動処理


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

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

例えば、 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つが最終 候補である。長さ順にソートするのは、変換された部分がより長い候補を先順位 として出力するためである。上記の例の‘立ち上げる’と‘建ちあげる’ とでは、‘立ち上げる’の方が変換された部分が長いので、‘立ち上げ る’を‘建ちあげる’より先順位で出力する。


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

個人辞書に見出し語‘わた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 と送り仮名を明示的にタ イプし、‘渡した’と変換し登録する。この場合、登録する語の最後が平仮 名で終るので、その最後の平仮名の文字列(上記の例では、‘した’)が見出 し語の最後と一致するかを調べ、一致する場合には、辞書の登録を送りありエン トリとして行なうのかどうかの確認を求めてエコーエリアにプロンプトを出す 61

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’ と回答する。この結果、個人辞書の送りなしエン トリには、

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

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


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

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

U g o K

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

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

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

のようなエントリが既に skk-jisyo にあれば、それを破壊しない 62。このユーザーオプションを 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.


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

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

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

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


4.9 自動変換開始

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

K a n j i

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

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

skk-auto-okuri-processnon-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 にする。


4.10 特殊変換


4.10.1 数値変換

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

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

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

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

#0

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

#1

タイプ1。全角文字での数字。上記の例では‘12’と変換される。

#2

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

#3

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

#4

タイプ4。数値再変換。見出し語中の数字そのもの 64をキーとして辞書を再検索し ‘#4’ の部分を再検索の結果の文字列で 入れ替える。例を後述する。

#9

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

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

# /#3/

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

Q 1 0 0 2 0 0 3 0 0 4 0 0 5 0 0 SPC (65)

とタイプすれば、‘百兆二千三億四十万五百’と変換される 66

辞書エントリ

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

に対し / 2 m 2 5 d SPC とタイプすれば、‘2月25日’と変換 される 67

辞書エントリ

#kin /#9金/

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

辞書エントリ

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

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

辞書登録の例を1つ述べる。‘2月25日’を得るために、

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

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

#がつ#にち

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

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

となる。

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

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

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

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


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

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 見出し語の補完.


4.10.3 今日の日付の入力

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

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

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

0
nil

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

1
t

全角数字。‘1996年7月21日(日)’ のようになる。

2

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

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

L辞書 68には, 見出し語 ‘today’ の もとに、skk-date-adskk-number-style の全ての組み合わせ がプログラム実行変換機能 69を用いて登 録されている。従い、/ 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) )))

のようにする 70


4.10.4 プログラム実行変換

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

now /(current-time-string)/

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

Sun Jul 21 06:40:34 1996

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

実行変換プログラムの返り値は文字列である必要がある。プログラム実行変換の 辞書登録は通常の単語と同様に行なうことができるが、その中に改行を含んでは ならない。71

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

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

skk-gadget.el 73には、西暦/元号変換 プログラムや、簡単な計算プログラムなど、実行変換プログラムが集められてい る。その中の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))) )

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

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

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


4.11 接頭辞・接尾辞

辞書の見出し語の一部に ‘>’, ‘<’, ‘?’ を用いることにより接 頭辞(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 '(?> ?<))

とする。


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

標準の設定では、▼モードにおいて印字可能な文字または 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 にしておく必要がある。 メニューバーからこのユーザーオプションをオンにしたときは、これらのユーザー オプション間の衝突は自動的に調整される。


4.13 リージョン一括変換

下記のコマンドを 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 メニューバー in 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

4.14 漢字コード関連


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

\’ キーをタイプすることにより、漢字コード(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’ の いずれかをタイプすれば75、そのキーに対 応する文字から始まる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段階もメニューのメニューのキーは、 ユーザーが変更することができる。これについては、候補の選択に用いるキー を参照のこと。


4.14.2 漢字コードを知る方法

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

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

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


4.15 ▼モードの特殊キー


4.15.1 確定動作を行なうキー

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


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

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

-------------------- 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 の中に含めてはならない。

メニューによる文字入力 77の際に候補の選 択に用いられるキーは、下記の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-keys1skk-input-by-code-menu-keys2 に共通であるが、このリストに小文字が 指定された場合は、候補の選択の際にユーザーにより該当の大文字キーが入力さ れても候補の選択が可能となるようにSKK内部で処理されるが、このリストに大 文字が指定された場合、ユーザーにより該当の小文字キーが入力されても候補の 選択ができなくなってしまう。いずれのリストにも小文字で指定することをお勧 めする。


4.15.3 ▼モードでの 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 を入力する必要がある。辞書登録モードに おけるディフォルトの確定、登録の動作については、辞書登録モード を参 照のこと。


4.15.4 ▼モードでの 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 ------

4.15.5 送りあり変換中の 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 にすることにより そのままの状態で送り仮名の再入力が可能となるので、送り仮名の入力間違いを 犯しやすい人には便利であろう。


4.16 辞書関連


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

誤まって個人辞書 78に登録した単語の 削除は、削除したい単語を変換により求め、その単語が得られた時点で‘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 ------


4.16.2 個人辞書の保存動作

個人辞書の保存動作について述べる。個人辞書の保存を行なうのは、次の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-jisyoskk-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回とカ ウントされる。これは、個人辞書のミニマムポイント 79 に常に最後に変換を行なったエントリを移動させるために 80、 エントリ数、候補数が全く増えていなくとも、確定により個人辞書が更新されて いるからである。skk-jisyo-save-count のディフォルト値は、50である。 skk-jisyo-save-count の値を nil にすることで、オートセーブ を一切行なわないようにすることができる。


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

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

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

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

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


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

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 メニューバー in GNU Emacs Manual.


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

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

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


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

各辞書を 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-modemode-name に“SKK辞書”を代入してい る。

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

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


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

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

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

SKKバージョン9.6では、buffer-file-nameskk-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 で検索すると再び 読み込まれてしまう。再読み込みによる不都合は、メモリ消費以外には特にない。


4.17 デコレーション


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

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

t

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

a

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

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


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

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

skk-mode-string

アスキーモードを示す文字列。ディフォルト値は、“–SKK:”。

skk-hirakana-mode-string

かなモードを示す文字列。ディフォルト値は、“–かな”。

skk-katakana-mode-string

カナモードを示す文字列。ディフォルト値は、“–カナ”。

skk-zenei-mode-string

全英モードを示す文字列。ディフォルト値は、“–全英”。


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

カラーディスプレイを使用し、カラー表示をサポートしているWindow System下 で対応するEmacsを使用している場合には、入力モードの変更に合わせてカーソ ル色が変更される83。この機能を使用したくない場合は、 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 にする。


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

skk-use-facenon-nil の場合、skk-henkan-face に 指定されたface属性をもって変換候補をハイライト表示する。このハイライト表 示はEmacsのOverlaysの機能を使っている 84skk-henkan-face のディ フォルト値は、highlight である。Emacs標準フェイスの ‘default’, ‘modeline’, ‘region’, ‘secondary-selection’, ‘highlight’, ‘underline’, ‘bold’, ‘italic’, ‘bold-italic85の他、新たにfaceを 作り、利用することも可能。

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

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

のようにするのが手軽。この例では、foreroundがDimGrayで、background がPeachPuff1であるfaceを作り 86、この faceをもって変換候補の部分に色名を指定している。foregroundの色のみを変更 するためのfaceを作りたい場合は、

(skk-make-face 'RosyBrown1)

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


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

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


4.18 VIPとの併用

skk-use-vip の値を non-nil にすることで、VIエミュレーショ ンパッケージであるVIPを併用することができる。See VIP. 現 時点では、正式に対応しているVIPのバージョンは3.5 87のみである。しかも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でと りあえず動かすためのパッチを添付している 88。VIPER対応までの間、 VIエミュレーションのEmacs19でSKKを動かしたいユーザーは一度お試しいただき たい。

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


4.19 I-search関連


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

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

ascii

アスキーモード

kana
hirakana

かなモード

eiji

全英モード

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


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

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

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

正規表現を用いたインクリメンタル・サーチ 90を行なうことにより、上記のように文 字列の間に ‘-’, タブ文字、改行文字、復帰文字、 ‘^L’ 等が含まれ ていてもインクリメンタル・サーチによりマッチさせることができる。

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

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

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

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

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


4.20 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-fileskk-init-file のロード 前に参照されるので、この変数の設定の変更を skk-init-file に書いて も効果がない。~/.emacs などを利用すること。


4.21 picture-mode との併用

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

  1. SKKモードで全角文字を入力した場合に、BSで全角文字が消せないこと。 現状では、backward 方向にある文字を消したい場合は、その文字にポイントを 合わせ、C-c C-d で一文字づつ消すしか方法はない。
  2. picture-movement-uppicture-movement-down により上下に全 角文字を挿入した場合にカラムがずれる場合があること。

いずれも move-to-column-force 関数の中で使用している move-to-column で全角文字を無視したカラム数が与えられたときにカー ソル移動ができないことが原因である。


4.22 サーバー関連


4.22.1 skkserv の起動オプション

skkserv の起動時のオプションにより、ディフォルト辞書名の変更、ディ バッグ・モードの指定などができる。オプションの指定方法は下記の通り。

skkserv [-d] [-p NNNN] [JISHO]

また、各オプションの意味はそれぞれ下記の通り。

-d

ディバッグ・モード。

-p NNNN

通信用のポート番号として NNNN を使う。

JISHO

JISHO を辞書として利用する。

オプションなしで起動すると、通常モード(ディバッグ・モードでない)で、サー バのコンパイル時に指定した辞書とポートを利用する。skkserv は、サー バとなるべき子プロセスを作った後、直ちに終了する。エラーがあっても何のメッ セージも出さない。

ディバッグ・モードで走らせると、skkserv はそのままforegroundで走 り、メッセージを出力する。キーボードから割りこみをかけることもできる。

skkserv の起動はスーパーユーザが行う必要はない。


4.22.2 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") ))


4.22.3 うまく起動できないときは

skkserv とうまく接続できないときは、

% ps ax | grep skkserv

などとして skkserv が走っていることを確かめた上で、Emacsの lisp-interaction-mode 91 で以下のフォームを順次評価する。

;; 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")

4.22.4 サーバー起動後の辞書の再読み込み

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の取り扱いが 異なるマシン上では動作しない可能性がある。

4.22.5 限界・改良の余地

skkserv がディバッグ・モードでないときに合法的に殺す手段はない。 killする。

一つの計算機の上で使用できる同じ番号のTCPソケットは、一つしか存在できな い。従い標準ポート番号を使う skkserv も一つしか動かない。ディバッ グやテストの際にskkservを殺してすぐに起動すると、ポートが使われて いる、という趣旨のエラーが起きる。この場合は、少し待ってから再度起動する。

一つのサーバが受けつけられるクライアントの数の上限は、関数 getdtablesize により決まる。もし上限を越えた数のクライアントがコ ネクト要求をしてきた時はサーバは異常終了する。

本来のSKK辞書には, 見出し語の長さの上限はないが、skkserv では 512 バイトに限っている(skkserv.hBUFSIZE の値)。なお、変換文 字列の長さに制限はない。

辞書検索は、読みの第1文字目による場合分けを行った後は、線型探索を行なっ ている。現在の状況ではこれで十分であるが、場合によってはより高速な探索方 法を検討する必要があるかもしれない。


5 辞書ユーティリティプログラム

SKK辞書に関するユーティリティプログラムには、Emacs Lisp, Perl, C の各言 語により書かれたものがある。


5.1 Emacs Lispユーティリティプログラム

Emacsの中でコマンド skk-merge, skk-diff により、二つの辞書 をマージしたり差分を計算することができる。

誤って貴重な辞書を破壊しないように、以下の作業は辞書をコピーしたものにつ いて行うほうがよい。


5.1.1 skk-check-jisyo

  1. M-x skk-check-jisyo を実行する。‘辞書ファイル: ’ と聞いてく るので、チェックしたい辞書ファイルを指定する。
  2. 辞書をチェックした結果がバッファ ‘*jisyo check*’ に表示される。このうち、
    単語がひとつもない.
    空単語. 
    行の最後が「/」でない.
    読みの直後が「 /」でない.
    読みと単語の区切りがない.
    

    というメッセージのある行については、辞書に問題があるので適当に修正する。 これ以外のメッセージは、ユーザへの注意なので無視してもよい。以上の修正を 必要ならば行い、結果を再びもとの辞書ファイルにセーブする。


5.1.2 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. マージしたい辞書を dic1dic2 にコピーする。
  3. M-x cd 等により、Emacsの default-directory を上記の作業用 のディレクトリと一致させる。
  4. M-x skk-merge を実行する。
  5. 辞書ファイル1’ と‘辞書ファイル2’ を聞いてくるので dic1dic2を答える。計算が終了すると結果が NEW-SKK-JISYO という名 前のファイルに出力される。出力された新辞書はソートされている。

5.1.3 skk-diff

二つのSKK形式の辞書の差分をつくるプログラムである。

  • 作業用のディレクトリを用意し、そこに cdする。
  • 差分をとりたい2つの辞書を dic1dic2 にコピーする。
  • M-x cd 等により、Emacsの default-directory を上記の作 業用ディレクトリと一致させる。
  • M-x skk-diff を実行する。‘辞書ファイル1’と ‘辞書 ファイル2’ を聞いてくるので、それぞれ、dic1dic2 を答える。 計算が終了すると、dic1dic2 の差分が SKK-JISYO-DIFF という名前のファイルに書かれる。

5.2 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) → ローマ字変換コマンド。


5.3 Cによるユーティリティプログラム

Cで書かれたユーティリティプログラムはjisyo-toolsと総称され、SKKの distributionではディレクトリ jisyo-toolsの下にある。

Emacs LispやPerlによる同様のプログラムでは辞書が巨大な場合は、Emacsがパ ンクしたり、実行時間が非常に長くなることがあるが、そのようなときに有用で ある。


5.3.1 プログラム作成方法

Makefile を見て、必要があれば中の CCCFLAGS の内容 を変更してから make を実行する。

なお skkdic-expr では作業用のファイルとして辞書の2倍程度の大き さのものを作成する。このファイルが作成されるディレクトリは実行時に指定で きるが、デフォールトとして /tmp を指定してる。もしも明らかに不足 する場合には、

-DTMPDIR=\".\"

CFLAGS に追加すると、/tmp が溢れるといった災害を防 ぐことができる。


5.3.2 skkdic-expr

複数のSKK辞書をマージしたり、他の辞書と同じ内容を引くのに使う。例えば、 次のようにして使う。

% skkdic-expr jisyo1 + jisyo2 - jisyo3 > result

上記の例では、jisyo1jisyo2 にある 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
    

5.3.3 skkdic-sort

ソートされていない辞書を通常のSKK辞書の形式にソートし、 ‘;; okuri-ari entries. と ‘;; okuri-nasi entries. を 適切な位置に挿入する。入力は標準入力のみ、出力は標準出力のみが指定できる。 例をあげる。

% skkdic-expr jisyo-a + jisyo-b | skkdic-sort > newdict

一時的に使用するswapを小さくするためにあえて skk-jisyo-expr とは 別のプログラムとしてある。


5.3.4 skkdic-count

SKK辞書の中の候補の数を数える。‘[’ と ‘]’ で囲まれた送り仮名毎 のブロックも一つの候補として数える。


6 拡張アイディア

将来のバージョンに託された拡張アイディアを順不同で述べる。これ以外にも要 望、拡張の具体的アイディアがあれば、開発者にご連絡いただきたい。


7 SKKメーリングリスト


7.1 ユーザーメーリングリスト

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:が欠番の部分もある。


7.2 開発者用メーリングリスト

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’ へメールを送る。


8 SKKの入手方法


8.1 メールによる入手方法

skk-source@kuis.kyoto-u.ac.jp’ 宛にメールを送付することで、SKKの ソースをメールを入手することができる。下記の要領で ‘Subject:’ を指 定し、メールを送付することで、指定された内容のメールが返送される。

skk.el が欲しい場合。

Subject: skk.el

入手可能なファイルのインデクスが欲しい場合。

Subject: indexindex にはファイルサイズと最終更新日が入っ ている。

ファイルのバージョン等を知りたい場合。

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が入手できる。

8.2 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も置いてある。


8.3 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’)にアクセスすることができる。


8.4 その他の入手方法

SKKは1988年4月に第1版をJUNETに投稿して以来、毎年4月にJUNETのニュースグルー プfj.sourcesに新しいバージョンを投稿している。この方式もひきつづき続けて いきたいと考えている。

SKKはまたMuleのcontributed softwareでもあるので、Muleの一部としても入手 することができる。


9 SKK関連ソフトウェア


9.1 KAKASI

KAKASIとは、高橋裕信氏 <takahasi@tiny.or.jp> による「漢字かなまじり文 をひらがな文やローマ字文に変換することを目的として作成したプログラムと辞 書の総称」である。KAKASIは、Kanji Kana Simple Inverterにちなんで、また SKKの逆言葉として名付けられた。KAKASI は、SKKのcontribution softwareに含 まれている。


9.2 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

9.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形式の辞書が生成される92。この 辞書は、元の SKK-JISYO.L の4倍弱のファイルサイズになる 93

次に pskkserv をEmacsの exec-directory などに置き、下記の ようなシェルスクリプト 94rc.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 スーパーユーザの権限を持たない人の場合.


9.4 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の全機能実装を目指しています。


9.5 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にはかなり近付けたと思うのですが、まだまだ異なる部分が残っていま す。特に操作体系で異なると感じられた方は私までレポートを御願い致します。


10 謝辞とお願い


10.1 謝辞

SKKの設計方針はTAO/ELIS上の日本語入力システムKanzenの影響を受けています。 Kanzenのデモを行ってくださり、またKanzenを使う機会を与えてくださったNTT の竹内郁雄さんに感謝します。

第1版の辞書作成のための読みの入力を行ってくださった東北大学電気通信研究 所佐藤研究室の 安藤大君、猪岡美紀さん、奥川淳一君、佐々木昭彦君、佐藤克 志君、山岸信寛君に感謝します。

SKK辞書第2, 3, 4, 5, 6, 7, 8版作成のためのデータを提供してくださった方々 に感謝します。

SKK辞書第6, 7版作成にあたり協力してくださった高橋裕信氏に感謝します。

その他、SKK改良のためにプログラム等を提供してくださった大勢の方々に感謝 します。


10.2 お願い

SKK辞書は多くのユーザの方々から提供された辞書によりコピーフリーの辞書と しては最大規模の辞書になっています。今後もこの方式によりSKK辞書をより充 実したものにしていきたいと思います。毎年1月頃を目途にアナウンスしますが、 SKK辞書の充実にご協力いただける方は、随時以下のアドレスまで個人辞書と SKK-JISYO.L との差分をお送りください。お送りいただいた辞書を整理 して次年度の辞書に含めさせていただきます。差分ファイルの作成方法について は skkdic-expr をご参照下さい。

また, SKK-JISYO.L の誤りを発見された方は多少にかかわらず、下記の アドレスまでお知らせください。

skk-jisyo@kuis.kyoto-u.ac.jp

10.3 あとがき

本マニュアルは、佐藤と亀山がLatexinfoを使用してSKKバージョン8.6について 書いたものを、中島がTexinfo形式で加筆・修正し、酒井清隆氏に校正していた だいたものである。加筆や修正の大部分は、SKKの拡張機能に伴なうものである。

このマニュアルは、中島がTexinfoを使って書いた初めてのものであることを最 後に付け加えておく。中島自身が LaTeX ユーザーにすぎず、Plain TeX を知らないので、執筆前は、「Texinfoは使えないんじゃないか」と思っていた が、Texinfoのマニュアルを読むと意外と LaTeX 気分で書けることに気が付 いた。Texinfoはなかなかすごいソフトである。


事項索引

Jump to:     _   ;   .   #   ~    
A   B   C   D   E   F   H   I   J   K   L   M   O   P   R   S   T   U   V   W                                                            
Index EntrySection

*SKK-JISYO.L*辞書バッファのメジャーモード

_
_emacsユーザーオプションの設定方法
_skkユーザーオプションの設定方法

;
;; okuri-ari entries.辞書の形式
;; okuri-nasi entries.辞書の形式

.
.emacs.emacsの設定

#
#0数値変換
#1数値変換
#2数値変換
#3数値変換
#4数値変換

~
~/.emacsユーザーオプションの設定方法
~/.skkユーザーオプションの設定方法
~/.skkI-search関連

▽マークの付け忘れ[▽まーくのつけわすれ]▽モード
▽マークの付け忘れ[▽まーくのつけわすれ]ポイントを戻して▽モードへ

A
adddummyPerlによるユーティリティプログラム
anonymous ftpAnonymous Ftpによる入手方法
Auto Fill起動と終了

B
BSpicture-modeとの併用

C
canna.el▼モードにおける変換候補のハイライト表示
codeconv.plPerlによるユーティリティプログラム

D
dabbrev.el辞書バッファのメジャーモード
DATADIRMakefileの編集とインストール
DBM辞書に関する設定
DBMpskkserv

E
ELISPDIRMakefileの編集とインストール
EMACSMakefileの編集とインストール
EUCコード漢字コードまたはメニューによる文字入力
EUCコード漢字コードを知る方法

F
face▼モードにおける変換候補のハイライト表示
fj.sourcesその他の入手方法
fundamental-mode辞書バッファのメジャーモード

H
Home PageWWWを利用して入手する方法

I
I-searchインクリメンタル・サーチ
I-searchI-search関連
Incremental regexp search間に空白等を含む文字列の検索
Incremental searchインクリメンタル・サーチ
Incremental searchI-search関連
INFODIRMakefileの編集とインストール
INSTALLMakefileの編集とインストール

J
JedSKK on Jed
jis2sjisPerlによるユーティリティプログラム
jis2ujisPerlによるユーティリティプログラム
JISコード漢字コードまたはメニューによる文字入力
JISコード漢字コードを知る方法
JUNETその他の入手方法

K
kakasiSKK関連ソフトウェア
kana2romaPerlによるユーティリティプログラム
kana2roma.plPerlによるユーティリティプログラム
Kanji Kana Simple InverterKAKASI
keyboard.c1回のadvertised-undo(undo)の対象

L
list2skkPerlによるユーティリティプログラム
L辞書辞書の形式

M
makedbmdicpskkserv
MakefileMakefileの編集とインストール
Makefile.18Makefileの編集とインストール
Menu Barsユーザーオプションの設定方法
Menu Barsリージョン一括変換
Menu Bars辞書エントリの数えあげ
move-to-columnpicture-modeとの併用
move-to-column-forcepicture-modeとの併用
M辞書辞書の形式

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

P
Perl辞書に関する設定
Perlpskkserv
picture-modepicture-modeとの併用
picture.elpicture-modeとの併用
pskkserv辞書に関する設定
pskkservSKK関連ソフトウェア
pskkservpskkserv
pubdic2listPerlによるユーティリティプログラム

R
removedummyPerlによるユーティリティプログラム
rgb.txt▼モードにおける変換候補のハイライト表示
roma2kanaPerlによるユーティリティプログラム
roma2kana.plPerlによるユーティリティプログラム

S
S-LangSKK on Jed
save-some-buffers辞書バッファのbuffer-file-name
Simple Kana to Kanji conversion program概要
sjis2jisPerlによるユーティリティプログラム
SKK abbrev modeアスキー文字を見出し語とした変換
SKK_JISYO共通の設定
skk-auto.elファイル構成
skk-auto.elユーザーオプションの設定方法
skk-comp.elファイル構成
skk-comp.elユーザーオプションの設定方法
skk-diffskk-diff
skk-e18.elファイル構成
skk-e18.elユーザーオプションの設定方法
skk-e19.elファイル構成
skk-e19.elユーザーオプションの設定方法
skk-gadget.elファイル構成
skk-gadget.elユーザーオプションの設定方法
skk-gadget.elプログラム実行変換
SKK-JISYO.L辞書の形式
SKK-JISYO.M辞書の形式
SKK-JISYO.S辞書の形式
skk-kakasi.elファイル構成
skk-kakasi.elユーザーオプションの設定方法
skk-kcode.elファイル構成
skk-kcode.elユーザーオプションの設定方法
skk-keep-record変換及び個人辞書に関する統計
skk-num.elファイル構成
skk-num.elユーザーオプションの設定方法
skk-record-file変換及び個人辞書に関する統計
skk-server.elファイル構成
skk-server.elユーザーオプションの設定方法
skk-tree.elファイル構成
skk-tree.elユーザーオプションの設定方法
skk-vip.elファイル構成
skk-vip.elユーザーオプションの設定方法
skk2listPerlによるユーティリティプログラム
skkconvPerlによるユーティリティプログラム
skkdic-countskkdic-count
skkdic-exprskkdic-expr
skkdic-sortskkdic-sort
skkfepSKK関連ソフトウェア
skkfepskkfep
skkinputSKK関連ソフトウェア
skkinputskkinput
SKKSERV共通の設定
SKKSERVER共通の設定
SKKの入手方法[SKKのにゆうしゆほうほう]メールによる入手方法
SKKの入手方法[SKKのにゆうしゆほうほう]Anonymous Ftpによる入手方法
SKKの入手方法[SKKのにゆうしゆほうほう]WWWを利用して入手する方法
SKKの入手方法[SKKのにゆうしゆほうほう]その他の入手方法
SKKの開発[SKKのかいはつ]開発者用メーリングリスト
SKKモードモード
subPerlによるユーティリティプログラム
S辞書辞書の形式

T
T-code有限状態オートマトンを用いた変換
texi2dviMakefileの編集とインストール
TEXI2DVIMakefileの編集とインストール
Text Properties▼モードにおける変換候補のハイライト表示
TUT-code有限状態オートマトンを用いた変換

U
ujis2jisPerlによるユーティリティプログラム

V
VIPVIPとの併用
vip.elVIPとの併用
VIPERVIPとの併用
viper.elVIPとの併用

W
WWWWWWを利用して入手する方法

アスキーモード[あすきーもーと]入力モード

オートフィル[おーとふいる]起動と終了
オートマトンの状態遷移規則[おーとまとんのしようたいせんいきそく]有限状態オートマトンを用いた変換

かなモード[かなもーと]入力モード

カナモード[かなもーと]入力モード

トグル変換[とくるへんかん]ひらがな/カタカナの一時的入力

バイナリサーチ[はいなりさーち]辞書に関する設定
ハイライト[はいらいと]▼モード

プログラム実行変換[ふろくらむしつこうへんかん]今日の日付の入力

ホームページ[ほーむへーし]WWWを利用して入手する方法

マイナーモード[まいなあもーと]モード

メーリングリスト[めーりんくりすと]ユーザーメーリングリスト
メーリングリスト[めーりんくりすと]開発者用メーリングリスト
メジャーモード[めしゃーもーと]モード
メニューバー[めにゆーはー]ユーザーオプションの設定方法
メニューバー[めにゆーはー]リージョン一括変換
メニューバー[めにゆーはー]辞書エントリの数えあげ

リニアサーチ[りにあさーち]辞書に関する設定

ローマ字プレフィックス[ろーましふれふいつくす]辞書の形式
ローマ字入力[ろーましにゆうりよく]■モード

個人辞書[こしんししよ]起動と終了
個人辞書[こしんししよ]辞書の形式
個人辞書[こしんししよ]個人辞書の保存動作
個人辞書エントリの削除[こしんししよのえんとりのさくしよ]個人辞書中の単語の削除
個人辞書のオートセーブ[こしんししよのおーとせーふ]個人辞書の保存動作

全英モード[せんえいもーと]入力モード

共有辞書[きようゆうししよ]辞書の形式

再帰的辞書登録[さいきてきししよとうろく]辞書登録モード

変換対象の文字列の決定[へんかんたいしようのもしれつのけつてい]▽モード
変換開始[へんかんかいし]▼モード

接尾辞[せつひし]接頭辞・接尾辞
接頭辞[せつとうし]接頭辞・接尾辞

改行文字を含む文字列の辞書登録[かいきようもしをふくむもしれつのししよとうろく]辞書登録モード

数をパラメータとする語の変換[かすをはらめーたとするこのへんかん]数値変換
数値再変換[すうちさいへんかん]数値変換
数字から始まる見出し語の入力[すうしからはしまるみたしこのにゆうりよく]▽モード

暗黙の確定[あんもくのかくてい]▼モード
暗黙の確定[あんもくのかくてい]辞書登録モード
暗黙の確定[あんもくのかくてい]確定変換とそのアンドゥ
暗黙の確定[あんもくのかくてい]確定アンドゥ
暗黙の確定[あんもくのかくてい]暗黙の確定のタイミング

有限状態オートマトン[ゆうけんしようたいおーとまとん]有限状態オートマトンを用いた変換

確定入力[かくていにゆうりよく]■モード
確定変換[かくていへんかん]辞書に関する設定

見出し語のコンプリーション[みたしこのこんふりーしよん]見出し語の補完
見出し語のコンプリーション[みたしこのこんふりーしよん]見出し語を補完しながら▼モードへ

誤登録[ことうろく]個人辞書中の単語の削除

読みのコンプリーション[よみのこんふりーしよん]見出し語の補完
読みのコンプリーション[よみのこんふりーしよん]見出し語を補完しながら▼モードへ

辞書のソート方法[ししょのそーとほうほう]辞書の形式
辞書の差分[ししよのさふん]skk-diff
辞書バッファのネーミング規則[ししよはつふあのねーみんくきそく]辞書バッファのメジャーモード
辞書登録[ししよとうろく]辞書登録モード

送りありエントリ[おくりありえんとり]辞書の形式
送りあり変換[おくりありへんかん]辞書の形式
送りなしエントリ[おくりなしえんとり]辞書の形式
送りなし変換[おくりなしへんかん]辞書の形式

逆引き[きやくひき]リージョン一括変換


変数索引

Jump to:   B   C   E   I   M   S   T   Y  
Index EntrySection

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

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

E
exec-directory.emacsの設定
exec-directorypskkserv

I
isearch-mode-end-hook.emacsの設定
isearch-mode-hook.emacsの設定

M
minibuffer-exit-hook送り仮名の厳密なマッチ
minibuffer-setup-hook送り仮名の厳密なマッチ
minibuffer-setup-hook入力モードを示すカーソル色に関する設定
mode-name辞書バッファのメジャーモード

S
search-highlightインクリメンタル・サーチ
skk-allow-spaces-newlines-and-tabsポイントを戻して▽モードへ
skk-allow-spaces-newlines-and-tabs空白・改行・タブを含んだ見出し語の変換
skk-ascii-cursor-color入力モードを示すカーソル色に関する設定
skk-auto-fill-mode-hookユーザーオプションの設定方法
skk-auto-henkan-start自動変換開始
skk-auto-henkan-start-keyword-list自動変換開始
skk-auto-insert-paren対になる文字列の一括入力
skk-auto-load-hookユーザーオプションの設定方法
skk-auto-okuri-process辞書の形式
skk-auto-okuri-process送り仮名の自動処理
skk-auto-okuri-processどのように変換されるか
skk-auto-okuri-process送りあり変換の変換開始のタイミング
skk-auto-okuri-process自動変換開始
skk-auto-paren-string-alist対になる文字列の一括入力
skk-aux-large-jisyo辞書に関する設定
skk-backup-jisyo起動と終了
skk-backup-jisyo辞書に関する設定
skk-backup-jisyo個人辞書の保存動作
skk-byte-compile-init-fileskk-init-fileのバイトコンパイル
skk-comp-load-hookユーザーオプションの設定方法
skk-compare-jisyo-size-when-saving個人辞書の保存動作
skk-convert-okurigana-into-katakanaカナモードでの変換の送り仮名の処理
skk-count-private-jisyo-candidates-exactly個人辞書の保存動作
skk-count-private-jisyo-candidates-exactly変換及び個人辞書に関する統計
skk-dabbrev-like-completion見出し語の補完
skk-date-ad今日の日付の入力
skk-default-cursor-color入力モードを示すカーソル色に関する設定
skk-delete-implies-kakutei▼モードでのBS
skk-delete-okuri-when-quit送りあり変換中のC-g
skk-e18-load-hookユーザーオプションの設定方法
skk-e19-load-hookユーザーオプションの設定方法
skk-echo仮名文字のローマ字プレフィックスのエコー
skk-egg-like-newline▼モードでのRET
skk-gadget-load-hookユーザーオプションの設定方法
skk-henkan-face▼モードにおける変換候補のハイライト表示
skk-henkan-okuri-strictly辞書の形式
skk-henkan-okuri-strictly送り仮名の厳密なマッチ
skk-henkan-okuri-strictly送りあり変換の変換開始のタイミング
skk-henkan-show-candidates-keys候補の選択に用いるキー
skk-hirakana-mode-string入力モードを示すモードラインの文字列の変更
skk-init-fileユーザーオプションの設定方法
skk-init-fileskk-init-fileのバイトコンパイル
skk-initial-search-jisyo辞書の形式
skk-initial-search-jisyo辞書に関する設定
skk-input-by-code-menu-keys1候補の選択に用いるキー
skk-input-by-code-menu-keys2候補の選択に用いるキー
skk-input-vector数字や記号文字の入力
skk-input-vector対になる文字列の一括入力
skk-isearch-start-mode起動時の入力モードの指定
skk-isearch-use-previous-mode起動時の入力モードの指定
skk-isearch-whitespace-regexp間に空白等を含む文字列の検索
skk-japanese-message-and-errorエラーなどの日本語表示
skk-jisyo辞書の形式
skk-jisyo辞書に関する設定
skk-jisyo送りあり変換の変換開始のタイミング
skk-jisyo個人辞書の保存動作
skk-jisyo辞書バッファのbuffer-file-name
skk-jisyo-code辞書バッファの文字コードの設定
skk-jisyo-mode辞書バッファのメジャーモード
skk-jisyo-save-count個人辞書の保存動作
skk-kakasi-load-hookユーザーオプションの設定方法
skk-kakutei-early送りあり変換の変換開始のタイミング
skk-kakutei-early暗黙の確定のタイミング
skk-kakutei-flag辞書に関する設定
skk-kakutei-jisyo辞書の形式
skk-kakutei-jisyo辞書に関する設定
skk-kakutei-jisyo確定変換とそのアンドゥ
skk-kakutei-key確定動作を行なうキー
skk-kana-cursor-color入力モードを示すカーソル色に関する設定
skk-kana-rom-vector辞書登録の際に注意すべきこと
skk-katakana-cursor-color入力モードを示すカーソル色に関する設定
skk-katakana-mode-string入力モードを示すモードラインの文字列の変更
skk-kcode-load-hookユーザーオプションの設定方法
skk-large-jisyo.emacsの設定
skk-large-jisyo辞書に関する設定
skk-large-jisyo辞書エントリの数えあげ
skk-large-jisyo辞書バッファのメジャーモード
skk-load-hookユーザーオプションの設定方法
skk-minibuffer-checking-map-func入力モードを示すカーソル色に関する設定
skk-mode-hookユーザーオプションの設定方法
skk-mode-string入力モードを示すモードラインの文字列の変更
skk-num-load-hookユーザーオプションの設定方法
skk-number-style今日の日付の入力
skk-numeric-conversion-float-num数値変換
skk-okuri-ari-min個人辞書の保存動作
skk-okuri-nasi-min個人辞書の保存動作
skk-prefixローマ字仮名変換ルール
skk-prefix-listローマ字仮名変換ルール
skk-prefix-treeローマ字仮名変換ルール
skk-process-okuri-early辞書の形式
skk-process-okuri-early送り仮名の厳密なマッチ
skk-process-okuri-early送りあり変換の変換開始のタイミング
skk-process-okuri-early暗黙の確定のタイミング
skk-remote-shell-programskk-server.elのオプション
skk-report-server-responseskk-server.elのオプション
skk-report-set-cursor-error入力モードを示すカーソル色に関する設定
skk-rom-kana-rule-list有限状態オートマトンを用いた変換
skk-roma-kana-aローマ字仮名変換ルール
skk-roma-kana-eローマ字仮名変換ルール
skk-roma-kana-iローマ字仮名変換ルール
skk-roma-kana-oローマ字仮名変換ルール
skk-roma-kana-uローマ字仮名変換ルール
skk-romaji-*-by-hepburnリージョン一括変換
skk-search-prog-list辞書に関する設定
skk-search-prog-list見出し語の補完
skk-self-insert-non-undo-count1回のadvertised-undo(undo)の対象
skk-server-host.emacsの設定
skk-server-host共通の設定
skk-server-jisyo共通の設定
skk-server-load-hookユーザーオプションの設定方法
skk-server-prog.emacsの設定
skk-server-prog共通の設定
skk-servers-listskk-server.elのオプション
skk-special-midashi-char-list接頭辞・接尾辞
skk-tree-load-hookユーザーオプションの設定方法
skk-use-face▼モードにおける変換候補のハイライト表示
skk-use-numeric-conversion数値変換
skk-use-vipVIPとの併用
skk-vip-load-hookユーザーオプションの設定方法
skk-zenei-mode-string入力モードを示すモードラインの文字列の変更
skk-zenkaku-cursor-color入力モードを示すカーソル色に関する設定
skk-zenkaku-vector全英モードにおける入力
SKK辞書辞書バッファのメジャーモード

T
tex-mode-hook対になる文字列の一括入力

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


関数索引

Jump to:   E   H   I   N   P   S   T  
Index EntrySection

E
eval-print-last-sexp.emacsの設定

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

I
isearch-ring-advanceインクリメンタル・サーチ
isearch-ring-retreatインクリメンタル・サーチ
isearch-yank-killインクリメンタル・サーチ

N
newline-and-indent.emacsの設定

P
picture-duplicate-line.emacsの設定

S
self-insert-command1回のadvertised-undo(undo)の対象
skk-abbrev-comma1回のadvertised-undo(undo)の対象
skk-abbrev-period1回のadvertised-undo(undo)の対象
skk-ascii-regionリージョン一括変換
skk-auto-fill-mode.emacsの設定
skk-calcプログラム実行変換
skk-check-jisyoskk-check-jisyo
skk-count-jisyo-candidates辞書エントリの数えあげ
skk-diffEmacs Lispユーティリティプログラム
skk-gyakubiki-katakana-messageリージョン一括変換
skk-gyakubiki-katakana-regionリージョン一括変換
skk-gyakubiki-messageリージョン一括変換
skk-gyakubiki-regionリージョン一括変換
skk-hiragana-regionリージョン一括変換
skk-hurigana-katakana-messageリージョン一括変換
skk-hurigana-katakana-regionリージョン一括変換
skk-hurigana-messageリージョン一括変換
skk-hurigana-regionリージョン一括変換
skk-insert-[aiue]1回のadvertised-undo(undo)の対象
skk-insert-comma1回のadvertised-undo(undo)の対象
skk-insert-period1回のadvertised-undo(undo)の対象
skk-isearch-mode-cleanup.emacsの設定
skk-isearch-mode-setup.emacsの設定
skk-kakutei.emacsの設定
skk-kana-input1回のadvertised-undo(undo)の対象
skk-katakana-regionリージョン一括変換
skk-kill-emacs-without-saving-jisyo起動と終了
skk-kill-emacs-without-saving-jisyo個人辞書の保存動作
skk-mergeEmacs Lispユーティリティプログラム
skk-mergeskk-merge
skk-okuri-search辞書に関する設定
skk-purge-from-jisyo個人辞書の保存動作
skk-romaji-messageリージョン一括変換
skk-save-jisyo個人辞書の保存動作
skk-search-jisyo-file辞書に関する設定
skk-search-jisyo-file辞書バッファのメジャーモード
skk-search-kakutei-jisyo-file辞書に関する設定
skk-search-kakutei-jisyo-file確定変換とそのアンドゥ
skk-search-kakutei-jisyo-file辞書バッファのメジャーモード
skk-search-server辞書に関する設定
skk-search-server辞書バッファのメジャーモード
skk-self-insert数字や記号文字の入力
skk-self-insert1回のadvertised-undo(undo)の対象
skk-set-henkan-point数字や記号文字の入力
skk-set-henkan-point1回のadvertised-undo(undo)の対象
skk-tutorial.emacsの設定
skk-undo-kakutei確定アンドゥ
skk-zenkaku-insert全英モードにおける入力
skk-zenkaku-insert1回のadvertised-undo(undo)の対象
skk-zenkaku-regionリージョン一括変換

T
texinfo-format-bufferMakefileの編集とインストール


キー索引

Jump to:   ,   .   @   /   \   $  
B   C   M   Q   T  
Index EntrySection

,
,見出し語の補完

.
.見出し語の補完

@
@今日の日付の入力

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

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

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

B
BS▼モードでのBS

C
C-g▽モード
C-g送りあり変換中のC-g
C-j確定動作を行なうキー
C-q全英文字の一時的入力
C-rインクリメンタル・サーチ
C-sインクリメンタル・サーチ
C-u -1 C-x j起動と終了
C-u C-x j起動と終了
C-u SPCカタカナの見出し語
C-x C-c起動と終了
C-x C-c個人辞書の保存動作
C-x C-j送りあり変換の変換開始のタイミング
C-x j起動と終了
C-x j送りあり変換の変換開始のタイミング

M
M-- C-x j起動と終了
M-1 C-x j起動と終了
M-C-rインクリメンタル・サーチ
M-C-r間に空白等を含む文字列の検索
M-C-sインクリメンタル・サーチ
M-C-s間に空白等を含む文字列の検索
M-Qポイントを戻して▽モードへ
M-SPC見出し語を補完しながら▼モードへ
M-x skk-ascii-regionリージョン一括変換
M-x skk-count-jisyo-candidates辞書エントリの数えあげ
M-x skk-gyakubiki-katakana-messageリージョン一括変換
M-x skk-gyakubiki-katakana-regionリージョン一括変換
M-x skk-gyakubiki-messageリージョン一括変換
M-x skk-gyakubiki-regionリージョン一括変換
M-x skk-hiragana-regionリージョン一括変換
M-x skk-hurigana-katakana-messageリージョン一括変換
M-x skk-hurigana-katakana-regionリージョン一括変換
M-x skk-hurigana-messageリージョン一括変換
M-x skk-hurigana-regionリージョン一括変換
M-x skk-katakana-regionリージョン一括変換
M-x skk-romaji-messageリージョン一括変換
M-x skk-zenkaku-regionリージョン一括変換

Q
Q▽モード
qひらがな/カタカナの一時的入力

T
TAB見出し語の補完


Footnotes

(1)

個人の変換内容を逐次記録している辞書。詳細は、個人辞書 を参照のこと。

(2)

Elib とは、the GNU emacs lisp library の略で、キュー、AVL木構造、二重連結リストなどを扱うためのルーチンが入っている。See Elib in Elib - The Emacs Lisp Library.

(3)

OSがMSDOSの場合は _emacs である。

(4)

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

(5)

カラーディスプレイを使用し、カラー表示をサポートしているWindow System下で対応するEmacsを使用している場合。Emacs 18にはカーソル色の変更機能はない。

(6)

See Auto Fill in GNU Emacs Manual.

(7)

「引数」については、Arguments in GNU Emacs Manual を参照のこと。

(8)

何故「変形」なのかと言うと、SKK用のキーマッピングにEmacs19で装備された minor-mode-map-alist を利用していないため。

(9)

self-insert-command をそのメジャーモード独自のコマンドに割り付けるようなモード、もしくは、該当のキーマップが suppress-keymap されており、多くのキーが undefined に割り付けられるようなメジャーモードでは、SKKモードの起動により受ける影響は大きくならざるを得ない。「可能な限り」と断わりを入れたのはこのためである。

(10)

See かなモード、カナモード.

(11)

See ポイント in GNU Emacs Manual.

(12)

これは、辞書の見出し語に空白を含めることができない制限からきている。

(13)

本マニュアルでは、見出し語と候補群を合わせた一行の意味で使用している。詳細は、辞書の形式 を参照のこと。

(14)

ハイライト表示はEmacsのOverlaysの機能を使用している。Emacs 18ではOverlaysが実装されていない。

(15)

エコーエリアとミニバッファは視覚的には同一の場所にあるが、エコーエリアが単にユーザーへのメッセージを表示するのみであるのに対し、ミニバッファは独立のバッファとして機能する点が違う。

(16)

x’ は小文字で入力する必要がある

(17)

詳細は、送りなし変換 を参照のこと。

(18)

ここでも暗黙の確定が行なわれるのでC-j をタイプする必要はない。但し、▼モードでの RET を参照のこと。

(19)

送り仮名を伴なう変換。詳細は、送りあり変換 を参照のこと。

(20)

名詞とそのサ変動詞とを別々に辞書に持ったのでは空間的な効率が悪いので、基本的に、辞書がサ変動詞を送りありとして意識した作りとしていない。従い、‘する’を送り仮名とした送りあり変換では、辞書に候補がなく辞書登録モードに入ってしまう可能性が大きいので、名詞として分解して入力することを勧めている。一方、このように名詞に分解して入力することで、サ変動詞になり得ない名詞が候補として出てくることもあり(例えば‘孝行する’ という変換を行ないたい場合に‘高校’が出てくるなど)、候補の絞り込みという点では必ずしも効率が良くないので、将来のバージョンにおいて改善する方向で検討を進めている。詳細は、拡張アイディア を参照のこと。

(21)

See メニューバー in GNU Emacs Manual.

(22)

例えば skk-roma-kana-a など、オン/オフの設定ではなく複雑なリストを指定しなければならないユーザーオプションについては、メニューバーからは設定できない。これらの簡便な設定ユーザーインターフェイスについては、将来のバージョンにて検討する。See 拡張アイディア.

(23)

変換開始の直前に内部変数に送り仮名を保存するのだが、送り仮名の確定前に変換を開始するので、個人辞書も送り仮名対応ブロックが作られない。ただ、確定時点では送り仮名が分っているので、確定時点で送り仮名を検索し直し、個人辞書に送り仮名対応ブロックを作ることは可能だが、skk-process-okuri-early を利用するユーザーにとっては、それは無駄なことなのであろう。

(24)

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

(25)

Emacsコマンドの sort-columns は内部的にUNIXコマンドの sort を使っているので、辞書のソートには使わないこと。

(26)

正確に言えば、送りあり変換では skk-okuri-ari-min + 1 の位置、送りなし変換では
skk-okuri-nasi-min + 1 の位置である。

(27)

See 確定変換.

(28)

See 共有辞書の配置.

(29)

使用頻度の高い候補から降順に配置することができればリニアサーチを行なう場合最も効率が良いが、作業は楽ではないだろう。例えば、 skk-initial-search-jisyo を使って一定時間文章を書いた後 skk-jisyo に挿入されたエントリの内、skk-initial-search-jisyo にあるものを skk-jisyo に挿入されている順の配置で抜き出して skk-initial-search-jisyo の見出し語の配置を変えてゆけば不可能ではないが、結構な労力になろう。

(30)

Perlベースの pskkserv を使用すれば、DBM化された辞書にアクセスする時間はかなり高速な部類に入る。See pskkserv.

(31)

See カナモード、全英モード.

(32)

/’ キーでSKK abbrev modeに入ってしまうと ‘q’ キー入力が ‘q’ 文字の入力として扱われてしまう。

(33)

正確に言うと‘’の次の位置にある文字列をもって文字種の判別を行なっているので、途中で文字種類の違う文字が混在していても無視される。

(34)

SKK abbrev modeに入っている。C-qskk-abbrev-map にマッピングされたキーバインドである。See アスキー文字を見出し語とした変換.

(35)

See ローマ字プレフィックス.

(36)

cdrcar

(37)

cdrcdr

(38)

改名されて skk-prefix-tree という変数になった。ElibのAVL木パッケージを利用したAVL木構造となっている。skk-prefix-list の長さは24と結構長く、skk-kana-input で頻繁に参照、走査されるので member による逐次走査よりもAVL木を利用したバイナリーサーチの方が有利と判断した。

(39)

順序としては、オートマトンの状態遷移規則を用いたリストが先に参照され、そこに該当の規則がなければ、次に上記5リストが参照される。

(40)

!’ をEmacsのchartypeで表現した ‘?!’ をEmacsの lisp-interaction-mode で評価すると33が返ってくる。

(41)

0から数える。

(42)

A’をタイプすると‘’を挿入する他、▽モードに入る、という仕事をしなければならないので、skk-self-insert ではなく、skk-set-henkan-point に割り付けられている。

(43)

aset の第2引数の42の代りに ‘?*’ のように ‘*’ のchar type表現をそのまま書いても良い。aset を使って skk-input-vector の値を変更するのは、skk.el のロード後でなければならないので、この式を .emacs などで設定してはならない

(44)

skk-input-vector が元々グローバル変数であることに注意。

(45)

初期値が nil でないバッファローカル値に破壊的関数を使用すると、カレントバッファだけでなく、他のバッファから見える値まで変更されてしまう。詳細については、skk.elskk-make-henkan-marker関数のコメントを参照願いたい。skk-ascii-punc では、初期値がnilでない skk-input-vector をバッファローカル化し、aset で直接書換えするので、予め copy-sequence で複写し、バッファローカル化された skk-input-vector が指す実体をグローバル変数 skk-input-vector の指すものから変更している。

(46)

残念ながら、‘’などを入力する skk-insert-[aiue] や ‘▽あ’ などを入力する skk-set-henkan-point では引数渡しできない。

(47)

buffer-undo-list にEmacsが挿入したアンドゥの境目の目印を取り除く方法でエミュレートしている。

(48)

SKK abbrevモードでは、アスキー文字入力がEmacsオリジナルの self-insert-command により行なわれているので、エミュレートのため の内部変数である skk-self-insert-non-undo-count をインクリメント することができず、アンドゥをエミュレートできない。しかも、カンマやピリオ ドを挿入した時点で、skk-abbrev-commaskk-abbrev-period を使うことになるので、オリジナルのアンドゥの機能も損なってしまう。ただ、 現実問題としては、元来SKK abbrevモードは省略形としての見出し語を挿入する ためのモードであるので、長い見出し語を挿入することはあまりなく、問題も小 さいと考えられる。

(49)

‘20’はEmacsの ソースファイルの一部である keyboard.c に定められたマジックナンバー と一致する。

(50)

かなモー ドでの入力中、アスキーモードに移行してタイプした場合などがこれにあたるで あろう。

(51)

何故 copy-sequence を使用するのかについては、 数字や記号文字の入力 を参照。

(52)

See ▽マークの付け忘れ.

(53)

Q’ は大文字で入力する必要がある。

(54)

ひらがな、 カタカナ、全角アルファベット、アルファベットの4種類のいずれか。

(55)

C-j をタイプして明示的に確定した場合は勿論、 暗黙の確定を行なった場合も同様である。

(56)

共有辞書はサーチされない。共有辞書では一般 的に先頭の文字を共通にする見出し語が多すぎて、望みの補完が行なえる可能性 が低いからである。

(57)

さとう’の次に補完される見出し語は、個人辞書の 内容に依存する。

(58)

minibuffer-setup-hookminibuffer-exit-hook はEmacs 19でのみ使用可能なフック

(59)

See 送り仮名の入力.

(60)

専ら補完的に自動 送り処理を利用するのであれば、(skk-okuri-search)skk-search-prog-list の最後にもってくるのが良いであろう。

(61)

y-or-no-p はミニバッファを使用しているのではなく、エコー エリアにプロンプトを表示して次の1文字を待っている。yes-or-no-p は ミニバッファを使用している。

(62)

辞書の形式 を参照のこと。

(63)

某メーカーのMSDOS上の FEPの仕様を参考にした。

(64)

p125’ とい う見出し語であれば、その数値部分である ‘125’ が再変換の見出し語とな る。

(65)

または / 1 0 0 2 0 0 3 0 0 4 0 0 5 0 0 SPC

(66)

数字 を大文字で入力し始めるわけにはゆかないので ‘Q’ または ‘/’ で▽ モードに入る必要がある。

(67)

m’ や ‘d’ などアスキー文字を見出し語として入 力したい場合は ‘/’ キーを最初にタイプしSKK abbrev modeで入力する必 要がある。See SKK abbrev mode.

(68)

See L辞書.

(69)

See プログラム実行変換.

(70)

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

(71)

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

(72)

See 今日の日付の入力.

(73)

gadget’ は「上手く工夫した道具」の 意味。「色々飛び出す気のきいたおもちゃ箱」というような意味で名付けられた。 余談だが、X Windowで使用される ‘Widget’ という言葉は、 ‘window’+‘gadget’ から作られた造語らしい。

(74)

See 数値変換.

(75)

大文字でも小文字でも可。

(76)

See ▼モード.

(77)

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

(78)

See 個人辞書.

(79)

送りあり変換 では skk-okuri-ari-min + 1の位置、送りなし変換では skk-okuri-nasi-min + 1の位置がそれぞれミニマムポイントになる。

(80)

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

(81)

Mule側の機能 に依存する。

(82)

See ローマ字プレフィックス.

(83)

Emacs 18にはカーソル色の変更機能はない。また、 Emacs 19であっても、‘-nw’ オプションを指定してEmacsを起動した場合は、 この機能が使えない。

(84)

以前のバージョンではText Propertiesを使用していたが、egg.el, canna.el, wnn-egg.el を参考にしてOverlaysを使用するように変更した。Overlays は、テキストの一部ではないので、Overlaysのかかったテキストから文字を切り 出してもコピーの対象にならないし、アンドゥ時も無視されるので、変換された 候補の表示を一時的に変更するにはText Propertiesよりも好都合なためである。 Emacs 18ではOverlaysが実装されていない。

(85)

default’ 以外のface上で変換を行なっている場合は、変換によりfaceを ‘default’ に変更しても意味があろうが、通常はそのようなケースは稀であるので、 ‘default’ faceを利用することはまずないであろう。

(86)

この配色は私が日常使用しているお 気に入りのものである。少なくとも表現力乏しい私のノートパソコンの液晶では、 過激な配色でなくやわらかい色に見えるため、目の疲れも少ないので重宝してい るが、他の方のディスプレイ上ではどんな感じに映るのであろうか。ひょっとし て恐ろしく趣味の悪い色に見えているかと想像すると少し不安である。

(87)

Mule-2.3 に標 準添付のもの。なおVIP 3.5は、その後VIP 4に引き継がれ、いくつかのマイナー バージョンを経てVIP19, VIPERと発展している。Emacs 19に標準添付されている のはVIPERである。ちなみにVIP3.5の作者は、SKKの作者でもある佐藤雅彦 <masahiko@kuis.kyoto-u.ac.jp> であるが、VIPの後継バージョンはいずれ も別人によるものである。

(88)

本質的には、 mark 関数の仕様が Emacs 18と19とでは違うので、これに対応しさえす れば良いのだが、コードが簡略化できる個所には少し手を入れていている。なお、 VIPERではこれらの簡略化も含めて既に改良済みである。

(89)

See VIPER.

(90)

ディフォルトのキーバ インドは M-C-sM-C-r

(91)

Emacsのディフォルトでは、 ‘*scratch*’ バッファが lisp-interaction-mode になっている。

(92)

拡張子が違うので要注意。

(93)

中島の失敗談。MSDOSの改行コードであるCRLFに変換した SKK-JISYO.L を(CRLFになっていることを忘れて) makedbmdic に より処理したら、正常に処理できたかのように見えたが、生成された辞書のサイ ズが非常に小さくなった。このDBM化辞書は、pskkserv により検索でき なかったことは言うまでもない。

(94)

もちろん pskkserv のパスはご自分 のマシンに合ったものをご指定いただきたい。