ddskk 20170709.839(in MELPA)
Simple Kana to Kanji conversion program.

Software Design連載記事を掲載します。

株式会社技術評論社の許可を得て掲載しています。
草稿なので細かい部分は実際の記事とは異なることがあります。

  1. 2014/05 なぜEmacsをお勧めするのか?
  2. 2014/06 スマートにEmacsを始めるための小さいけど重要なコツ
  3. 2014/07 反復練習に勝るものなし -- 打鍵すべし!設定書くべし!

今回は ddskk についてです。
現在はMELPA入りしているので、M-x package-install ddskkでインストールできます。

SKKとは

 ども、Emacs廃人のるびきちです。Emacsの最大の恩恵とはなにか覚えていますか?そう、「 文字入力の一元化 」でしたね!つまり、文章の入力・編集をEmacsに一任すれば快適になるということです。それだけEmacsの編集能力はすごいものがあります。Emacsスキルが上がってくると、ブラウザのtextareaで文章を書いてた自分自身がバカらしくなってくるはずです。

 ではその第一歩として、Emacs上での日本語入力システムの1つ SKK を今回紹介します。SKKは Simple Kana to Kanji conversion program の略で、シンプルな操作性が持ち味です。筆者はEmacsを使うのと同時にSKKを使い始め、今でも手放せないツールとなっています。

 SKKでの日本語入力方法はやや特殊ですが、少し練習すればすぐに慣れます。優れたチュートリアルがついているので御安心ください。

単語変換+文節マニュアル指定

 SKKは 単語変換 がベースとなっています。「え、今更単語変換の日本語入力システム?」と思われるかもしれませんが、シンプルさを追求した結果、単語変換に行き付きました。一見非効率的に思いそうな入力方式ですが、入力効率は悪くはありません。単語変換だからこそ実現できることもあります。

 SKKの最大の特徴とも言えるのが「かなと漢字の境界を人間が指定すること」です。 文節の区切り はコンピュータではなくて人間が指定するのです。最近は日本語の解析を高精度で行えるようになったものの、通常の連文節変換では文節区切りミスはゼロにはできません。ひらがなだけでは文節の区切りが不明な例すらあります。有名な文が「ここではきものをぬいでください。」で、「ここでは着物を脱いでください。」とも「ここで履物を脱いでください。」とも変換できます。ひらがな文字列でこの文のみが与えられた場合、いかに精巧なアルゴリズムをもってしても、どちらの変換が正しいかは決定できないのです。これが日本語の宿命です。

 そして、連文節変換における文節区切りミスの修正はかなり面倒でイライラするものです。文節を判断するアルゴリズムは難しいです。それならいっそのこと文節は人間が指定すればいいじゃないかというのがSKKの結論です。「 単語変換+文節マニュアル指定 」こそがSKKであり、シンプルそのものです。面倒かもしれませんが、正しく入力する限り、文節区切りミスが根絶できるのは嬉しいものです。SKKを使っていて文節を間違ったとき、それは自分が入力を間違ったということなので自己責任です。ものすごい潔いスタンスです。

 SKKでは、かな→漢字、漢字→かなに移るときに大文字を使います。SKKモードのとき、普通にローマ字入力していればひらがなが入力されます。そして、漢字が登場したらその読みのローマ字の先頭文字を大文字にします。また、送り仮名が登場したときも先頭文字を大文字にします。たとえば「動く」は「UgoKu」と入力します。

スムーズな単語登録

 単語変換という一見時代遅れに思えるシステムですが、単語変換だからこそ実現できた機能が存在します。シンプルかつ強力な 単語登録 、そして 特殊変換 です。

 連文節変換での単語登録は面倒なものです。読み(見出し語)と漢字だけでなく、品詞情報まで登録する必要があるのですから。たとえばATOKの顔文字辞書の1エントリはこうなっています。[TAB]がタブ文字で、前後にスペースは入っていません。「独立語*」というのが品詞情報です。

