Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
IME in Vim
Search
NAKAI Tsuyoshi
April 04, 2024
0
120
IME in Vim
@Dena.vim#2
NAKAI Tsuyoshi
April 04, 2024
Tweet
Share
Featured
See All Featured
GitHub's CSS Performance
jonrohan
1031
460k
Visualization
eitanlees
146
16k
Thoughts on Productivity
jonyablonski
69
4.7k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
357
30k
Automating Front-end Workflow
addyosmani
1370
200k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Scaling GitHub
holman
460
140k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
2.9k
Balancing Empowerment & Direction
lara
1
430
Large-scale JavaScript Application Architecture
addyosmani
512
110k
KATA
mclloyd
30
14k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Transcript
IME in Vim uga-rosa 2024/02/29 @ DeNA.vim#2
自己紹介 中井 剛志 (uga-rosa) https://github.com/uga-rosa https://zenn.dev/uga_rosa 24卒。専攻は化学系 Neovimユーザー3年目 自作プラグイン ccc.nvim
denippet.vim etc.
IMEとSKK
IME (Input Method Editor) キーボードから直接入力できない文字を入力するためのソフトウェア CJKV文字 (東アジア圏) MS-IME, 日本語IM (Mac),
Google日本語入力, ATOK 連文節変換 自動的に文節の区切りを判定し、複数の文節から成る文章をまとめて変換 こっきょうのながいとんねるをぬけるとゆきぐにであった。 ↓ 国境の長いトンネルを抜けると雪国であった。 無数にあるパターン 機械学習
SKK (Simple Kana to Kanji conversion program) オリジナルの実装はemacs 連文節変換なし ユーザーが区切り
(変換の開始、終了、送りがな) を明示 Kokkyou noNagaITonnneruqwoNuKerutoYukiguni deatta. 変換方法 ひらがなは全て確定済み 変換を開始するには大文字 スペースで漢字変換、qでカタカナ変換 変換中にさらに大文字 → 送りがな
SKKのメリット ユーザー エンターキーを押す回数が減る 誤変換が少ない 辞書登録がスムーズ 開発者 実装がシンプル 文節は全てユーザーが知っているので、辞書に問い合わせるだけ デメリット SKKのない環境がとても辛い
VimにおけるSKK実装 skkeleton denops.vim 最新の実装で開発もアクティブ eskk.vim Pure Vim script Vimの中でIME pluginを使うメリット
OSに依存しない エディタの他の機能と連携しやすい 自動補完 変換状態の表示
アルゴリズム
機能の整理 コア機能 ローマ字の入力をひらがなに変換する ひらがな → 漢字の変換 変換用の辞書を読み込み 送りがなの有無 UI バッファへの反映
ローマ字 → ひらがな 変換 入力は一文字ずつ渡される それまでの入力を覚えておく 変換ルール KanaTable Google日本語入力でいう「入力」「出力」 「次の入力」からなる
bb -> っb や bba -> っば が簡単に実現 type KanaRule = { input: string; output: string; next: string; }; type KanaTable = KanaRule[];
ひらがな変換の注意点 次の入力を見ないと変換候補が確定できないものには注意 nn -> ん と nm -> んm など。
以下のルールを同時に導入 { input: "nn", output: "ん", next: "" } { input: "n", output: "ん", next: "" } 入力に対する前方一致で変換ルールを絞り込む 候補が1つかつ完全一致になったら変換を確定 候補が0個になった場合は 直前までの入力に完全一致する候補があれば、それを確定し新しい入力を積む 無ければ誤入力
Flowchart 1つかつ完全一致 nextは残す 0個 それ以外 全部残す あり nextと新しいinputは残す なし 全部消す
Start ローマ字の入力 KanaTable KanaRuleのinputに対する 前方一致で絞り込み 候補の数 変換を確定 直前までの入力 に対して完全一致 する候補 未確定 それを確定し新しい入力を積む 誤入力 type KanaRule = { input: string; output: string; next: string; }; type KanaTable = KanaRule[];
まとめ
SKKはいいぞ skkeletonはいいぞ 宣伝 zennで「SKK実装入門」という連載を書いてます SKK実装入門 (1) ローマ字 -> ひらがな変換 SKK実装入門
(2) ひらがな入力 (3) の「辞書読み込みと変換」は3月中に更新予定 最近json形式かつ文字コードがutf-8の辞書がマージされました 🎉 https://github.com/skk-dev/dict/pull/39