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
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
34
5.9k
Rails Girls Zürich Keynote
gr2m
95
14k
Optimising Largest Contentful Paint
csswizardry
37
3.3k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Scaling GitHub
holman
460
140k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
233
17k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
10
950
How STYLIGHT went responsive
nonsquared
100
5.6k
Site-Speed That Sticks
csswizardry
10
690
Raft: Consensus for Rubyists
vanstee
140
7k
Why You Should Never Use an ORM
jnunemaker
PRO
58
9.4k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
60k
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