Skip to content

Commit

Permalink
feat: add han_kata and dakuten modes
Browse files Browse the repository at this point in the history
  • Loading branch information
kawarimidoll committed Nov 21, 2023
1 parent 999f99d commit 2c920e1
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 12 deletions.
52 changes: 41 additions & 11 deletions k.vim
Original file line number Diff line number Diff line change
Expand Up @@ -129,18 +129,50 @@ function! k#zen_kata(...) abort
return repeat("\<bs>", strcharlen(preceding_str)) .. s:hira_to_kata(preceding_str)
endfunction

function! k#han_kata(...) abort
let current_pos = getcharpos('.')[1:2]
if s:henkan_start_pos[0] != current_pos[0] || s:henkan_start_pos[1] > current_pos[1]
call s:toggle_inner_mode('han_kata')
return ''
endif

let preceding_str = getline('.')->slice(s:henkan_start_pos[1]-1, charcol('.')-1)
\->substitute("n$", "", "")
call s:clear_henkan_start_pos()
return repeat("\<bs>", strcharlen(preceding_str)) .. s:zen_kata_to_han_kata(s:hira_to_kata(preceding_str))
endfunction

function! k#dakuten(...) abort
let current_pos = getcharpos('.')[1:2]
if s:henkan_start_pos[0] != current_pos[0] || s:henkan_start_pos[1] > current_pos[1]
call s:toggle_inner_mode('dakuten')
return ''
endif

let preceding_str = getline('.')->slice(s:henkan_start_pos[1]-1, charcol('.')-1)
\->substitute("n$", "", "")
call s:clear_henkan_start_pos()
return repeat("\<bs>", strcharlen(preceding_str)) .. substitute(preceding_str, '.\ze', {m -> m[0] .. ''}, 'g')
endfunction

function! k#ins(key, henkan = v:false) abort
let spec = s:get_insert_spec(a:key, a:henkan)

if type(spec) == v:t_dict
return call($'k#{spec.func}', [a:key])
return get(spec, 'prefix', '') .. call($'k#{spec.func}', [a:key])
endif

let char = spec

if s:inner_mode == 'zen_kata'
return s:hira_to_kata(char)
endif
if s:inner_mode == 'han_kata'
return s:zen_kata_to_han_kata(s:hira_to_kata(char))
endif
if s:inner_mode == 'dakuten'
return char2nr(char, v:true) < 128 ? char : char .. ''
endif

" TODO: implement other modes
return char
Expand Down Expand Up @@ -177,7 +209,13 @@ function! s:get_insert_spec(key, henkan = v:false) abort
while i > 0
let tail_str = slice(preceding_str, -i)
if has_key(kana_dict, tail_str)
return repeat("\<bs>", i) .. kana_dict[tail_str]
if type(kana_dict[tail_str]) == v:t_dict
let result = { 'prefix': repeat("\<bs>", i) }
call extend(result, kana_dict[tail_str])
return result
else
return repeat("\<bs>", i) .. kana_dict[tail_str]
endif
endif
let i -= 1
endwhile
Expand Down Expand Up @@ -242,15 +280,7 @@ let s:hankana_list = ('ァアィイゥウェエォオカガキギクグ
\ .. 'マミムメモャヤュユョヨラリルレロワワイエヲンヴーカケ')
\ ->split('.[゙゚]\?\zs')
let s:zen_kata_origin = char2nr('', v:true)
let s:griph_map = {
\ '': '-',
\ '': '~',
\ '': '',
\ '': '',
\ '': '',
\ '': '',
\ '': ''
\ }
let s:griph_map = { '': '-', '': '~', '': '', '': '', '': '', '': '', '': '' }

function! s:zen_kata_to_han_kata(str) abort
return a:str->substitute('.', {m->get(s:griph_map,m[0],m[0])}, 'g')
Expand Down
3 changes: 2 additions & 1 deletion kana_table.json
Original file line number Diff line number Diff line change
Expand Up @@ -216,5 +216,6 @@
"q": { "func": "zen_kata" },
"<cr>": { "func": "kakutei" },
"<space>": { "func": "henkan" },
"<c-q>": { "func": "han_kata" }
"zq": { "func": "han_kata" },
"zw": { "func": "dakuten" }
}

0 comments on commit 2c920e1

Please sign in to comment.