Skip to content

Instantly share code, notes, and snippets.

@kuuote
Created July 12, 2021 14:04
Show Gist options
  • Save kuuote/46e5596b8c89db90d1ed993949e92156 to your computer and use it in GitHub Desktop.
Save kuuote/46e5596b8c89db90d1ed993949e92156 to your computer and use it in GitHub Desktop.
Vimでかな入力するやつ
function! kana#init() abort
let s:state = {}
let s:state.preedit = ""
let s:state.preedit_next = ""
let s:state.kakutei = v:false
let s:state.feed = ""
let s:table = json_decode(join(readfile("table.json"), ""))
call kana#map()
endfunction
function! kana#map() abort
for i in range(26)
let c = nr2char(i + 0x61)
execute printf("lnoremap <expr> %s kana#input('%s')", c, c)
endfor
lnoremap <expr> ' kana#input("'")
lnoremap <expr> - kana#input("-")
endfunction
function! kana#preedit() abort
let ret = repeat("\<C-h>", strchars(s:state.preedit)) .. s:state.preedit_next
if s:state.kakutei
let s:state.preedit = ""
let s:state.kakutei = v:false
else
let s:state.preedit = s:state.preedit_next
endif
let s:state.preedit_next = ""
return ret
endfunction
function! kana#kakutei(result, feed) abort
let s:state.kakutei = v:true
let s:state.preedit_next = a:result
let s:state.feed = a:feed
endfunction
function! kana#input(char) abort
" んじゃ等を処理するために確保
let current = get(s:table, s:state.feed, v:false)
let s:state.feed ..= a:char
let found = filter(items(s:table), "stridx(v:val[0], s:state.feed) == 0")
if empty(found)
if current isnot v:false
call kana#kakutei(current[2], a:char)
else
let s:state.feed = a:char
let s:state.preedit_next = a:char
endif
elseif len(found) == 1 && found[0][0] ==# s:state.feed
echo found
call kana#kakutei(found[0][1][2], found[0][1][0])
else
let s:state.preedit_next = s:state.feed
endif
return kana#preedit()
endfunction
augroup kana
autocmd!
autocmd InsertEnter * call kana#init()
augroup END
{
"a": ["", "ア", "あ"],
"-": ["", "", "ー"],
"bb": ["b", "ッ", "っ"],
"ba": ["", "バ", "ば"],
"be": ["", "ベ", "べ"],
"bi": ["", "ビ", "び"],
"bo": ["", "ボ", "ぼ"],
"bu": ["", "ブ", "ぶ"],
"bya": ["", "ビャ", "びゃ"],
"bye": ["", "ビェ", "びぇ"],
"byi": ["", "ビィ", "びぃ"],
"byo": ["", "ビョ", "びょ"],
"byu": ["", "ビュ", "びゅ"],
"cc": ["c", "ッ", "っ"],
"cha": ["", "チャ", "ちゃ"],
"che": ["", "チェ", "ちぇ"],
"chi": ["", "チ", "ち"],
"cho": ["", "チョ", "ちょ"],
"chu": ["", "チュ", "ちゅ"],
"cya": ["", "チャ", "ちゃ"],
"cye": ["", "チェ", "ちぇ"],
"cyi": ["", "チィ", "ちぃ"],
"cyo": ["", "チョ", "ちょ"],
"cyu": ["", "チュ", "ちゅ"],
"dd": ["d", "ッ", "っ"],
"da": ["", "ダ", "だ"],
"de": ["", "デ", "で"],
"dha": ["", "デャ", "でゃ"],
"dhe": ["", "デェ", "でぇ"],
"dhi": ["", "ディ", "でぃ"],
"dho": ["", "デョ", "でょ"],
"dhu": ["", "デュ", "でゅ"],
"di": ["", "ヂ", "ぢ"],
"do": ["", "ド", "ど"],
"du": ["", "ヅ", "づ"],
"dya": ["", "ヂャ", "ぢゃ"],
"dye": ["", "ヂェ", "ぢぇ"],
"dyi": ["", "ヂィ", "ぢぃ"],
"dyo": ["", "ヂョ", "ぢょ"],
"dyu": ["", "ヂュ", "ぢゅ"],
"e": ["", "エ", "え"],
"ff": ["f", "ッ", "っ"],
"fa": ["", "ファ", "ふぁ"],
"fe": ["", "フェ", "ふぇ"],
"fi": ["", "フィ", "ふぃ"],
"fo": ["", "フォ", "ふぉ"],
"fu": ["", "フ", "ふ"],
"fya": ["", "フャ", "ふゃ"],
"fye": ["", "フェ", "ふぇ"],
"fyi": ["", "フィ", "ふぃ"],
"fyo": ["", "フョ", "ふょ"],
"fyu": ["", "フュ", "ふゅ"],
"gg": ["g", "ッ", "っ"],
"ga": ["", "ガ", "が"],
"ge": ["", "ゲ", "げ"],
"gi": ["", "ギ", "ぎ"],
"go": ["", "ゴ", "ご"],
"gu": ["", "グ", "ぐ"],
"gya": ["", "ギャ", "ぎゃ"],
"gye": ["", "ギェ", "ぎぇ"],
"gyi": ["", "ギィ", "ぎぃ"],
"gyo": ["", "ギョ", "ぎょ"],
"gyu": ["", "ギュ", "ぎゅ"],
"ha": ["", "ハ", "は"],
"he": ["", "ヘ", "へ"],
"hi": ["", "ヒ", "ひ"],
"ho": ["", "ホ", "ほ"],
"hu": ["", "フ", "ふ"],
"hya": ["", "ヒャ", "ひゃ"],
"hye": ["", "ヒェ", "ひぇ"],
"hyi": ["", "ヒィ", "ひぃ"],
"hyo": ["", "ヒョ", "ひょ"],
"hyu": ["", "ヒュ", "ひゅ"],
"i": ["", "イ", "い"],
"jj": ["j", "ッ", "っ"],
"ja": ["", "ジャ", "じゃ"],
"je": ["", "ジェ", "じぇ"],
"ji": ["", "ジ", "じ"],
"jo": ["", "ジョ", "じょ"],
"ju": ["", "ジュ", "じゅ"],
"jya": ["", "ジャ", "じゃ"],
"jye": ["", "ジェ", "じぇ"],
"jyi": ["", "ジィ", "じぃ"],
"jyo": ["", "ジョ", "じょ"],
"jyu": ["", "ジュ", "じゅ"],
"kk": ["k", "ッ", "っ"],
"ka": ["", "カ", "か"],
"ke": ["", "ケ", "け"],
"ki": ["", "キ", "き"],
"ko": ["", "コ", "こ"],
"ku": ["", "ク", "く"],
"kya": ["", "キャ", "きゃ"],
"kye": ["", "キェ", "きぇ"],
"kyi": ["", "キィ", "きぃ"],
"kyo": ["", "キョ", "きょ"],
"kyu": ["", "キュ", "きゅ"],
"ma": ["", "マ", "ま"],
"me": ["", "メ", "め"],
"mi": ["", "ミ", "み"],
"mo": ["", "モ", "も"],
"mu": ["", "ム", "む"],
"mya": ["", "ミャ", "みゃ"],
"mye": ["", "ミェ", "みぇ"],
"myi": ["", "ミィ", "みぃ"],
"myo": ["", "ミョ", "みょ"],
"myu": ["", "ミュ", "みゅ"],
"n": ["", "ン", "ん"],
"n'": ["", "ン", "ん"],
"na": ["", "ナ", "な"],
"ne": ["", "ネ", "ね"],
"ni": ["", "ニ", "に"],
"nn": ["", "ン", "ん"],
"no": ["", "ノ", "の"],
"nu": ["", "ヌ", "ぬ"],
"nya": ["", "ニャ", "にゃ"],
"nye": ["", "ニェ", "にぇ"],
"nyi": ["", "ニィ", "にぃ"],
"nyo": ["", "ニョ", "にょ"],
"nyu": ["", "ニュ", "にゅ"],
"o": ["", "オ", "お"],
"pp": ["p", "ッ", "っ"],
"pa": ["", "パ", "ぱ"],
"pe": ["", "ペ", "ぺ"],
"pi": ["", "ピ", "ぴ"],
"po": ["", "ポ", "ぽ"],
"pu": ["", "プ", "ぷ"],
"pya": ["", "ピャ", "ぴゃ"],
"pye": ["", "ピェ", "ぴぇ"],
"pyi": ["", "ピィ", "ぴぃ"],
"pyo": ["", "ピョ", "ぴょ"],
"pyu": ["", "ピュ", "ぴゅ"],
"rr": ["r", "ッ", "っ"],
"ra": ["", "ラ", "ら"],
"re": ["", "レ", "れ"],
"ri": ["", "リ", "り"],
"ro": ["", "ロ", "ろ"],
"ru": ["", "ル", "る"],
"rya": ["", "リャ", "りゃ"],
"rye": ["", "リェ", "りぇ"],
"ryi": ["", "リィ", "りぃ"],
"ryo": ["", "リョ", "りょ"],
"ryu": ["", "リュ", "りゅ"],
"ss": ["s", "ッ", "っ"],
"sa": ["", "サ", "さ"],
"se": ["", "セ", "せ"],
"sha": ["", "シャ", "しゃ"],
"she": ["", "シェ", "しぇ"],
"shi": ["", "シ", "し"],
"sho": ["", "ショ", "しょ"],
"shu": ["", "シュ", "しゅ"],
"si": ["", "シ", "し"],
"so": ["", "ソ", "そ"],
"su": ["", "ス", "す"],
"sya": ["", "シャ", "しゃ"],
"sye": ["", "シェ", "しぇ"],
"syi": ["", "シィ", "しぃ"],
"syo": ["", "ショ", "しょ"],
"syu": ["", "シュ", "しゅ"],
"tt": ["t", "ッ", "っ"],
"ta": ["", "タ", "た"],
"te": ["", "テ", "て"],
"tha": ["", "テァ", "てぁ"],
"the": ["", "テェ", "てぇ"],
"thi": ["", "ティ", "てぃ"],
"tho": ["", "テョ", "てょ"],
"thu": ["", "テュ", "てゅ"],
"ti": ["", "チ", "ち"],
"to": ["", "ト", "と"],
"tsu": ["", "ツ", "つ"],
"tu": ["", "ツ", "つ"],
"tya": ["", "チャ", "ちゃ"],
"tye": ["", "チェ", "ちぇ"],
"tyi": ["", "チィ", "ちぃ"],
"tyo": ["", "チョ", "ちょ"],
"tyu": ["", "チュ", "ちゅ"],
"u": ["", "ウ", "う"],
"vv": ["v", "ッ", "っ"],
"va": ["", "ヴァ", "う゛ぁ"],
"ve": ["", "ヴェ", "う゛ぇ"],
"vi": ["", "ヴィ", "う゛ぃ"],
"vo": ["", "ヴォ", "う゛ぉ"],
"vu": ["", "ヴ", "う゛"],
"ww": ["w", "ッ", "っ"],
"wa": ["", "ワ", "わ"],
"we": ["", "ウェ", "うぇ"],
"wi": ["", "ウィ", "うぃ"],
"wo": ["", "ヲ", "を"],
"wu": ["", "ウ", "う"],
"xx": ["x", "ッ", "っ"],
"xa": ["", "ァ", "ぁ"],
"xe": ["", "ェ", "ぇ"],
"xi": ["", "ィ", "ぃ"],
"xka": ["", "ヵ", "か"],
"xke": ["", "ヶ", "け"],
"xo": ["", "ォ", "ぉ"],
"xtsu": ["", "ッ", "っ"],
"xtu": ["", "ッ", "っ"],
"xu": ["", "ゥ", "ぅ"],
"xwa": ["", "ヮ", "ゎ"],
"xwe": ["", "ヱ", "ゑ"],
"xwi": ["", "ヰ", "ゐ"],
"xya": ["", "ャ", "ゃ"],
"xyo": ["", "ョ", "ょ"],
"xyu": ["", "ュ", "ゅ"],
"yy": ["y", "ッ", "っ"],
"ya": ["", "ヤ", "や"],
"ye": ["", "イェ", "いぇ"],
"yo": ["", "ヨ", "よ"],
"yu": ["", "ユ", "ゆ"],
"zz": ["z", "ッ", "っ"],
"z ": ["", "", " "],
"z*": ["", "", "※"],
"z,": ["", "", "‥"],
"z-": ["", "", "〜"],
"z.": ["", "", "…"],
"z/": ["", "", "・"],
"z0": ["", "", "○"],
"z@": ["", "", "◎"],
"z[": ["", "", "『"],
"z]": ["", "", "』"],
"z{": ["", "", "【"],
"z}": ["", "", "】"],
"z(": ["", "", "("],
"z)": ["", "", ")"],
"za": ["", "ザ", "ざ"],
"ze": ["", "ゼ", "ぜ"],
"zh": ["", "", "←"],
"zi": ["", "ジ", "じ"],
"zj": ["", "", "↓"],
"zk": ["", "", "↑"],
"zl": ["", "", "→"],
"zL": ["", "", "⇒"],
"zn": ["", "", "ー"],
"zo": ["", "ゾ", "ぞ"],
"zu": ["", "ズ", "ず"],
"zya": ["", "ジャ", "じゃ"],
"zye": ["", "ジェ", "じぇ"],
"zyi": ["", "ジィ", "じぃ"],
"zyo": ["", "ジョ", "じょ"],
"zyu": ["", "ジュ", "じゅ"],
":": ["", "", ":"],
";": ["", "", ";"],
"?": ["", "", "?"],
"[": ["", "", "「"],
"]": ["", "", "」"]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment