※この記事は漢直アドベントカレンダー 2025 の14日目の記事になります。
はじめに
今回からMozc(Google日本語入力)を利用したT-Codeの入力環境の構築方法ということで, 紹介していこうと思います。
今回の内容はローマ字変換テーブルをカスタマイズしてT-Codeの入力を実現しようというものです。
といってもT-Codeを実現するローマ字変換テーブルはgithubのkanchoku/mozc-tcode-tableとかMozc で(だいたい) T-Code風入力とかで実物のローマ字変換テーブルが既にあったり,方法が紹介されたりしています。
しかし,T-Codeのコード表をいじるのは それぞれの環境専用の設定ファイルではなかなか難しいものがあります。
そこで,今回はtcode.stファイルと簡単なキーの設定ファイルからローマ字変換テーブルファイルを出力してみようという試みになります。
tcode.st
tcode.stファイルは前回紹介したように,木を見て森を見るストローク表をそのままテキストファイルにした形式です。次のようなファイルです。
LL * * * * * * * * * * * * * * * * * * * * * * * * * ヮヰヱヵヶ 丑臼宴縁曳 鬼虚狭脅驚 孤誇黄后耕 奉某貌卜* ゎゐゑ* * 於汚乙穏* 奇既菊却享 巧克懇困昏 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ヲ哀暇啓把 ゥ逢牙掲伐 ヴ宛壊携避 ヂ囲較劇卑 ヅ庵寒賢藩 果告策首農 概買詳由死 武残両在! 風階能論増 細古利ペゃ 報紙館夜位 音王放々応 案曲情引職 横興刺側覚 崎白ぐ官球 欠夏彼妻善 財針裏居差 従骨厚顔量 適類御宇推 母奥因酒伸 ぱ慰我兼菱 ぴ為掛嫌紐 ぷ陰敢顕描 ぺ隠甘牽憤 ぽ胃患厳弊 収際太園船 若雄査ふ賞 指氏丸続ェ ぎ格次習火 思術広門聞 種岡結進真 宅熟待取科 料土活ね参 受予切育池 英ボ加室少 ヒ江別考権 及久蔵早造 投義算半県 込沢軍青清 転空性使級 ぁ* 瓦* * ぃ* * * * ぅ* * * * ぇ* * * * ぉ* * * * 徳渡守登退 械刊訪融雨 帝始了極熱 読鈴恐督況 族丁未才返 件友卒初慣 宮伊求技写 局頭配黒院 向府富直倉 割ぶ番望元 ヨ誤証含% 判規感値ギ 済吉ゆ器照 説週号葉派 休省央福毎 LR * * * * * * * * * * * * * * * * * * * * * * * * * 湖礼著移郷 端飾郵塩群 刷寿順危砂 震扱片札乞 弘痛票訴遺 償欧努底亜 紅傷豪維脱 舗充喫腕暴 輪倒操柄魚 則存倍牛釈 禁硝樹句礎 絹被源願臨 批慶渉竜併 就駐揮丹鮮 綱潟創背皮 簡徴触宗植 承章候途複 快否歯筆里 包納頼逃寝 唱暮憲勉罪 害賃整軽評 撃折追隊角 浴秀糸春幸 積程断低減 故鉱提児敷 服声任検豊 変審改昇芸 限研労統役 逆企精ざ印 令違装然確 爆仲茶率比 陽構旅施曜 ァ導認健尾 殺負何履般 券悪秋非便 朱遅甲致汎 陣鶴鹿貨絡 眼繁誌招季 執紹夢卸阿 岳刑弱雲窓 病終起路越 常張薬防得 寺質づ港条 停領容玉右 河置供試席 勢必講愛管 輸形助* 流 基好味宝争 足草築観言 婦段衛額渋 素兵専親寮 毛永申袋良 等浅頃落命 板客師税飛 伝庭課着坂 欲巣茂述朗 迫災恋脳老 留列刻豆看 替沼? 辞献 還更占箱矢 帰庁昨跡ゲ 監寄裁達芝 竹注介具失 ゅ修究答養 志抜航層深 億録赤想消 色貸販編仕 左態花栄ザ ぬ展警型誰 根様独止堂 図挙険ゼ波 之末ぼ街免 州払乗庫状 例満津準遊 字材過諸単 RL * * * * * * * * * * * * * * * * * * * * * * * * * 請境系探象 尚賀岸責漁 舎喜幹丘糖 布苦圧恵固 姿絶密秘押 盛革突温捕 益援周域荒 康徒景処ぜ 邦舞雑漢緊 衆節杉肉除 依繊借須訳 織父枚乱香 譲ヘ模降走 激干彦均又 測血散笑弁 酸昼炭稲湯 貿捜異隣旧 攻焼闘奈夕 盤帯易速拡 汽換延雪互 歩回務島開 キせ区百木 や出タ手保 コ山者発立 ナ金マ和女 給員ど代レ 分よル千ア 7か( トれ きっ日国二 上く8え年 相家的対歴 付プばュ作 内工八テ見 九名川機チ サ建パ第入 桜瀬鳥催障 典博筋忠乳 採謡希仏察 君純副盟標 犯余堀肩療 中スもお定 わラ東生ろ う4) 十リ あこ6学月 本さら高シ 3と〇てる ーした一が い、の51 。* 0・2 ではになを ッ人三京ち ロク万方フ んまンつ四 けイす電地 業時「長み 呼幅歓功盗 紀破郡抗幡 房績識属衣 去疑ぢ綿離 秒範核影麻 店持町所ほ 全じ自議明 バ部六経動 後間場ニ産 問ム七住北 行ド円小ジ 通カ社野同 だり—め大 新」9子五 事田会前そ 海道ず西げ 当理メウグ 不合面政オ 委化ビ目市 気売下都株 RR * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 星析遷宣 庶粧丈称蒸 * 乃如尼帳 欄龍略慮累 * * * * * 鼠曹奏尊* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 索射濁慢 * 冊需詑迷 * 皿輯蓄戻 * 賛瞬貯羊 * * 盾虫* 佐法数郎談 接備最急験 記朝知ワ送 モ資士費ィ 無石屋解募 美題井洋実 宿制集安画 セ運ツ特谷 神び打勤ャ 優公品語演 昔短岩巨敗 遠ォ将ぞ塚 序振練念働 耳授版効視 示即難普辺 * 衰滋沈己 * 趨湿添已 * 垂甚徹巳 * 粋* 爪巴 * 寸瞳陶* む南原駅物 ケ式戦関男 話座線ダ橋 べ民ソ点遇 期ゾ歳強係 要設水藤有 連鉄教力ベ デ現エ他度 車成天世文 主映書可へ ホ共ブ平楽 私ゴ来信午 村ガ製校ご ノ完重約各 近外米ョ光 * * * * * * * * * * * * * * * * * * * * * * * * * 洗羽個医静 響忘討史環 司迎華許補 復並浦ユ冷 担陸巻競護 支協用表正 先多商ハ交 調混ポ決ミ 組選党択体 銀以ヌ営治 ヤ心界意今 再ネ~口台 団計夫食総 戸ひょ価与 身ピ勝反ズ
前回とは違い,未定義のところが*になっています。
まぁ大人の事情というか,Emacsのtc.elから吐き出したものではないかと
思っていますが,今ではよく分かっていません。
このファイルから40×40の文字の行列として読み込んでみたいと思います。
この日記を見ていると分かる通り,私はJulia言語をよく利用しています。
Julia言語は数学方面には強いですが,文字列処理はあまり得意ではありません。 それには理由があって,文字列の部分書き込みがないことが挙げられます。
そのため,文字列を加工する時には一々文字列を生成する必要があり, メモリの確保等に時間がかかる傾向にあります。
ところが,テキストファイルを一括で読み込んで部分抽出をするという処理の場合は, 大きな文字列の一部分を参照するような形で文字列として扱えるようになっていて, むしろ,他のプログラミング言語よりも速いこともあります。 この言語を使って色々やっていきたいと思います。
function read_tcode_st(tcode_st, escape="*") 文字列として読み込み(x) = read(x, String) 空白削除(x) = replace(x, " " => "") str_lines = tcode_st |> 文字列として読み込み |> 空白削除 |> split str_ar = ["LL", "LR", "RL", "RR"] lr_idx0 = [findfirst(isequal(x), str_lines) for x in str_ar] res = Matrix{String}(undef, 40, 40) tmp_dic = Dict() for t in 1:4 tmp_dic[str_ar[t]] = Matrix{String}(undef, 16, 25) for k in 1:16 _strs = replace.(split(str_lines[lr_idx0[t] + k], ""), escape => "") tmp_dic[str_ar[t]][k, 1:25] .= _strs end end c1, c2 = repeat(1:5, 5), repeat(1:5, inner=5) r1, r2 = repeat(0:10:30, 4), repeat(0:10:30, inner=4) for (tbl_key, r_shift, c_shift) in zip( ("LL", "LR", "RL", "RR"), (0, 5, 0, 5), (0, 0, 5, 5)) for r in eachindex(r1) for k in eachindex(c1) res[r2[r] + c2[k] + r_shift, r1[r]+c1[k] + c_shift] = tmp_dic[tbl_key][r, k] end end end res end
次のような感じで実行すると,40×40の文字の行列として読み込んでいることが確認できます。ここでは未定義は空文字列""で表しています。
julia> mtx = MozcTcode.read_tcode_st("tcode.st")
40×40 Matrix{String}:
"" "" "" "" "" "" … "" "依" "繊" "借" "須" "訳"
"" "" "" "" "" "" "" "織" "父" "枚" "乱" "香"
"" "" "" "" "" "" "" "譲" "ヘ" "模" "降" "走"
"" "" "" "" "" "" "" "激" "干" "彦" "均" "又"
"" "" "" "" "" "" "" "測" "血" "散" "笑" "弁"
"" "" "" "" "" "" … "礎" "" "" "" "" ""
"" "" "" "" "" "" "臨" "" "" "" "" ""
"" "" "" "" "" "" "併" "" "" "" "" ""
"" "" "" "" "" "" "鮮" "" "" "" "" ""
"" "" "" "" "" "" "皮" "" "" "" "" ""
"ヲ" "哀" "暇" "啓" "把" "酸" … "善" "相" "家" "的" "対" "歴"
"ゥ" "逢" "牙" "掲" "伐" "貿" "差" "付" "プ" "ば" "ュ" "作"
"ヴ" "宛" "壊" "携" "避" "攻" "量" "内" "工" "八" "テ" "見"
"ヂ" "囲" "較" "劇" "卑" "盤" "推" "九" "名" "川" "機" "チ"
"ヅ" "庵" "寒" "賢" "藩" "汽" "伸" "サ" "建" "パ" "第" "入"
"簡" "徴" "触" "宗" "植" "" … "比" "昔" "短" "岩" "巨" "敗"
⋮ ⋮ ⋱ ⋮
"ぽ" "胃" "患" "厳" "弊" "犯" "級" "業" "時" "「" "長" "み"
"朱" "遅" "甲" "致" "汎" "" … "寮" "ホ" "共" "ブ" "平" "楽"
"陣" "鶴" "鹿" "貨" "絡" "" "良" "私" "ゴ" "来" "信" "午"
"眼" "繁" "誌" "招" "季" "" "命" "村" "ガ" "製" "校" "ご"
"執" "紹" "夢" "卸" "阿" "" "飛" "ノ" "完" "重" "約" "各"
"岳" "刑" "弱" "雲" "窓" "" "坂" "近" "外" "米" "ョ" "光"
"ぁ" "" "瓦" "" "" "呼" … "%" "海" "道" "ず" "西" "げ"
"ぃ" "" "" "" "" "紀" "ギ" "当" "理" "メ" "ウ" "グ"
"ぅ" "" "" "" "" "房" "照" "不" "合" "面" "政" "オ"
"ぇ" "" "" "" "" "去" "派" "委" "化" "ビ" "目" "市"
"ぉ" "" "" "" "" "秒" "毎" "気" "売" "下" "都" "株"
"欲" "巣" "茂" "述" "朗" "" … "波" "ヤ" "心" "界" "意" "今"
"迫" "災" "恋" "脳" "老" "" "免" "再" "ネ" "~" "口" "台"
"留" "列" "刻" "豆" "看" "" "状" "団" "計" "夫" "食" "総"
"替" "沼" "?" "辞" "献" "" "遊" "戸" "ひ" "ょ" "価" "与"
"還" "更" "占" "箱" "矢" "" "単" "身" "ピ" "勝" "反" "ズ"
julia>
キーボード配列設定とその読み込み
次にキーの設定ファイルを定義します。
面倒なので,tcode.stチックにします。
Qwertyの場合は次のような感じにします。
12345 67890 qwert yuiop asdfg hjkl; zxcvb nm,./
スペースは無視してキーボードのそのまま押した時の文字を そのまま書いておく感じです。
これを読み込む関数は次のような感じで実装できます。
function read_key_tbl(key_file) 空白削除(x) = replace(x, " " => "") 分割(x) = split(x, "") vcat((key_file |> readlines .|> 空白削除 .|> 分割)...) end
はい。何かよく分かりませんが,これでいけるはずです。 多分。次のが実行例です。
julia> key_ar = MozcTcode.read_key_tbl("key-qwerty.txt")
40-element Vector{SubString{String}}:
"1"
"2"
"3"
"4"
"5"
"6"
"7"
"8"
"9"
"0"
"q"
"w"
"e"
"r"
"t"
"y"
⋮
"g"
"h"
"j"
"k"
"l"
";"
"z"
"x"
"c"
"v"
"b"
"n"
"m"
","
"."
"/"
julia>
キーが左上から右下に…という感じで40個登録されています。
ローマ字変換テーブルの作成
ローマ字変換テーブルを出力するには,キーストローク列[タブ文字]出力文字
という感じの一行として順にテキストファイルとして出力する感じです。
上の二つの関数を利用して次のように実装します。
function make_tcode_mozc_table(key_file, tcode_st, escape="*") key_tbl = read_key_tbl(key_file) tcode_tbl = read_tcode_st(tcode_st, escape) res = [] for k in 1:40, j in 1:40 if length(tcode_tbl[j, k]) > 0 push!(res, key_tbl[k] * key_tbl[j] * "\t" * tcode_tbl[j, k]) end end sort!(res) res end
上記を実行すると,ローマ字変換テーブルとなる文字列の配列が出力されます。
julia> roman_tbl = MozcTcode.make_tcode_mozc_table("key-qwerty.txt", "tcode.st")
1353-element Vector{Any}:
",,\t夫"
",.\tょ"
",/\t勝"
",1\t借"
",2\t枚"
",3\t模"
",4\t彦"
",5\t散"
",;\t米"
",a\t三"
",b\t下"
",c\t面"
",d\tン"
",e\t八"
",f\tす"
",g\t「"
⋮
"zk\t等"
"zl\t板"
"zm\t之"
"zn\t図"
"zo\t殺"
"zp\t券"
"zq\t欠"
"zr\t適"
"zs\t及"
"zt\t母"
"zu\t陽"
"zv\t説"
"zw\t財"
"zx\t判"
"zy\t爆"
"zz\tヨ"
これをファイルに出力すると,ローマ字変換テーブルの完成です。
open("tcode_roman_table.txt", "w") do io for s in roman_tbl println(io, s) end end
ぐらいでローマ字変換テーブルが作成されるかと思います。
使用例
Mozcを利用したT-Codeの入力例として,以前紹介した動画を例として次に示します。
どんな感じで入力できるかの雰囲気が分かっていただけるかと思います。
変換していないのに漢字が入力されていっている変な感じの利用感になっています。ひらがな入力モードのままシフトを押しながら英字キーを押すと大文字の半角英字が入力できるようになって,Enterで確定を押すまでは英数入力モードになります。そこでEnterで確定するとまたひらがな入力モードに戻するので,この辺を使い分けるとかなり英字とはシームレスにモード切替が可能です。この点は他の漢直入力環境にはない感じです。
また,数字の連続はそのまま入力が可能なことも,他の漢直入力環境にはないものと思います。
さいごに
今回はJulia言語を利用してtcode.stからMozcのローマ字変換テーブルを作成する方法について説明しました。
もちろん,RubyやPythonを使うともっと簡単に変換ができると思います。
今回はこれぐらいで終わろうかと思います。
それではまた。