diff --git a/autoload/eskk.vim b/autoload/eskk.vim index f9debe77..20d5e575 100644 --- a/autoload/eskk.vim +++ b/autoload/eskk.vim @@ -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() @@ -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 "\" + endif + endif return '' endif if exists('b:skk_on') && b:skk_on @@ -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 . "\" + let ret = kakutei_str . (was_im_enabled ? "\" : '') call s:dict_update_rank() else setlocal iminsert=0 imsearch=0 diff --git a/test/02-input/05-keep-state-toggle.vim b/test/02-input/05-keep-state-toggle.vim new file mode 100644 index 00000000..313bd1a4 --- /dev/null +++ b/test/02-input/05-keep-state-toggle.vim @@ -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 +" }}}