ujimushi(@旧sradjp(15364))の日記

旧スラドの日記の引越先です

EmacsでのT-Code(3) 補完パッケージ(tc-ac-complete)の紹介

はじめに

自分が利用しているtc.elを利用して実現している独自の補完環境, tc-ac-completeについて紹介します。

仕組み

実は,tc.elには元々補完の機能が実装されていました。

しかし,バグか何か分からないのですが,動作するところは私は見たことがありません。

そして,15年前当時,Emacsではauto-complete.elによる補完がよく利用されていて, tc.elに付属のtc-complete.elの変換関数だけを利用して,auto-complete.elのインターフェースを利用して, 補完しようとしたものになります。

ただ,auto-complete.elも既にちゃんとメンテナンスされているとはいい難い状態であり, ここで紹介する内容もいつまで役に立つかは分からないといった状態です。

セットアップ方法

tc-ac-complete.elの配置

githubのtc-ac-completeからtc-ac-complete.elをダウンロードします。

次に,load-pathの通っているフォルダにこのファイルを配置します。

20日目の記事の設定ファイルだと, ~/.emacs.d/site-lisp/フォルダに配置すると有効になるかと思います。

そして,auto-completeパッケージをインストールします。

M-x package-installを使ってもいいですし, 20日目の記事の方式だと, Markdown-modetcをインストールするように設定したところにauto-completeをインストールするよう 設定しておく方法もあります。

;; パッケージがインストールされてなければ自動で追加するおまじない
(require 'cl-lib)
(defvar installing-package-list
  '(auto-complete popup markdown-mode tc))
(let ((not-installed (cl-loop for x in installing-package-list
                            when (not (package-installed-p x))
                            collect x)))
  (when not-installed
    (package-refresh-contents)
    (cl-dolist (pkg not-installed)
        (package-install pkg))))

次に,init.elには次のような設定を追加します。

; auto-completeの初期化
(require 'auto-complete-config)
(ac-config-default)

;; emacs 30以上では,ac-source-abbrevがac-sources関連のコードで
;; emacs内部の仕様変更に対応できていない部分があり
;; とりあえず削除しておくというworkaroundです。
(add-hook 'auto-complete-mode-hook
      (lambda ()
        (setq ac-sources (remove 'ac-source-abbrev ac-sources))))

;; tc-ac-completeのロード
(require 'tc-ac-complete)

;; テキストモード時にtc-ac-completeの補完を設定
(add-hook 'text-mode-hook
          (function (lambda ()
                      (setq ac-sources
                            '(ac-source-tcode-complete ac-source-dictionary)))))

;; Markdownモード時にtc-ac-completeの補完を設定
(add-hook 'markdown-mode-hook
          (function (lambda ()
                      (setq ac-sources
                            '(ac-source-tcode-complete ac-source-dictionary)))))


; auto-completeの対応を ccモードから外す
(remove-hook 'c-mode-common-hook 'ac-cc-mode-setup)
(setq ac-modes
      (delete 'objec-mode
              (delete 'c++-mode
                      (delete 'cc-mode
                              (delete 'c-mode ac-modes)))))

auto-complete.elの動かない機能を削除するのと, 必要なモード「のみ」にauto-completeが動作するようにするための 細かい設定をしています。

次に~/.tcに次のような設定をします。

;; 補完の最大候補数
(setq tcode-complete-max-candidate-count 20)
;; 補完を表示する最小フレーズ長
(setq tcode-complete-min-context-length 2)
;; 補完を表示する最大フレーズ長
(setq tcode-complete-max-context-length 20)
;; 交ぜ書き変換辞書から検索する固定長
(setq tcode-complete-mazegaki-prefix-length 3)
;; 候補を表示するまでの遅延時間(意味があるのかどうか不明)
(setq tcode-complete-delay 0.5)

;; tc-ac-completeがインストールされていない時は無視
(when (fboundp 'auto-complete)
  (require 'tc-ac-complete)
  (require 'nadvice)
  ;; tcode-ac-complete-set-functionにオーバーライドしているけど
  ;; 今となっては何でこんなことをしているか不明
  (defun my-tcode-ac-complete-set-function ()
    (if (memq last-command tcode-input-command-list)
        (tcode-ac-complete-set)))

  (advice-add 'tcode-ac-complete-set-function :override
              #'my-tcode-ac-complete-set-function)

  ;; tcode-complete-add-to-dictionaryをした後ログを表示する関数
  (defun my-tcode-complete-add-to-dictionary-after (beg end)
    (progn
      (deactivate-mark t)
      (tcode-verbose-message "補完辞書に追加しました")))
  (advice-add 'tcode-complete-add-to-dictionary :after
              #'my-tcode-complete-add-to-dictionary-after)
  (global-set-key [(C c) (t) (a)] 'tcode-complete-add-to-dictionary) ; 補完辞書に追加
  (global-set-key [(C c) (t) (s)] 'tcode-complete-switch-to-dictionary) ; 補完辞書表示
  (global-set-key [(C c) (t) (C s)] 'tcode-complete-save-dictionary) ; 補完辞書保存
  (global-set-key [(C c) (t) (r)] 'tcode-complete-reload-dictionary) ; 補完辞書読み込み
)

(add-hook 'tcode-ready-hook
      (function
       (lambda ()
         ;; auto-completeがインストールされている時のみ
         ;; tc-ac-complete補完のバックグラウンド処理開始
         (when (fboundp 'auto-complete)
           (tcode-ac-candidate-start))
         )))

使い方

通常

使い方といっても登録しているキーワードの候補の表示がされるので, それを選択しないならそのままT-Codeの入力方法で入力していって, 候補を選択するなら,メニューから選ぶかゴースト表示している候補については タブキーでその候補を選択できます。

キーワードの登録(キーボード操作)

今回の設定では,補完候補の登録をキーボードから登録できるようにしています。

通常のキーワードの登録は簡単です。

まずEmacsの操作でリージョン(範囲)選択をします。

で,登録しているキーボードのショートカットCtrl+c t aを入力すると 登録できます。

上記の表現はCtrl+cを押してから,taと順に入力することを意味します。

また,変換操作用の候補も登録可能です。

キーワードと変換後の文字列との間に半角空白文字を入れてから, その両方が含まれるようリージョン選択し,先ほどと同じようにCtrl+c t a する方法でOKです。

なお,ショートカットに登録していない場合は,リージョン選択した後, M-x tcode-complete-add-to-dictionaryという操作でも同じようにキーワード登録が可能です。

キーワードの登録(補完辞書ファイルを直接編集)

補完辞書ファイルを直接編集して登録することも可能です。

tcode-data-directoyrで設定されている~/.emacs.d/tcode/フォルダの中のcomplete.dicという ファイルが補完用の辞書ファイルになります。 ただし,次の図のように通常はメモリ用の補完用バッファから補完候補が表示されます。

また,先ほどの辞書追加は補完用バッファに登録されるため,この時点では 辞書ファイルには保存されていません。通常はEmacs終了時に自動的に保存されますが, 手動操作にてメモリ上の補完用バッファの内容を保存できます。

complete.dicファイルを編集してから辞書の再読み込みを行うとそのファイルの 編集内容が反映された辞書をメモリ上に読み込みして,その内容を元に補完することが できます。

complete.dicファイルのフォーマットは簡単で,キーワードのみの補完の場合, 「一行が一キーワード」という形式です。

変換を伴うときは,キーワード[半角スペース]変換後文字列の形式が一行となります。

したがって,半角スペースを間に含むキーワードは登録できないことに注意が必要です。

tc-ac-completeの今後

実は,tc.elの不備をどんどん指摘して直していこうという動きがあり, tc-complete.elのバグについても直そうとする動きがあるようです。

個人的には,tc-complete.elユーザーインターフェースの動作はよく分かっておらず, また,明らかに現在利用しているtc-ac-complete 環境の方が良いと思っているので, tooro88さんが直したコードに合わせてtc-ac-complete.elも変更して利用する感じになると思います。

というかissueの中の文を見ると,機能自体omitしたいようですね。 そうなると,完全にtc-ac-complete側でコードを引き取る感じでしょうか。メンドクセ。 まぁtooro88さんがそう思うのならしょうがないですね。

tc-complete.elの補完機能のユーザーインターフェースを利用することは私としてはおそらくないですし, 動いていないコードをメンテナンスするコストを考えると, 利用していないコードを削除するのは自然な流れでしょうか。

また,そうでなくても現在のtc-ac-complete.elのコードは別のプルリクがマージされると 動かなくなるとの情報があります。まぁイシューを立ててくれるのはありがたいです。 今のtc-complete.elの状態で,一部のコードを闇で使っているなんて思う人なんていないので, 有無を言わさずomitされてても文句が言えない状態です。

まぁマージされたらそれに合わせて修正するといった対応になりそうです。

「漢直のメリットは補完」と感じさせてくれたtc-ac-completeなので, なるべく今後も利用していきたいです。

追記: なお,色々気を使っていただいて,バグがあるユーザーインターフェースの部分にパッチを当てて,とりあえずWarning無しに一通り動かすような感じにしていただけそうです。自分が使っているところは文字入力から候補作成の部分なので,特別影響も無さそうです。

ただlast-commandのチェックをしているところはthis-commandのチェックへの変更がtc-ac-complete側で必要のようです。

さいごに

今回は,tc.elの内部関数と,Emacsの外部パッケージauto-completeを利用した補完機能について簡単に紹介しました。

自分の場合は,補完というよりどちらかというと変換機能で利用している方が多いですが, 特別な操作も必要なく候補をどんどん出してくれるので,カジュアルに何か入力したい時は楽チンです。

単語登録にキーボードのショートカットを登録しておくと,手軽にキーワードも登録できるので, かなり便利に使えると思います。ただ,tc.el自体利用している人も少ないと思うので 実際に役に立つ人はほとんどいないかもとも思います。

プログラム言語の補完チックなので,プログラマーの人なら一番メリットを感じられるかと思います。

それではまた。

EmacsでのT-Code(2) tc.elのオプション他

はじめに

今回は,tc.elのオプションについて自分が知っている範囲で紹介します。

オプション

tcode-bushu-on-demand

あまり動作には関係しないオプションですが, 部首合成変換の初期化をどのタイミングで行うかを指定する設定です。

(setq tcode-bushu-on-demand 0)

~/.tcファイルの中で,上記のような形で指定します。

0ならtc.elのロード時,1ならCtrl+\で初めてT-Codeモードの入った時, 2なら部首合成変換開始時,もしくは文字のヘルプを初めて見ようとした時でなります。0以外はわりと待たされる(0でも初回は待たされますが…)ので,0にするのがいいでしょうか。初期値(無指定時)は2です。

tcode-shift-lowercase

T-Codeモード時にシフトを入力しながら入力すると,一時的に英文字が直接入力可能なのですが,この時に小文字を入力するかどうかの設定です。

自分はコーディングのコメント入力時に小文字の方が都合がいいので,tにしていることが多いです。

(setq tcode-shift-lowercase t)

のような形で指定します。デフォルトはnilなので,シフトで入力時は大文字です。

tcode-use-postfix-bushu-as-default

部首合成変換を後置式にするかどうかの設定です。nil以外の時は jfで後置式の部首合成変換(KanchokuWSと同じ方法)を行います。 77はその逆の方式となります。

nilの場合は前置式部首合成変換となります。

~/.tcの中で

(setq tcode-use-postfix-bushu-as-default t)

のような形で指定します。デフォルトはnil

tcode-use-prefix-mazegaki

交ぜ書き変換を前置式にするかどうかの設定です。nil以外の時は, fjで前置式の交ぜ書き変換になります。

KanchokuWSの前身,KanchokuWinとよく似た動作となります。

~/.tcの中で

(setq tcode-use-prefix-mazegaki t)

のような形で指定します。デフォルトはnil

tcode-switch-table-list

これについては,少し追加の説明が必要です。T-Codeモード中に32と入力すると,句読点の組み合わせを変更できますが,ここをカスタマイズできます。

私は古い人で,仕事で必要だったので,「,。」を追加しています。

今なら「、。」が普通なんでしょうが。なお,今でも自分が所属する 学会の論文は「,。」が要件ですね…

~/.tcファイルの中で

(defvar tcode-switch-table-list
  '(((tcode-touten . ",")
     (tcode-kuten . "。"))

    ((tcode-touten . "、")
     (tcode-kuten . "。"))

    ((tcode-touten . ", ")
     (tcode-kuten . ". "))

    ((tcode-touten . ",")
     (tcode-kuten . ".")))
  "テーブル中の変数値を切り替えるための表。")

のような形で設定しています。

tcode-ya-outset-map-list

これはある指定のキーとの組み合わせで,t-codeとは別の入力が できるように指定するものです。

デフォルトでは次のように設定されています。 ~/.tcに次のような設定を書くと,`のキーを入力すると, 画面の下にヘルプが表示され,どのキーを押すとどの文字が 表示されるかが分かります。

下の設定の場合,`を二連続で入力すると第二面が, 三連続で入力すると第三面が選択され,その後 T-Codeで利用される40キーのどれかを入力すると, その文字が出力されます。

(defvar tcode-ya-outset-map-list
  '(["¥" "†" "‡" "¶"  "▼"     "《"  "》" "【" "】" "“"

     "★" "◆" "■" "●"  "▲"     "〈"  "〉" "〔" "〕" "〃"
     "☆" "◇" "□" "○"  "△"     "←"  "↓" "↑" "→" "§"
     "※" "‥" "…" "◎"  "▽"     "♪"  "〒" "♂" "♀" "‐"]

    ["∵" "∴" "≪" "≫"  "≡"     "≦"  "≧" "∝" "∽" "⊥"

     "⊇" "⊆" "∃" "∀"  "⇔"     "<"  ">" "≠" "=" "∠"
     "∋" "¬" "∨" "∧"  "⇒"     "+"  "×" "÷" "−" "±"
     "∈" "⊂" "∪" "∩"  "⊃"     "∞"  "≒" "∫" "∬" "⌒"]

    ["■" "Ξ" "Φ" "Ψ"  "■"     "■"  "Υ" "Λ" "■" "■"

     "Γ" "Σ" "Π" "π"  "ψ"     "φ"  "γ" "Δ" "ρ" "λ"
     "α" "ο" "ε" "υ"  "ι"     "δ"  "χ" "τ" "ν" "σ"
     "Θ" "θ" "η" "κ"  "ξ"     "β"  "μ" "ω" "Ω" "ζ"])
  "* 外字のマップのリスト")

(add-hook 'tcode-ready-hook
      (function
       (lambda ()
         (tcode-set-key "`" 'tcode-insert-ya-outset))))

tcode-alnum-1-to-2-table

これは33とかで,英数文字の出力を全角モードに切り替えた時の 全角文字を指定するものです。

自分の場合は,~/.tcに次のような設定をして使っています。

理由は,Emacsの内部コードが独自コードからユニコードに変更された時に, 元々のEUC-JP→ユニコードの変換の際,どう見ても半角の文字が紛れ込んだためです。

(add-hook 'tcode-after-load-table-hook
      (lambda ()
        (when (eq tcode-input-method 'tcode)
          (setq tcode-alnum-1-to-2-table
            (concat " !”#$%&’()*+,-./0123456789:;<=>?"
                "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[¥]^_"
                "‘abcdefghijklmnopqrstuvwxyz{|}~"))
          )))

全角チルダ問題対策

Linux上のEmacsを利用していますが,についてはWindowsに合わせています。 現在,デフォルトのtc.elは由緒正しいユニコードによる変換なので, Windowsとは文字コードが違います。そのため,次のような設定を書いてお茶を濁しています。

;; utf-8 cp932 文字コード変換の不都合な真実
(add-hook 'tcode-after-load-table-hook
      (lambda ()
        (when (eq tcode-input-method 'tcode)
          ;; FULLWIDTH TILDE
          (tcode-set-action-to-table '(37 36) "~")
          ;; HORIZONTAL BAR          
          ;; (tcode-set-action-to-table '(27 32) "―")
          ;; FULLWIDTH HYPHEN-MINUS
          (tcode-set-action-to-table '(27 32) "-")
          )))

また,(27 32)のところは何にするかは色々意見が分かれるところかと思います。 好みで設定されればと思います。

何が正解かは自分でもよく分かっていないところです。

これも,元々はEUC-JPの変換がWindowsと規格のEUC-JPユニコード変換と違うために 起こった不整合です。

T-Codeのキーが効かなくなる時の対策

T-Codeを利用していると,ある特定のモードで普通の英字キーを利用しているものがあり, それとバッティングすることがあります。

その時の対策として,そのキーに割り付けられている関数名をtcode-input-command-listに追加しておくことで, T-Codeモード中だけ無効にすることができます。

T-Codeモードから抜けると,無効にしている関数も有効になります。

自分の場合は次のように設定しています。

(add-hook 'tcode-ready-hook
      (function
       (lambda ()
                    ; t-codeのキー入力とかぶるものを列挙
         (add-to-list 'tcode-input-command-list 'YaTeX-math-insert-sequence)
         (add-to-list 'tcode-input-command-list 'octave-electric-semi)
         (add-to-list 'tcode-input-command-list 'tcl-electric-char)
         (add-to-list 'tcode-input-command-list 'nxml-electric-slash)
         (add-to-list 'tcode-input-command-list 'ac-clang-async-autocomplete-autotrigger)
         (add-to-list 'tcode-input-command-list 'electric-blockdiag-dot-semi)
         (add-to-list 'tcode-input-command-list 'fortran-electric-line-number)
         (add-to-list 'tcode-input-command-list 'fortran-abbrev-start)
         (add-to-list 'tcode-input-command-list 'c-electric-semi&comma)
         (add-to-list 'tcode-input-command-list 'c-electric-slash)
         (add-to-list 'tcode-input-command-list 'jedi:dot-complete)
         (add-to-list 'tcode-input-command-list 'ess-smart-comma)
         (add-to-list 'tcode-input-command-list '*table--cell-self-insert-command)
         )))

といっても歴史的な履歴といった感じで,現在使う可能性があるといえば, YaTeX-math-insert-sequence*table--cell-self-insert-commandぐらいでしょうか。 c-electric-semi&commaとかc-electric-slashとかはプログラマなら影響のある人もいるかもしれません。

bushu.helpファイル

tc.elEmacsの内部コードがUnicodeに変わった時に,一部動作が変わりました。 そこには部首合成変換の文字の組み合わせが変わったものがあります。

その対策用としてだけではないのですが, 独自の部首合成ルールを書くのにbushu.helpという名前のファイルが用いられます。

前日の記事で,「Tコード用のデータを置くディレクトリ」を設定したかと思います。 Emacsの内部では「tcode-data-directory」として設定されています。

ここのフォルダの直下にbushu.helpというファイルを作成して, 所定のフォーマットで記述しておくと,他のツールに優先して部首合成変換できます。

所定のフォーマットは

[変換後文字][入力1文字目][入力2文字目]

です。

私の場合は,次のような感じの設定をしています。

凹画画
森林木
弧引爪
伏イ大
俺イ電
崩山月
鉛金船
架加木

特に漢直WSとは全然違う組み合わせとなっている文字も多いので,漢直WSに慣れている人は その漢字の組み合わせを設定しておくといいでしょう。ただ,漢直WSが使える環境ならtc.elはいらないと思いますが。

さいごに

今回は,tc.elのオプションについて説明しました。

まぁ誰に対しても需要はないと思います。

ではまた。

EmacsでのT-Code(1) tc.elのセットアップとT-Code入力とEELLL

はじめに

今更ながらなのですが,元祖T-Codeの入力環境と言ってもいいEmacs上でtc.elをセットアップする方法について 説明したいと思います。

今となっては,プログラムの開発環境としてEmacsを利用する理由というのはVSCodeとかある現状では やや薄れるのですが,それでも色々な文字コードのテキストファイルを拡張機能を入れずに 扱うことができる等,10年前以上のソフトウェア資源を扱うとなると,今でも有用な環境であることは 間違いありません。

さて,今回は「T-Code入力用エディタ」として利用するためのセットアップについて説明してみたいと思います。

WindowsでのEmacs環境の構築

WindowsEmacs環境を構築するのはこれといった決め手がありません。 自分の場合はtc.elにパッチをあてて補完機能を使っているので,すごく動作が重いこともあって ネイティブビルドmsys2のUCRT64環境をもっぱら使っているのですが,それだとお手軽さがありません。

そこで,ここでは公式ビルドを利用することを検討してみます。

Emacs公式ビルド版のダウンロード

emacsのダウンロードサイトに行くのですが,何故か直接ダウンロードできません。

nearby GNU mirrorのリンクを押すとどこに飛ばされるのか分かりませんが, とにかくダウンロードできるサイトに飛びます。

windowsを押します。

最新版なのでemacs-30を押します。

インストーラーもあるのですが,ここでは独自環境としてセットアップするので,emacs-30.2.zipを押してダウンロードします。

そこで,zipチェックサムを確認する必要があるのですが,ここでは省略します。

Emacsのセットアップ

そして,ローカルの環境で展開をします。Windowsエクスプローラでの展開で可能です。

しかし,最近のWindowsでは次の画面のようにネットからダウンロードしたファイルは制限がついてしまいます。 exeファイルとdllファイルでその制限を外しておいた方がレスポンスがよくなるかもしれません。許可するところにチェックを入れておきます。

次にバッチファイルを作成します。F:test\emacs-30.2がダウンロードしたアーカイブを展開したパスです。 それぞれ自分の環境に書き換えてみて下さい。

ここではHOMEF:\test\workにしています。 つまり,バッチ上でHOME環境変数を設定することで, emacsの設定ファイルの位置のカスタマイズすることができます。

これがバッチファイルから起動する時の利点になります。

次のように書きます。

@echo off
SET HOME=F:\test\work
SET PATH=F:\test\emacs-30.2\bin;%PATH%
cd %HOME%
F:\test\emacs-30.2\bin\runemacs.exe

一度バッチファイルを実行させます。 Emacsが立ち上がります。

するとHOMEであるF:\test\work\の下に.emacs.dというフォルダが作成されます。 その.emacs.dのフォルダ内に次のような内容のinit.elというファイルを作成します。

(set-locale-environment nil)
(prefer-coding-system 'utf-8)
(setq system-time-locale "C")

; Ctrl-hをヘルプからカーソル左側一文字削除に変更
(global-set-key "\C-h" nil)
(global-set-key "\C-h" 'backward-delete-char)

;; パッケージの検索にmeplaを追加
(require 'package)
(setq package-user-dir "~/.emacs.d/elpa")
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)
(package-initialize)

;; パッケージがインストールされてなければ自動で追加するおまじない
;; 下の設定ではMarkdown-mode と tc の二つのパッケージのみ
(require 'cl-lib)
(defvar installing-package-list
  '(markdown-mode tc))
(let ((not-installed (cl-loop for x in installing-package-list
                            when (not (package-installed-p x))
                            collect x)))
  (when not-installed
    (package-refresh-contents)
    (cl-dolist (pkg not-installed)
        (package-install pkg))))

;; ~/.emacs.d/site-lisp においてあるソースを自動でロードします
(add-to-list 'load-path (expand-file-name "~/.emacs.d/site-lisp"))
(if (fboundp 'normal-top-level-add-subdirs-to-load-path)
      (normal-top-level-add-subdirs-to-load-path))


(require 'tc-setup)

;; OS側のIME切替を許す
(global-set-key [M-kanji] 'ignore)
(global-set-key [kanji] 'ignore)
(global-set-key [M-\`] 'ignore)

(global-set-key "\M-z" nil)
(global-set-key "\M-z" 'tcode-zap-to-char)

;; 初期画面のサイズと表示位置
(setq initial-frame-alist
      (append (list
           ;; 表示位置
           '(top . 1) '(left . 1)
           ;; サイズ
           '(width . 80) '(height . 30))
          initial-frame-alist))
(setq default-frame-alist initial-frame-alist)

;; フォント設定。ここではBIZ UDGothicにする。サイズは14のところを変更
(set-face-font 'default "BIZ UDGothic-14")
(set-face-font 'fixed-pitch "BIZ UDGothic")
(set-face-font 'fixed-pitch-serif "BIZ UDGothic")
(set-face-font 'variable-pitch "BIZ UDGothic")

(set-fontset-font t 'unicode "BIZ UDGothic")

(custom-set-variables
 ;; custom-set-variables was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 '(package-selected-packages nil))
(custom-set-faces
 ;; custom-set-faces was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 '(eelll ((t (:foundry "BIZ UDGothic")))))

そして一度Emacsを終了させ,再度立ち上げ直します。

すると,勝手にパッケージをダウンロードして,立ち上がるかと思います。 かなり時間がかかるかと思います。

ここで,tc.elのReadmeに書いとある通り M-x tcode-installを実行します。

最初にAlt+xと入力すると,VSCodeのコマ ンドパレットのように 機能名を入力する欄がウィンドウの一番下に表示されるので,tcode-installと入力してEnterを押します。 機能名にはタブ補完が利用可能なので,タブで適宜補完させると入力しやすいでしょう。

すると,次のような画面が表示されます。ここでは%HOME%/.emacs/tcode/を指定してEnterを押します。

ディレクトリを作成するかどうか尋ねられるのでYとして次へ

キー配列を尋ねられるのでqwertyならそのままEnterを押して次へ

そして,何事もなかったような画面になるので, さらにEmacsを終了させ,もう一度立ち上げ直します。

そしてCtrl+\を入力するとウィンドウの下の方に[TC]というマークが表示され, T-Codeが入力できるモードとなります。

以上でとりあえずT-Codeが利用できる状態までのセットアップが完了です。

T-Codeでの入力

[TC]というマークが出ている状態で?を入力するとT-Codeの機能キーの一覧が表示されます。

それ以外のキーを入力すると基本的には二打鍵で一字入力されるT-Code入力モードになります。

また,このモード中にCtrl-\を入力すると直接入力モードになります。

01, 00, 11, 10の組み合わせで,「木を見て森を見る」タイプのヘルプが表示されます。

また,何かキーを一つ入力してしばらく待つと次にどのキーを入力すると どの漢字が入力されるかを示すヘルプが別バッファに表示されます。

文字の上にカーソルを置いて55キーを入力すると,その文字の運指が表示されます。

交ぜ書き変換で変換できない文字は自分で登録することができます。

T-Codeモード中に記号の|を入力すると,次のように「読み」を入力する画面が表示されます。

ここではまぜがきと入力してEnterキーを入力します。

次に漢字を入力します。交ぜ書きと入力してEnterキーを入力します。

他のアプリケーションからテキストをコピペすることも可能です。

Emacs上でのペーストはデフォルトではCtrl-yということに注意して下さい。

すると,まぜがきfjで「交ぜ書き」と変換することができます。

tc.elの場合は,一文字2打鍵で,スペースキーを利用することなく 直接文字が表示され,これが漢直入力専用環境の特徴といえます。

EELLLの利用方法

次に,漢直の練習環境であるEELLLの利用方法について説明します。

M-x eelllを実行すると,練習環境であるEELLLを実行することができます。

M-x eelllAlt+xと入力するとコマンド入力モードになるので,eelllと入力してEnterを入力します。

すると,次のようにレッスン番号を選択する画面が表示されます。

?を押すと一覧が表示されます。

数字を入力してから?を押すと,その数字を先頭とするレッスン番号が表示されます。

番号を入力してEnterを押すと,レッスン画面となります。

後は,11日目の記事で入力時の動画を紹介しているので, そちらも参考にしてみて下さい。

入力中には自分が入力した文字は表示されず,終わった後でしか確認できないような仕組みになっています。

さいごに

今回は,WindowsEmacsでのT-Code入力環境,tc.elをセットアップする例を紹介しました。

自分が独自に利用している補完機能はネイティブビルドできる環境でないと, 動作が重いのでやや利用が難しいのですが,tc.elの方は問題なく利用できるかと思います。

それではまた。

Mozc(Google日本語入力)を利用したT-Code(3) ローマ字変換テーブルを使った前置式部首合成変換

※この記事は漢直アドベントカレンダー 2025 の19日目の記事になります。

はじめに

すっかり順番が前後してしまいましたが, 今回は,ローマ字変換テーブルを利用した部首合成変換の実現方法について紹介したいと思います。

以前,スラドの日記に書いたこともあったのですが,もう無くなっているので再度の紹介となります。

今回のために少し漢直WSとかの設定画面とか覗いたのですが,Mozc用のローマ字変換テーブルが出力できるとあって, 今回紹介する必要はないかも,とか思っていたのですが,内容は自分にとっては使いにくい感じのものがありました。

まぁ確かにそれでいいんだけど…という感じです。

やっぱり前置式部首合成変換といえば「▲」です。これを出しながら前置式部首合成変換を実現する方法について説明します。

Mozcの「次の入力」を使った前置式部首合成変換の原理

※次の内容は以前自分が書いた日記のパクりです。

さて,Google日本語入力ローマ字変換テーブルの設定には,「次の入力」とい うユニークな機構があります。

この機構を利用すると,いわゆる「携帯電話打ち」「トグル打ち」といわれる, 「1」を押すごとに 「あ」→「い」→「う」→「え」→「お」 というような入力を 実現できます。

この機構を使って試行錯誤することを繰返し,tc.elの前置式の部首変換を実現 しました。 以下の説明は,その設定方法の基本的な考え方です。

それでは「木+木→林」を登録する手順 について説明しましょう。 まず,「▲」 の登録をします。

入力 出力 次の入力
jf

ここで,「▲」を「次の入力」に登録するのがミソです。そして次は「▲木」の登 録をします。 「pw→木」ですので,次のように登録します。

入力 出力 次の入力
jf
▲pw ▲木

ここで,ポイントは「先頭に『▲』がある間は次の入力がある」という風に google日本語入力に認識させることです。 そして最後に「林」でフィニッシュ です。

入力 出力 次の入力
jf
▲pw ▲木
▲木pw

先頭に「▲」が無くなると,確定出力の方に移します。

この設定で入力している文字列を見ると,

j → ▲ → ▲p → ▲木 → ▲木p → 林

となり,前置式部首変換モードに入って木と木を合成するというのがリアルタイ ムで分かりやすいのが明らかだと思います。

さて,この設定手順を見て「かなり大変な手間だ」と思った人も多いでしょう。 まぁ実際大変です。 ですが,前夜に紹介した「ローマ字変換テーブルのテキス トファイルのインポート・エクスポート機能」 を使えば多少楽になります。

といった感じで登録すればtc.elの雰囲気で部首合成変換が可能です。

部首合成する文字の選定

選定の方針

とは言うもののローマ字変換テーブルに登録可能な件数は無限ではありません。 現在利用しているものでは1万件の制限があります。

直接入力できるのが1350件ほど,今回採用する方法だと中間コードを吐くので, その余りの半分ほどしか登録できません。

そこで,直接入力できるおよそ1350文字を除いた3,000字ほどを選定することとします。

ネットで利用可能なN-gram情報として,N-gram コーパス - 日本語ウェブコーパス 2010があります。

利用条件も特にありませんし,これの1-gram情報を利用してみましょう。

頻度順への並び替え

さて,ここでも自分がよく使うJulia言語を利用して情報を加工していきます。 わりと面倒なのですが,DataFramesモジュールを利用しています。

using DataFrames

# 「1gm-0000」というファイルを一行一要素の配列で読み込んで
# その行ごとにタブ文字列で分割
str_lines = split.(readlines("1gm-0000"), "\t")

# それぞれの配列の一要素目を文字として抽出
文字s = map(x -> x[1], str_lines)
# それぞれの配列の二要素目を頻度の数値として抽出
頻度s = map(x -> parse(Int64, x[2]), str_lines)
# 1列目を文字,2枚目を頻度した表を作成
df_1gm = DataFrame(文字=文字s, 頻度=頻度s)
# 頻度の逆順でソート
sort!(df_1gm, [order(:頻度, rev=true)])
# 漢字のみの表を抽出
df_1gm_漢字 = filter(:文字 => x -> contains(x, r"\p{Han}"), df_1gm)

頻度順のトップ10は次の通りです。 </S><S>はそれぞれ文の終わり,文の始まりを示します。 集計方法の関係で句点がないことに注意が必要とのことです。

読点が5位にランクインしているのが興味深いですね。

julia> first(df_1gm, 10)
10×2 DataFrame
 Row │ 文字       頻度       
     │ SubStrin…  Int64      
─────┼───────────────────────
   1 │ </S>       5634102353
   2 │ <S>        5634102353
   3 │ の         4989732831
   4 │ い         3660604274
   5 │ 、         3101635837
   6 │ に         2841944679
   7 │ し         2744502961
   8 │ て         2685693429
   9 │ で         2611700100
  10 │ た         2492795128

julia> 

次に漢字のみのトップ10です。

といっても,鉤括弧とか中点とか上位を占めています。 正規表現\p{Han}で引っかけるとこういった文字も入ってくるようですね。

julia> first(df_1gm_漢字, 10)
10×2 DataFrame
 Row │ 文字       頻度       
     │ SubStrin…  Int64      
─────┼───────────────────────
   1 │ 、         3101635837
   2 │ ・          973730033
   3 │ 「          537820260
   4 │ 」          496905383
   5 │ 人          452873094
   6 │ 日          450607543
   7 │ 大          327964488
   8 │ 一          320862498
   9 │ 本          286611008
  10 │ 出          273077295

直接入力できる文字等の除外

次に漢直アドベントカレンダーの14日目の記事で準備した tcode.stファイルから直接入力可能な文字を抽出して部首合成ではそれを除きます。関数の仕組みに関しては14日目の記事を参考にして下さい。

また,今回はEmacstc.elの部首合成変換結果を利用するため,JISの第1,第2水準の漢字のみ取り扱います。 なので,jis_1st.txtjis_2nd.txtとして, githubのgistにあるテキストファイルを利用させていただきます。

ar_1st = split(read("jis_1st.txt", String), "")
ar_2nd = split(read("jis_2nd.txt", String), "")

# "丶"は処理に困るのであらかじめ取り除く
deleteat!(ar_2nd, findfirst(x-> x == "丶", ar_2nd))

## 直接入力可能な文字の配列
tc_ar = filter(x -> x != "", read_tcode_st("tcode.st"))

# 漢字かつ 直接入力不可 かつ (第1か第2水準漢字に含まれる) ものを抽出
df_1gm_ext = filter(:文字 => x -> contains(x, r"\p{Han}") && 
    x  tc_ar && (x  ar_1st || x  ar_2nd), df_1gm)

内容の方を確認してみます。

julia> first(df_1gm_ext, 10)
10×2 DataFrame
 Row │ 文字       頻度     
     │ SubStrin…  Int64    
─────┼─────────────────────
   1 │ 載         49225887
   2 │ 覧         37709262
   3 │ 像         34653290
   4 │ 俺         30325239
   5 │ 歌         28049558
   6 │ 皆         27868452
   7 │ 馬         27782998
   8 │ 泉         26082271
   9 │ 頂         25402564
  10 │ 松         25066191

julia> 

このdf_1gm_extの先頭から3000字の部首合成変換情報を抜き出します。

部首合成変換テーブルの作成

Emacsのtc.elから部首合成変換情報の抜き出し

Emacsにはemacsclientという既に起動しているEmacsとの情報をやり取りする仕組みがあります。 これを利用すると,実行しているEmacsに対してコマンドを実行することで,そのEmacsでの部首合成変換の 結果のようなものを取得することが可能です。

ただし,Emacs側で,

(require 'server)
(server-start)

をあらかじめ実行する必要があります。

さて,Julia言語側で部首合成のヘルプ文字列を取得してみます。次のような関数を定義します。

function get_bush_help(文字)
    options = ["(tcode-help-bushu-help-string \"$(文字)\" t)"]
    read(`emacsclient -e $options`, String) |> x -> strip(x, ['\"', '\n'])
end

実行すると,その文字列によって結果が変わります。

julia> get_bush_help("林")
"木 + 木"

julia> get_bush_help("椰")
"木 + (耳 + 部)"

ただ,tc.elのヘルプ関数はあまり精度が良くありません。 そこで,上記のような入力可能な二文字のみの組み合わせの時はそのまま採用, 上のように複数の文字を複合しないといけない時は,以前入手していた 入力可能な文字どうしでの部首合成総当たり結果を使って,自分が 一番使いたい二文字の組を人力で抽出するものとします。面倒臭いですが。

res_ar = []

for k in 1:3000
    the_str = df_1gm_ext[k, :文字]
    x = get_bush_help(the_str)
    push!(res_ar, [the_str, x])
end

res_ng = filter(x -> contains(x[2], ")"), res_ar)
res_ok = filter(x -> !contains(x[2], ")"), res_ar)

# 人力で確認した部首合成変換用文字列その1
ext_strings = [
    "皆比白", "亡忘心", "騒駅虫", "忍切心", "奨将大",
    "傍位方", "恒慢二", "呪喜ル", "膝月委", "偵側ト",
    "國国残", "敦享故", "謗訪立", "揉採予", "萬芝遇",
    "憑駅心", "喝域掲", "櫻桜側", "蕉サ確", "嗜唱老",
    "嗅喫自", "藪藩故", "拗オ後", "鰹魚賢", "樫木賢",
    "栞併木", "喩輸ロ", "傲イ教", "絢約日", "傭備広",
    "諫言頼", "瀕瀬歩", "蓼茶参", "麿麻営", "傳仏博",
    "筍答包", "羹羊羊", "筐竹区", "楢横配", "澱汎展",
    "薯著四", "惠ム恵", "藏緊サ", "賤残買", "櫃木遺",
    "擲オ尊", "滓シ章", "埜禁土", "攀橋挙", "聰取因",
    "悍慢刊", "嗤ロ謡", "娑渉女", "鈎鉱句", "涵汚画",
    "鵡武鳥", "勁災功", "誼詑助", "瀟津サ", "俟候ム",
    "齟歯助", "荀菊日", "咫ハ択", "簗築切", "巖山警",
    "并併イ", "塹軽所", "莽サ井", "諡誇ハ", "濟消交",
    "蘂薬心", "樵集点", "礬礎大", "囂額エ", "姨女引",
    "堝過土", "洵混句", "劈避切", "櫟後禁", "枳格ハ",
    "櫚欄営", "茯花、", "燒焼土", "曉日街", "洟添引",
    "繞糸焼", "藥サ機", "喇整別", "滉況日", "葎サ書",
    "籔竹改", "扼オ印", "槓木側", "倫信論", "濱渉員",
    "膀龍方", "濤治寿", "疇副寿", "甕護互", "攫オ護",
    "贖則負", "幀帳則", "殘繊列", "刎制物", "價価員"
]

# 人力で確認した部首合成変換用文字列その2
ext2_strings = [
    "黍科水", "漆シ黍", "弟第ケ", "鵜弟鳥", "會へ日",
    "檜木會", "弟第ケ", "梯木弟", "剃弟リ", "頸災項",
    "斬車質", "漸シ斬", "鼡ツ用", "蝋虫鼡", "秦実科",
    "榛木秦", "窒空屋", "膣月窒", "朿刺リ", "棘刺朿",
    "屯ノノ", "艸山屯", "贊先員", "鑽金贊", "耶耳合",
    "椰木耶", "旁立方", "榜木旁", "齊交月", "臍月齊",
    "爭爪争", "箏竹諍", "黽電電", "蠅虫黽", "蕀サ刺",
    "朿刺リ", "棗蕀朿", "殿設展", "臀殿月", "旁立方",
    "蒡サ旁", "謁言掲", "藹サ謁", "尋寸ヨ", "蕁サ尋",
    "參ム参", "鰺魚參", "珀王白", "篁竹珀", "旱日干",
    "桿木旱", "悌性弟", "匡区王", "框木匡", "當尚田",
    "蟷虫當", "遣追中", "鑓金遣", "彎糸引", "灣シ彎",
    "殷白ヌ", "慇殷心", "芯サ心", "蕊芯心", "賓少員",
    "嬪女賓", "爭爪争", "淨シ爭", "朋月月", "萠サ朋",
    "眞ヒ具", "愼性眞", "經エ災", "輕車經", "黽電電",
    "繩糸黽", "瞿目進", "懼性瞿", "僉合ハ", "嶮山僉",
    "襄譲言", "讓襄言"]

# res_okの結果から上記の配列の形式に変形します。
bushu_strings = map(x -> string(x[1], split(x[2], " + ")...),  res_ok)
# 文字列配列を結合して重複を取り除きます
bushu_all = unique(vcat(ext_strings, ext2_strings, bushu_strings))
# ソートします
sort!(bushu_all)

bushu_allには次のような文字列の配列になります。

julia> bushu_all
3008-element Vector{String}:
 "且助カ"
 "丕不一"
 "丙一内"
 "丞了水"
 "个へ1"
 "串中ロ"
 "丼井、"
 ⋮
 "齎月員"
 "齟歯助"
 "齢歯令"
 "齧大歯"
 "齬歯語"
 "龜免メ"

で,さらに別のやつ(『とか』等の変換を加えたもの)とかこのファイルと以前紹介したtcode.stkeytbl.txtを使ってローマ字変換テーブルを 作成するものを作ったのですが,今回は割愛します。もう記事も長くなり過ぎたので。

使用例

さいごに

今回はMozcおよびGoogle日本語入力で前置式部首合成変換を実現する方法について説明しました。

Emacs上での作業っぽく実現できているかと思います。

しかし,なかなかうまくいかず時間がかかってしまいました。

一応作ったローマ字変換テーブルの例はこの辺りにあるかもしれません。

まだ自転車操業的な記事作成が続きますが,25日まで頑張ります。

それではまた。

Mozc(Google日本語入力)を利用したT-Code(6) その他の補助入力のアイデアと一考察

※この記事は漢直アドベントカレンダー 2025 の18日目の記事になります。 なお,Mozcを利用した部首合成変換の記事の作成が遅れているので,No.3より先での紹介となります。

はじめに

前回までの記事で,部首合成変換,交ぜ書き変換の常識をぶち破る「漢字漢字変換」,「漢字かな変換」について 言及しました。

ここでは,まだアイデア段階(というか前回までのもアイデアだけですが)ではあるのですが,自分が考えている 変換についていくつか説明した後,MozcもしくはGoogle日本語入力でT-Codeを利用することに対してujimushi的な意見を述べたいと思います。

補助入力のアイデア(1) 部首合成交ぜ書き変換

Mozc・Google日本語入力には「片仮名」の入力が効きません。そのため,後置式の部首合成の多くを諦めているですが, それでも代替の文字を使う等の工夫をすれば後置部首合成変換も可能といえます。

なのでユーザー辞書の登録に活用形が利用できることを活かして,部首合成交ぜ書き変換的なものがあっていいのではないかと思っています。

例えば次のような感じで登録をします。

よみ 単語 品詞
口鳥く 鳴く 動詞カ行五段
夫鳥肉 鶏肉 名詞
糸帝める 締める 動詞一段
才矢才夕 挨拶
河夫谷 渓谷

まぁ,どうやってテーブルを作るのか?といった課題はありますが,Julia言語はフィルタ系は得意なので何とかなるかもしれません。

とは言いつつ記事のネタがないので,ぶっちゃけ3日前ぐらいにひねり出したアイデアです…

補助入力のアイデア(2) 校正変換

「校正変換」と大きく出たのですが,自分が現状思いつくのは次の二種類の変換です。

  1. 漢字の勘違いの修正
  2. 運指が間違いやすい文字の修正

漢字の勘違いについては,岡さんの記事が参考になるでしょう。

「会義」 → 「会議」

とか,漢字の同音異義語を間違えて入力した時の校正変換みたいなものです。 ただ自分はどちらかというと前々回の入力できない漢字に対しての変換を優先したい感じです。現状の自分の気持ちでは後回し案件です。

次に運指が間違いやすい文字の修正については次の通りです。

私の場合は次のように間違いをよくやります。

「してい販す」

これは,左の中指が右手の人差し指を追い越すために起きる間違いです。明らかに左利きの影響でもあります。

これを次のように「してい販す → しています」で「品詞なし」として登録しておくと,

よみ 単語 品詞
してい販す しています 品詞なし

「してい販す」と間違って入力した時に,スペースキーで 変換するだけで修正される,という便利と思われる機能になります。

これは,間違うといつもの文章とは似ても似つかない誤入力になるT-Codeならではのメリットです。

これらについては,自分で色々間違いを意識して探してみて,それに対して校正できるような変換を考えてみる必要があるかと思っています。

ただ,Mozcの場合「します愛→します。」とかの「句点」に対しての校正変換が全然効かないんですよね。ちなみに 自分のメインの利用環境であるEmacsの補完環境だとちゃんと効いてくれるので「タブ」だけで校正してくれて楽チンです。

ujimushi的MozcもしくはGoogle日本語入力でT-Codeを利用することについて

MozcもしくはGoogle日本語入力を用いてT-Codeが使えるということは,そのIMEが使えるOS全てにおいて, カナ漢字変換テーブルとユーザー辞書を設定するだけでT-Codeが使えるということになります。

確かに,漢直WSやCovusTUTなどの利用は豊富なヘルプ機能があって利用しやすいのですが, 漢字をかなり覚えているT-Codeユーザーにとっては, Google日本語入力さえインストールされていれさえすれば設定ファイルを読み込むだけで環境が 構築でき,かなり便利な入力環境になっているのではないかと思っています。

まぁ岡さんとかはシュレディンガーがあるからこういうのは必要ないんですよね。

また,前田さんとかもあまりこの考えにはあまり同意できない感じなのではないかと思っています。

漢直って「かなしか入力できないかな漢字入力ユーザー」から見ると「ズル」みたいなものですから, 「漢字が使えるかな漢字変換」をどんどん活用して,「ズル」を増やしていけばいいのだと思います。

だって,漢直ユーザーから見ると,何で簡単な漢字をわざわざかな漢字変換しているのか理解に苦しんでいる感じですから。

漢字が書けるのにわざわざ平仮名で入力するのを強いられるのってどんな苦行かよ,って思います。

新配列については分析対象としては面白いけれど,自分が使うとなるとただの罰ゲームですね。

さいごに

今回は,本当に何も実態のない「アイデア」と「お気持ち表明」だけという,本当につなぎの回となってしまって 申し訳ありません。

この記事で余裕を持って,「tc.el」関連の記事の作成に当てたいと思います。

それではまた。

Mozc(Google日本語入力)を利用したT-Code(5) 補助入力のアイデア: 連想式漢字かな変換

※この記事は漢直アドベントカレンダー 2025 の17日目の記事になります。 なお,Mozcを利用した部首合成変換の記事の作成が遅れているので,No.3より先での紹介となります。

はじめに

今まで説明してきたように,最新のGoogle日本語入力,Mozcでは「ひらがな」だけではなく漢字を見出し語として利用可能です。 ということは,通常のかな漢字変換のように「ひらがな」だけを入力して変換をしているのは Mozc(Google日本語入力)の機能のごく一部しか利用できていないことになります。

また,T-Codeの開発者である山田氏も文献1の中で次のように述べています。

それでもわれわれは度忘れをする。そういった時にいちいち表を見るのはわずらわしい。 それで将来の標準タイプライタは同じ字に対して二重、三重のコードを準備しておけばよい。 第一のコードは能率一点張りのタッチ用コード、第二・第三のコードは意識的に考えながら検字できる、 はっきりとした構造をもったものを、索字ファンクション・キーと共に使えるようにする。

つまり,二重,三重のコードを準備することは悪くない,という事です。

T-Codeの場合,ひらがなの入力でも必ず二打鍵が必要です。カナ入力の場合と比較すると打鍵コストを2倍になります。

論理上はシフト等が必要ないので,高速に入力しやすいのですが,50歳も半ばを過ぎると少しぐらい ひらがなの打鍵数を減らしたいものです。

その希望に対し直接的に平仮名入力専用のカナ配列を用意したのが岡さんですが, 私の場合はそんな器用なことはできません。

で,色々考えたのが今回の内容になります。

私の頭の中のあれこれの妄想

2025年中はずっと漢直の過去の論文を読んでいました。 やはり印象に残るのは「連想式」です。連想式といえばダジャレ。ダジャレと言えば関西(?)。 関西に在住する人間として笑いの要素は外せません。

そこで,これまでの補助入力について列挙してみました。

  • かな → 漢字 (かな漢字変換)
  • かなと漢字 → 漢字 (交ぜ書き変換)
  • 別の漢字と漢字 → 漢字 (前回の同音異義変換)

前回で別の漢字から漢字に変換するアイデアができた。

ほんなら見出し語と変換後の関係と「かな」「漢字」を表にしてみようか。

変換元\変換先 かな 漢字
かな
漢字

まぁ「かな」が違う「かな」に変換されたら気持ち悪いからここではおいとこう。

あれ,漢字から「かな」に変換って無いんちゃうか。

まぁ普通は頭おかしいよなぁ。でも漢直なら 「かな」も「漢字」も同じ二打鍵。

漢字の読みを当て字に使ったら省エネちゃうやろか。

ほなら自分が一番使うフレーズについて考えてみよう。

こうブログなら大体「~と思います。」とか「~と思っています。」とか「~と思っていました。」

とかやな。これを当ててみようか。

「思い益」→「思います」とかどやろか?

「思○ます」でも「思います」って想像できるから「思益」→「思います」でええか。

「思ってい益」→「思っています」。う~ん。「てい」は「定」かな?

「思っ定益」。小っちゃい「っ」とかいらんやろ。

「思定益」→「思っています」。ええやん。

次。「思定ました」→「思っていました」。ストレートに「した」→「下」か。

「思定ま下」。まぁ「ま」抜けでもいいか。

「思定下」→「思っていました」

後は「思っていたところ」。これは「思って板所」とかベタでええか。もう「って」とかいらんな。

「思板所」→「思っていたところ」。ええやん。むっちゃ楽してズルしてる感じが自分らしくいい感じ。

自分の場合は小説家ではないから自分のことしか書かへんから,

  • 思う
  • 考える
  • 言う
  • 感じる

とか第一人称系の動詞だけ登録したらいいやろ。

他になんかあるかな。

「しかしながら」。「ながら」って「乍」やけど入力面倒やから「昨」使おうか。

「しか」が入ってるから「鹿」か。途中の「し」は無視無視。

「鹿昨」→「しかしながら」

よっしゃ。ネタとしては上出来や。ただし,この記事読んでる人には今季一番の寒波が頭の中を吹き荒れてるかもしれんけどな…

入力例

とまぁネタ(というか素?)はこれぐらいにして入力している風景とかも見てもらいましょう。

さいごに

今回は,日本初「Google日本語入力(Mozc)による漢字かな変換」の提案をしました。

漢直を利用されている方は,平仮名の一字につき2打鍵が必要なことが気になることもあるかと思います。 しかし,この考え方を利用すれば「打数を減らせてしかも覚えやすい」ということが実用可能ではないかと思っています。

しかも,漢直のベースの部分は同じで,その人特有の変換が実現可能です。

特にT-Codeの場合は一漢字二打鍵なので,更に省略効果が高い漢字列を設定できるかと思います。

ぜひ漢直を利用されている皆さんも「漢字を入力できることを最大限利用した変換」を考案して, 色々世に公開していただきたいと思っています。

それではまた。


  1. 山田尚勇: 日本語テキスト入力法の人間工学的比較, 日本語情報処理シンポジウム報告集 p1-33, 1978

Mozc(Google日本語入力)を利用したT-Code(4) 補助入力のアイデア: 一部の部首と読み一致熟語変換

※この記事は漢直アドベントカレンダー 2025 の16日目の記事になります。 なお,Mozcを利用した部首合成変換の記事の作成が遅れているので,No.4の方がNo.3より先での紹介となります。

はじめに

T-Codeは直接入力できない漢字が多いので,補助入力に頼る機会が多いです。 そこで,部首合成変換,交ぜ書き変換に加えて何か便利な変換をいつも探しています。

その時次のようなポストがx.comにありました。

T-Codeの開発者である山田氏も次のようにおっしゃっています。

それでもわれわれは度忘れをする。そういった時にいちいち表を見るのはわずらわしい。 それで将来の標準タイプライタは同じ字に対して二重、三重のコードを準備しておけばよい。 第一のコードは能率一点張りのタッチ用コード、第二・第三のコードは意識的に考えながら検字できる、 はっきりとした構造をもったものを、索字ファンクション・キーと共に使えるようにする。

ということで,第3,第4のコードを考えてみたいと思ったのが今回の記事になります。

読み一致かつ同じ部首(文字部品)を含む文字で変換する方法の提案

前述の岡さんのポストでは入力間違いを修正する方法としての工夫というのをされていましたが, ここでは,直接入力できない文字の入力方法として考えてみます。

例えば,素のT-Codeでは「裁」は入力可能ですが,「載」や「栽」は入力ができません。

ただ,似たように文字で同じ漢字の部品を持っていて,それぞれはっきり違った意味になっています。

そこで,T-Codeで入力できない漢字に限り,

  • 車裁 → 車載
  • 連裁 → 連載
  • 掲裁 → 掲載
  • 裁倍 → 栽培

みたいな感じで,「同じ読み」を含みかつ「漢字の同じ部品」を含む文字で 置き換えて入力できるようにする方法を考えてみました。 ただし,置き換えた文字がもう既にあらかじめ登録されている時は登録しないことにします。

岡さんと同様にmecabのipadicとその他色々なネットにあふれる日本語情報を色々組み合わせて そういうものをJulia言語で生成するスクリプトを作成しているところです。

しかし,バグバグなので(というか日本語特有の音便が実装できてないので)スクリプト自体をまだ公開できる感じではないのですが, 一部どんな変換になって「しまって」いるかどうかについてご紹介します。

完昏草際

実はT-codeでは「冠婚葬祭」のどの字も直接入力することができません。 ですが,読みと漢字の一部を含んでいる文字である「完昏草際」の入力で変換することがユーザー辞書に登録することで可能となります。

取味

「趣味」と「取味」は「走」がないだけでよく似ているし読みも一緒ですよね。 ならそれで変換してしまいましょう。

心蔵と干蔵

「心蔵」も「干蔵」も読みも一緒でよく似ている(というか心蔵って素で間違える人もいてそうな…)ので, これで変換できるようにしてしまいます。

無浅いん食

「浅」が「せん」と読めることを知らなければなかなか出てきませんが,ひらがな二文字の入力を漢字一文字で省略します。

よく映れました

T-Codeでは「晴」は直接変換できません。 「映」は「は-える」なのですが,同じ「日」を部首に持ち,「映える」と「映れる」は活用が一致しないので別語句と判定できるじゃないか,と考えてこんな変換が成立しているっぽいです。まさに作った人の意図を超えた仕様になっています。

ujimushi的所感

何というか,漢直の「漢字を直接入力できる」という表現力の高さ(?)と,Mozcのユーザー辞書による変換機能の高さの 素晴らしい融合を見たような気がします。

これは「かな」だけしか入力を受けつけないユーザー辞書では絶対に不可能な変換方法であるとともに

をまざまざと見せつけているように感じます。

また,このような変換が可能になると,この変チクリンな変換をするために覚えていない漢字を覚えようとしたり, 少ない漢字で色々な表現が可能となる漢直とかの夢も膨らみます。

現時点で,ujimushi的な妄想的観点からの思考から発言すると 「MozcやGoogle日本語入力のポテンシャルを引き出せるのは漢直しかない」 のであって新配列では到底こんなことは現状ではできんやろ,といえるのではないかと思います。

さいごに

今回は,「読み一致かつ同じ部首(文字部品)を含む文字で変換する方法の提案」を記事にしてお送りしました。

Mozcのユーザー辞書を利用することで新たな漢直の可能性が見出だせたのではないかと思います。

これからも他の人(今回は岡さん)の考え方をパクッて,どんどんズルい漢直道を邁進したいと考えています。

それではまた。