ぱんち [TAB] o-_-)=○)゜O゜) [TAB] 独立語*

 SKKは文節区切りという日本語の一番難しい部分を人間に任せているため、品詞という概念は存在しません。淡々と見出し語を変換するだけです。あるのは、見出し語と変換候補のテーブルのみです。変換できない場合は、すぐに単語登録モードに入り、ユーザは変換後の文字列を入力するだけで単語登録が終わります。単語登録は入力を妨げるのではなく、呼吸をするように自然な流れになっています。

 言葉は生き物で、どんどん新語が登場してきます。アーチスト名、キャラクタ名などの 固有名詞 もどんどん増えてきます。アニメや漫画では長く難しい漢字名の必殺技だって登場してきますね。辞書のデータが古い場合、 新語 はもちろん登録されていないので、出てくるたびに単語登録することになります。連文節変換では品詞情報も指定する必要があるため、単語登録は面倒そのものです。SKKはあっさり単語登録が終わるので、新語の対応は簡単です。

 SKKの単語登録は再帰的に行われます。たとえば、「再帰」と「的」と「頭字語」のみが変換できる場合に「再帰的頭字語」に変換しようとします。そのとき、「さいきてきとうじご」はそのまま変換できないので、単語登録モードに入ります。そこで「再帰的」+「頭字語」で変換しようとしても、今度は「さいきてき」が変換できないので、再び単語登録モードに入ります。このとき、単語登録モードの中で単語登録モードに入りました。落ち着いて「再帰」+「的」で「さいきてき」を単語登録します。すると、「再帰的」が入力されている状態で「さいきてきとうじご」の単語登録モードに戻るので、「頭字語」と入力すれば「さいきてきとうじご」が単語登録されます。

 言葉で書くとすごい複雑そうですが、実際に 再帰的単語登録 をやってみればごくごく自然な流れだとわかります。品詞情報不要の単語変換だからこそスムーズにできるのです!

 SKKのラージ辞書はかなり多くの単語が含まれていますが、複合語はあまり含まれていません。複合語を変換しようとすると、しばしば単語登録モードに入ります。たとえばブログなどでよく使われる表現のひとつ「超絶便利」は入っていないので、そういう場合でも落ち着いて単語登録してください。

 複合語を登録しておくと、しばしばタイプ数が削減できます。なぜなら、入力中に見出し語補完する機能が備わっているからです。「超絶便利」と変換した後に「ちょ」と入力したら「ちょうぜつべんり」が見出し語候補に登ります。

特殊変換

 他にもアルファベットや記号を見出し語にして変換する機能が存在します。computer→コンピュータ、skk→Simple Kana to Kanji conversion programなどです。さらに、skkの変換を進めていくとSKKのバージョンが出てくるというおもしろい機能もあります。

 応用例として、特殊変換を 簡単なデータベース として使えます。たとえば、emacs→http://www.gnu.org/software/emacs/ のようにURLやメールアドレスを登録することも可能です。

 単語変換だからといって馬鹿にはできないでしょう?シンプルながらも多機能で柔軟的なのがSKKなのです。

 日本語入力については Google日本語入力 が有名ですね。Google日本語入力はGoogleの高性能サーバを使って膨大なデータから最適かつ正確な変換をしてくれます。もちろん連文節変換もできます。サーバ経由なので、自分で単語登録せずともすでに新語が登録されています。APIが提供されているので、SKKからGoogle日本語入力の機能を使うことすらできます。サーバ経由なので一見遅いようですが、もちろんキャッシュが用意されているので問題ありません。SKKなのに連文節変換もできてしまいます。シンプルなSKKだからこそ、両者の強味を共存させられるのです。

いろいろなSKK実装

 SKKはもともとEmacs Lispで実装されていますが、SKKファンはEmacsの外でもSKKを使いたくなるものです。そのため、いろいろな環境への移植版が作られています。Windows用の「SKK日本語入力FEP 」、Mac OS X用の「AquaSKK 」等です。

 現在のEmacs用SKKは ddskk (Daredevil SKK)です。SKKという名前ではとっくのとうに開発終了しており、ddskkという名前になって開発が続けられています。よって、Emacsの文脈でSKKといえば自動的にddskkとなるわけです。本稿でもSKK=ddskkと認識してください。

 SKKはEmacs Lispでのみで書かれているので、Emacsさえ動けばどのOSであっても同じ操作性で日本語入力できます。英語版のOSであっても、問題なく日本語入力できます。新しいコンピュータを使うときに、EmacsとSKKさえインストールしてしまえばいいのですから。複数のOSを使う人にとって、日本語入力システムを使い分ける必要がないのは、とても嬉しいことではないでしょうか。

インストール

 APT等のOSのパッケージシステムでddskkが存在するのであれば、そこからインストールしてください。Debian系列のGNU/Linuxでは「sudo apt-get install ddskk skkdic」でおしまいです。Emacs初心者がGNU/Linuxで使う場合ならば、これが無難です。その時点で初期設定は済んでいます。

 ddskkのアーカイブからインストールするのはちょっと手間がかかります。展開したら、まずdicディレクトリに移動し、辞書ファイルを http://openlab.ring.gr.jp/skk/skk/dic/SKK-JISYO.L からダウンロードして置いてください。その後makeします。もし、うまくいかない場合はSKK-CFGファイルを編集してください。

