Skip to content
25 changes: 22 additions & 3 deletions autoload/eskk.vim
Original file line number Diff line number Diff line change
Expand Up @@ -1842,8 +1842,16 @@ endfunction "}}}

" Enable/Disable IM
function! eskk#is_enabled() abort "{{{
return eskk#is_initialized()
\ && &iminsert is 1
if !eskk#is_initialized()
return 0
endif
if &iminsert is 1
return 1
endif
return has_key(eskk#get_buffer_instance(), 'prev_lang_keys')
endfunction "}}}
function! s:is_im_enabled_in_current_mode() abort "{{{
return mode() ==# 'c' ? (&imsearch ==# 1) : (&iminsert ==# 1)
endfunction "}}}
function! eskk#toggle() abort "{{{
if !eskk#is_initialized()
Expand All @@ -1860,6 +1868,16 @@ function! eskk#enable() abort "{{{
if eskk#is_enabled()
" Initialize mode.
call eskk#set_mode(g:eskk#initial_mode)
if mode() =~# '^[ic]$'
if !s:is_im_enabled_in_current_mode()
" NOTE: Vim can't enter lang-mode immediately
" in insert-mode or commandline-mode.
" We have to use i_CTRL-^ .
setlocal iminsert=1 imsearch=1
redrawstatus
return "\<C-^>"
endif
endif
return ''
endif
if exists('b:skk_on') && b:skk_on
Expand Down Expand Up @@ -1946,10 +1964,11 @@ function! eskk#disable() abort "{{{
" NOTE: Vim can't escape lang-mode immediately
" in insert-mode or commandline-mode.
" We have to use i_CTRL-^ .
let was_im_enabled = s:is_im_enabled_in_current_mode()
setlocal iminsert=0 imsearch=0
redrawstatus
let kakutei_str = eskk#get_preedit().generate_kakutei_str()
let ret = kakutei_str . "\<C-^>"
let ret = kakutei_str . (was_im_enabled ? "\<C-^>" : '')
call s:dict_update_rank()
else
setlocal iminsert=0 imsearch=0
Expand Down
47 changes: 47 additions & 0 deletions test/02-input/05-keep-state-toggle.vim
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
" vim:foldmethod=marker:fen:
scriptencoding utf-8

" Saving 'cpoptions' {{{
let s:save_cpo = &cpo
set cpo&vim
" }}}


function! s:run() abort "{{{
let save_iminsert = &l:iminsert
try
call eskk#enable()
let inst = eskk#get_buffer_instance()
OK has_key(inst, 'prev_lang_keys')
OK eskk#is_enabled()

let &l:iminsert = 0
OK eskk#is_enabled()

call eskk#toggle()
let inst = eskk#get_buffer_instance()
OK !has_key(inst, 'prev_lang_keys')
OK !eskk#is_enabled()

call eskk#enable()
let &l:iminsert = 0
let &l:imsearch = 1
OK eskk#is_enabled()

call eskk#disable()
let inst = eskk#get_buffer_instance()
OK !has_key(inst, 'prev_lang_keys')
OK !eskk#is_enabled()
finally
call eskk#disable()
let &l:iminsert = save_iminsert
endtry
endfunction "}}}

call s:run()
Done


" Restore 'cpoptions' {{{
let &cpo = s:save_cpo
" }}}