すのものの「Tコード関連プログラム」

tmk.c は、 Tコードでの入力も可能な関数を二つ提供します。 tmk.h, tcode_jf.tbl, tcode_fj.tbl は tmk.c に #include されるファイルです。

今のところ MS-DOS 専用です。 このページの最後にある二種類のお試し用 main 関数と合わせて、 Borland C++ 3.1, LSI C-86 3.30 で動作を確認しました。

提供される関数

関数 unsigned char mygetch(void) は、 キーボードから一文字を取得します。 エコーはしません。 Tコードなどのモードにはいらなければ、 getch() のようにふるまうと思います。

関数 int mygets(char* buf, int len, int tabstop) は、 エコーつきでキーボードからの一行の入力をバッファ buf に格納します。 \n は格納されません。 入力の長さが(\0 もこめて)len を越えると行の途中でも return します。 よって、バッファの大きさは len だけあれば十分です。 タブは tabstop カラムおきに展開されます。 これらの点を除けば、Tコードなどのモードにはいらない限り、 gets() のようにふるまうと思います。

mygets() はラインエディタに組み込んで、mygetch() は少々手を加えた上でスクリーンエディタに取り込んで使うことを想定しています。

使い方

これらの関数には、「モード1」「モード2」の二つのモードがあります。 「モード1」は ascii 文字(半角文字) を入力するかTコードによって(いわゆる)日本語(全角文字) を入力するかを決めるもので、 「ascii」「Tコード」のどちらかをとります。 「モード2」はアルファベット入力の際のキー配列を決めるもので、 「Qwerty」「Dvorak」のどちらかをとります。 二つのモードそれぞれに二つの状態があるので、 全部で四つのモードがあることになります。

「:」(セミコロン)を打つとモード変更モードにはいります。 画面は全く変わりません。 次に打つキーで、モード変更を行ないます。

上にないキーが打たれた場合は 「:」そのものが入力されたとみなされます。 これについては後述します。

いまはいっているモードにモードを変更しても、 何ら差しつかえありません。 マルチストローク入力であるTコードモードのとき、 一つの文字を入力する途中でモードをTコードに変更すると、 そこまでのキーストロークは捨てられます。 これについては後述します。

ソースファイルを変更すれば、 モード変更のキーをセミコロン以外に変えることも簡単です。

ascii モード

Qwerty モードであれば、そのままが入力されます。

Dvorak モードであれば、Dvorak 配列での入力とみなされます。 ただし、アルファベットを含む十個のキー×3段が次のように変わるだけで、 ほかのキーは変わりません。 記号などはキーの刻印を見て打つことが多いと思われるためです。

?
/
<
,
>
.
P Y F G C R L
.
.
A O E U I D H T N S
+
;
Q J K X B M W V Z
.... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ..

普通にキーを取得してそれを変換するだけですので、 元々のキーの配置によっては上のようにならないかも知れません。

Qwerty 配列と Dvorak 配列とでアルファベットキーの位置が違うため、 Caps Lock キーはうまく働きません。

Qwerty モードでも Dvorak モードでも、 モード変更のキーであるセミコロン「:」は例外で、 その次に「A」「a」「T」「t」「Q」「q」「D」「d」以外のキーを押して初めて 「:」が入力されます。 「:」を二度押して入力するのが最も簡単でしょう。

Tコードモード

Tコードにより、いわゆる日本語を入力することができます。 Tコードについては、(とりあえずは) すのものの「Tコードについて」 をご覧ください。

第1ストロークでも第2ストロークでも、 セミコロン「:」を打てばモード変更モードにはいります。 第2ストロークでモード変更を行なった場合、 第1ストロークは捨てられます。 第2ストロークでキー「:」を打ったものの モード変更を行なわなかった場合、 第2ストロークは「:」とみなされますので、 (現在のバージョンでは)エラーとなって「●」が入力されます。

後述の“合成”などを利用していると、 どこまでキーを打ったかわからなくなる場合があります。 そんなときはモードを改めてTコードに変更して、 そこまでの入力キーをキャンセルするといいと思います。

第1ストロークでも第2ストロークでも、コントロールコードが入力できます。 第2ストロークでコントロールコードを入力した場合、 第1ストロークは捨てられます。

オリジナルのTコードから、 岩瀬順一氏が山田研でTコードの練習をさせてもらったときに聞いた話を元に、 少しだけ拡張をしています。

以下、 [f] のようにアルファベットを大カッコの中に書いたものはそのキーを打つことを指します。 [知] のように全角文字を大カッコの中に書いたものは、 Tコードでその文字を入力するためのキーの組み合わせを打つことを指します。 [ ] はスペースバーを打つことを指します。

(0) 全角アルファベットなどの入力

第2ストロークがスペースバーの場合、 第1ストロークのキーを全角文字にしたものが入力されます。 よって、スペースバーを二度打てば全角スペースが入力されます。 アルファベットなどのキー配列は Qwerty モードか Dvorak モードかで決まります。 全角のセミコロン「:」を入力する際は [:][:][ ]と打ちます。 (2つめの [:] はモード変更に使われないキーならなんでもかまいません。)

(1) 全角文字二つから「合成」で一文字を入力

「j」「f」に続いてTコードで二文字を入力した場合、 ファイル tcode_jf.tbl に従って、 その二文字から「合成」された一文字が入力されます。

例:ファイル tcode_jf.tbl に「"智" "知日"」なる行があったとします。 [j][f][知][日] と入力すると「智」の字が入力されます。