==
$ cd dic
$ wget http://openlab.ring.gr.jp/skk/skk/dic/SKK-JISYO.L
$ cd ..
$ make what-where
emacs -batch -q -no-site-file -l SKK-MK -f SKK-MK-what-where
Loading /home/rubikitch/emacs/ddskk-15.1/SKK-CFG...

SKK modules:
skk-viper, skk-jisx0213, ...略
-> /usr/local/share/emacs/24.3/site-lisp/skk

SKK tutorials:
SKK.tut, SKK.tut.E, NICOLA-SKK.tut, skk.xpm
-> /usr/local/share/skk
$ make install
==

 WindowsではREADMEs/README.w32.jaを参照してください。

 そして、以下の初期設定をすれば使えます。~/.emacs.d/init.elに書き加えてEmacsを再起動してください。

 Lispファイルの検索パスであるload-pathの設定は重要です。SKKをmakeでインストールした場合は、SKK用のLispディレクトリが作成されるので、load-pathに加えておく必要があります。さもなければskkを読み込んでくれません。

 C-x C-jを押すとSKKモードになります。もしC-x C-jにdired-jumpが割り当てられている場合は、(require 'dired-x)をglobal-set-keyの「前に」書いてください。dired-xをロードした時点でC-x C-jにdired-jumpが割り当てられてしまうので、改めてglobal-set-keyでskk-modeに再割り当てするためです。

==
;; make what-whereでSKK modulesで表示されるディレクトリを指定
(add-to-list 'load-path "/usr/local/share/emacs/24.3/site-lisp/skk")
;; M-x skk-tutorialでNo file found as 〜とエラーが出たときにskk-tut-fileを設定
;; make what-whereでSKK tutorialsで表示されるディレクトリ上のSKK.tutを指定
(setq skk-tut-file "/usr/share/skk/SKK.tut")
(require 'skk)
(global-set-key "\C-x\C-j" 'skk-mode)
==

チュートリアルから始めよう

 SKKには優れた チュートリアル があります。そのため、実際のSKKでの入力方法については本稿では触れません。初めてSKKを使うときは、チュートリアルに従って手を動かして覚えていってください。チュートリアルは M-x skk-tutorial で実行できます。

 チュートリアルで十分すぎるほどの情報量なので、日常的な日本語入力は一部の機能を使えば十分間に合います。無理に全部覚える必要はありません。ゆっくりでいいです。

拡張ローマ字入力AZIK

 ここからはSKKの応用設定の話です。

 現在の日本語入力方法の主流は当然 ローマ字入力 ですね。しかし、ローマ字入力というのは非効率的な入力方法なのです。ひらがな1文字入力するのに、ほぼ2ストローク必要になるのはかなり多くの打鍵数が必要といえます。おまけに漢字変換する必要があり、正しく変換されたかどうかを目視で確認する必要があります。

 少しでも入力効率を上げるにはどうすればよいのでしょうか?

漢直入力は…

 その問題を解決する方法として 漢直入力 があります。漢直入力というのは、漢字変換なしで、直接漢字を入力する入力方式です。2ストロークの組み合わせに1文字を割り当てています。たとえば、 T-Code で使われるキーは40種類程度なので、2ストロークでは40×40で1600通りになります。その1600個それぞれに文字を割り当てれば、2ストロークで漢字やかなを直接入力できるのです。

 しかし漢直入力というのは、1文字1文字ストロークを覚える必要があるという重大なデメリットがあります。あなたが小中学生で漢字を1文字覚えるついでに漢直入力のストロークを覚えられればいいのですが、残念ながら日本の教育はそうなっていません。大人になってから覚えるのはとてもつらいもので、漢直入力に挑戦するも挫折した人はたくさんいます。脳科学的に、人間は14歳を過ぎれば丸暗記がしにくくなっているからです。

 このように新たな入力方式を習得するには、習得コストが問題になります。漢直入力はローマ字入力といういつもの習慣を捨て去る必要がある上に、せめてよく使う文字のストロークを覚えるまでは実用になりません。それでは日常業務に差支えてしまいますね。「T-Codeを覚えるために3ヶ月間仕事を休ませてください」なんて通るはずがありません。

ローコスト・ハイリターンのAZIK!

 大人にとっては漢直入力は現実的な入力方式ではありません。かといってローマ字入力の非効率さはなんとかしたいものです。そこで、「 ローマ字入力改 」というべき AZIK という入力方式が考案されました。AZIKならばローマ字入力がベースなので、無意識で行っているローマ字入力という資産を捨てる必要はありません。

 AZIKでの入力方法がわからないAZIK初心者であっても、ほとんどのケースで従来のローマ字入力が使えます。よって、AZIKは日常業務に影響することなく、段階的に習得できるのです。筆者もAZIKを愛用しています。

 AZIKは実用的なアプローチをとっています。日本語の音韻を研究し、よくあるパターンの入力を簡潔化しています。既存の入力方式は…ローマ字入力もかな入力も漢直入力も…日本語という言語そのものの特性を考えているわけではありません。AZIKは日本語の文章を効率よく入力できるように、ローマ字→かな変換テーブルを拡張しています。

 AZIKでは主に表1のように入力します。「っ」と「ー」が劇的に打ちやすくなったのは特筆すべき点です。これだけでもAZIKを習得する価値はあります。

 母音+は、日本語のパターンから頻出のものを入力しやすくするための拡張です。たとえば母音+aというのは「か」などで、「かん」は「kz」で入力できるようになります。実際にやってみればわかりますが、これらは指の動きを少しずらすだけで効率的に入力できます。慣れないうちは「ん=q」を使って「kaq」と入力してもよいです。

表1:AZIKでの入力方法

入力対象 キー 備考
q skk-azikでは@でかなカナ切り替え
; なんとホームポジションに!
: わざわざ小指を上に動かす必要なし!
しゃ xa しゅ、しょも同様
ちゃ ca ちゅ、ちょも同様
lwa skk-azikではxwa
la skk-azikではxxa
lya skk-azikではxya
母音+aん z aの下
母音+iん k iの下
母音+uん j uの下
母音+eん d eの下
母音+oん l oの下
母音+aい q aの上隣り
母音+uう h uの斜め下隣り
母音+eい w eの左隣り
母音+oう p oの右隣り

 他にも互換キーや特殊拡張もありますが、まずは上の基本をしっかりマスターした上でゆっくりと覚えればよいです。実は筆者も全部は覚えきれてはいません。詳細は http://hp.vector.co.jp/authors/VA002116/azik/azikinfo.htm を参照してください。

skk-azikを使う

 SKKでもAZIKに対応しています。以下の1行を ~/.skk に加えるだけです。

 なお ~/.skk はSKKローカルの設定ファイルで、 M-x skk-restart を実行すれば再読み込みされます。それ以外は ~/.emacs.d/init.el との違いはありません。

==
(setq skk-use-azik t)
==

 SKKではローマ字に出てこないqやlをモードの切り替えに使っていますが、AZIKではこれらの文字も使っています。よって、SKKのAZIK拡張では一部異なる操作となっています。

小指を守ろう

 SKKではかな漢字の区切りには大文字を使います。実際に使っていくとわかりますが、SKKを使い続けていくとShiftを押す小指が疲れてしまいます。残念ながらそれがSKKの大きな欠点です。

 でも御安心ください。Shiftを使わずにかな漢字の区切りを指定する方法があるのです。~/.skkにて変数 skk-sticky-key に区切りキーを設定すれば、 Shiftを使わずに 快適にSKKが使えるようになります。変換キーや無変換キーは親指で押せるのでおすすめです。たとえば「動く」は「UgoKu」ではなく「[無変換]ugo[無変換]ku」で入力できます。

==
;; Windows 環境だと [noconvert]
(setq skk-sticky-key [muhenkan])
==

 muhenkanなどのキー名はどうやって取得するのかというと、 <f1> c を使います。その後に無変換キーを押せば「<muhenkan> is undefined」と出てきます。

一緒にEmacs力を高めませんか?

 筆者は毎週土曜日にEmacsのメルマガを発行しています。多くの解説ではその機能の説明に終始しており具体例に乏しいため、理解するのにとても時間がかかる上、今の自分に必要なのかどうかを見極めることも難しいです。メルマガではチュートリアル形式で手を動かして学ぶ形式になっているので、たった5分でその内容を習得できるようになっています。わかりにくい資料で長時間悪戦苦闘するか、月々527円で時間差を買うかはあなた次第です。無制限メール相談権も付けています。初月無料なので安心して登録してください。http://rubikitch.com/juku/ Happy Emacsing!


Warning: array_intersect(): Argument #2 is not an array in /home/sagiboku/rubikitch.com/public_html/emacs/inc-package-relate.php on line 623

本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。