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
18
IME in Vim
@Dena.vim#2
NAKAI Tsuyoshi
April 04, 2024
Tweet
Share
Featured
See All Featured
Building Adaptive Systems
keathley
32
1.9k
A better future with KSS
kneath
231
16k
Keith and Marios Guide to Fast Websites
keithpitt
408
22k
Happy Clients
brianwarren
92
6.4k
Designing on Purpose - Digital PM Summit 2013
jponch
111
6.5k
Mobile First: as difficult as doing things right
swwweet
217
8.6k
Testing 201, or: Great Expectations
jmmastey
30
6.4k
Building Flexible Design Systems
yeseniaperezcruz
320
37k
Raft: Consensus for Rubyists
vanstee
133
6.3k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
126
32k
WebSockets: Embracing the real-time Web
robhawkes
59
7k
Gamification - CAS2011
davidbonilla
77
4.6k
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