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