上の例のように漢字の成分を合成してTコード表にない文字を入力することが多いので 「合成」と呼びましたが、ファイル tcode_jf.tbl に従うだけですので、 必ずしも合成とは限りません。 先頭から検索してゆくだけですので、 重複があれば先のものが優先されます。 ファイル tcode_jf.tbl はコンパイル時に tmk.c に #include されます。 実行時には必要ありません。 表にない組み合わせを打った場合は「〓」が入力されます。

(2) 簡易かな漢字変換で一文字を入力

[f][j] と打つと
| 
が画面に現れます。 続いて入力したい漢字の読みをTコードで入力すると
|たい 
のようになります。 ここでスペースバーを押すと読みは消え、
【堆耐岱怠戴 泰滞胎腿苔》
のように候補漢字(の一部)が出ます。 これら十個の漢字は ホームポジションのキー [a][s][d][f][g] [h][j][k][l][;] で選択することで入力できます。 左端の「【」は、これより前には候補漢字がないことを示しています。 右端の「》」は、これより後にも候補漢字があることを示しています。 次の十個の候補漢字に移るにはキー [i] を押します。 すると
《逮黛鯛・・ ・・・・・】
のようになります。 左端の「《」は、これより前にも候補漢字があることを示しています。 右端の「】」は、これより後には候補漢字がないことを示しています。 「・」はそこには候補漢字がないことを示しています。 前の十個の候補漢字に移るにはキー [e] を押します。

どの候補も選ばずにやめるにはスペースバーを押します。

読みに対応する候補漢字がひとつもない場合は読みが消えて [f][j] を押す前の状態に戻ります。

読みの入力の際には BackSpace キーで最後に入力した一文字を消すことができます。 「|」だけが表示された状態で BackSpace を押すと、 [f][j] を押す前の状態に戻ります。

読みの入力の際には、 BackSpace 以外のコントロールコードは入力できません。

上では「読み」と説明しましたが、 ファイル tcode_fj.tbl を先頭から検索しているだけですので、 読みとは無関係なものから入力することも可能です。 このファイルは「"ふ 埠冨怖扶斧浮符腐膚芙譜賦赴阜附."」 のような文字列からなっています。 読みと候補漢字の間はスペースで区切り、 候補漢字の最後にはピリオドをつけます。 先頭から検索してゆくだけですので、 重複があれば先のものが優先されます。 ファイル tcode_fj.tbl はコンパイル時に tmk.c に #include されます。 実行時には必要ありません。

注意

上の (1) と (2) でユーザが入力する文字には、Tコードで入力できるものはもちろん、 (0) で入力できる全角アルファベットなどが使えます。 例えば、[j][f][<][<]で「《」が入力できるようにできます。 (「<」は全角の不等号です。)

上の (1) と (2) は、適当に組み合わせて再帰ができます。

例1. ファイル tcode_jf.tbl に 「"林" "木木"」と「"森" "木林"」があったとき、 [j][f][木][j][f][木][木] で「森」が入力できます。 「"林" "木木"」と「"森" "林木"」があれば [j][f][j][f][木][木][木] で「森」が入力できます。

実際には [j][f][3][木] などで 「森」が入力できるようにしておくほうがよいでしょう。 (「3」は全角文字です。半角文字との“合成”はできません。)

例2. ファイル tcode_jf.tbl に 「"森" "木林"」があったとき、 [j][f][木][f][j][りん][ ][d] で「森」が入力できます。 (「d」は「りん」と読む漢字の中から「林」を選ぶのに使ったキーです。)

例3. ファイル tcode_jf.tbl に「"鍵" "金建"」、 ファイル tcode_fj.tbl に「"鍵括弧 『』."」とあったとき、 [f][j][j][f][金][建][f][j][か][つ][ ][d][f][j][こ][ ][g][ ][a] と打つと「『」が入力できます。 (「d」は「かつ」と読む漢字の中から「括」を選ぶのに使ったキー、 「g」は「こ」と読む漢字の中から「弧」を選ぶのに使ったキー、 「a」は「鍵括弧」と“読む”“漢字”の中から「『」を選ぶのに使ったキーです。)

実際には [j][f][2][「] か [j][f][「][「] で「『」が入力できるようにしておくほうがよいでしょう。

ファイル tcode_jf.tbl と tcode_fj.tbl は、 ずっと前に作った自作 FEP てふてふ のソースファイルに基づいたもので、 その後はずっと検討をサボっています。 よって、“とりあえず”のものとお考えください。

お試し用 main 関数

どちらか片方を main.c というファイルにし、 「bcc tmk.c main.c」「lcc tmk.c main.c」 などとしてコンパイル・リンクしてください。

== main.c =====================================================================
#include <stdio.h>
#include "tmk.h"

#define CTRL_C '\x03'

int main() {
    int c;

    printf("CTRL+C で終了します.\n");
    while ((c = mygetch()) != CTRL_C) {
        putchar(c);
    }
    return 0;
}
===============================================================================
== main.c =====================================================================
#include <stdio.h>
#include "tmk.h"

#define BUFSIZE 4098

char buf[BUFSIZE];

int main() {
    int len;

    printf("終了するには行頭で CTRL+Z を押してください.\n");
    while ((len = mygets(buf, BUFSIZE, 8)) >= 0) {
        if (len < BUFSIZE - 1) {
            puts(buf);
        } else {
            printf("input too long.\n");
        }
    }
    return 0;
}
===============================================================================

本プログラムによる入力時のモード切り替えなどは、 ずっと前に作った自作 FEP てふてふ にならったものである。


すのもの Sunomono 2001-09-29 (6) 02:15:44 +0900