blob: 918f17d4c9e5417599825f21a61a2073e1a6e2d8 [file] [log] [blame] [edit]
" Test for 'iminsert'
import './util/vim9.vim' as v9
let s:imactivatefunc_called = 0
let s:imstatusfunc_called = 0
let s:imstatus_active = 0
func IM_activatefunc(active)
let s:imactivatefunc_called = 1
let s:imstatus_active = a:active
endfunc
func IM_statusfunc()
let s:imstatusfunc_called = 1
return s:imstatus_active
endfunc
func Test_iminsert2()
let s:imactivatefunc_called = 0
let s:imstatusfunc_called = 0
set imactivatefunc=IM_activatefunc
set imstatusfunc=IM_statusfunc
set iminsert=2
normal! i
set iminsert=0
set imactivatefunc=
set imstatusfunc=
let expected = (has('win32') && has('gui_running')) ? 0 : 1
call assert_equal(expected, s:imactivatefunc_called)
call assert_equal(expected, s:imstatusfunc_called)
endfunc
func Test_getimstatus()
if has('win32')
CheckFeature multi_byte_ime
else
CheckFeature xim
endif
if has('win32') && has('gui_running')
set imactivatefunc=
set imstatusfunc=
else
set imactivatefunc=IM_activatefunc
set imstatusfunc=IM_statusfunc
let s:imstatus_active = 0
endif
new
set iminsert=2
call feedkeys("i\<C-R>=getimstatus()\<CR>\<ESC>", 'nx')
call assert_equal('1', getline(1))
set iminsert=0
call feedkeys("o\<C-R>=getimstatus()\<CR>\<ESC>", 'nx')
call assert_equal('0', getline(2))
bw!
set imactivatefunc=
set imstatusfunc=
endfunc
func Test_imactivatefunc_imstatusfunc_callback_no_breaks_foldopen()
CheckScreendump
let lines =<< trim END
func IM_activatefunc(active)
endfunc
func IM_statusfunc()
return 0
endfunc
set imactivatefunc=IM_activatefunc
set imstatusfunc=IM_statusfunc
set foldmethod=marker
set foldopen=search
call setline(1, ['{{{', 'abc', '}}}'])
%foldclose
END
call writefile(lines, 'Xscript', 'D')
let buf = RunVimInTerminal('-S Xscript', {})
call assert_notequal('abc', term_getline(buf, 2))
call term_sendkeys(buf, "/abc\n")
call WaitForAssert({-> assert_equal('abc', term_getline(buf, 2))})
" clean up
call StopVimInTerminal(buf)
endfunc
" Test for using an lmap in insert mode
func Test_lmap_in_insert_mode()
new
call setline(1, 'abc')
lmap { w
set iminsert=1
call feedkeys('r{', 'xt')
call assert_equal('wbc', getline(1))
set iminsert=2
call feedkeys('$r{', 'xt')
call assert_equal('wb{', getline(1))
call setline(1, 'vim web')
set iminsert=1
call feedkeys('0f{', 'xt')
call assert_equal(5, col('.'))
set iminsert&
lunmap {
close!
endfunc
" Test for using CTRL-^ to toggle iminsert in insert mode
func Test_iminsert_toggle()
CheckGui
if has('win32')
CheckFeature multi_byte_ime
else
CheckFeature xim
endif
if has('gui_running') && !has('win32')
throw 'Skipped: works only in Win32 GUI version (for some reason)'
endif
new
let save_imdisable = &imdisable
let save_iminsert = &iminsert
set noimdisable
set iminsert=0
exe "normal i\<C-^>"
call assert_equal(2, &iminsert)
exe "normal i\<C-^>"
call assert_equal(0, &iminsert)
let &iminsert = save_iminsert
let &imdisable = save_imdisable
close!
endfunc
" Test for different ways of setting the 'imactivatefunc' and 'imstatusfunc'
" options
func Test_imactivatefunc_imstatusfunc_callback()
CheckNotMSWindows
func IMactivatefunc1(active)
let g:IMactivatefunc_called += 1
endfunc
func IMstatusfunc1()
let g:IMstatusfunc_called += 1
return 1
endfunc
set iminsert=2
let lines =<< trim END
LET g:IMactivatefunc_called = 0
LET g:IMstatusfunc_called = 0
#" Test for using a function name
LET &imactivatefunc = 'g:IMactivatefunc1'
LET &imstatusfunc = 'g:IMstatusfunc1'
normal! i
#" Test for using a function()
set imactivatefunc=function('g:IMactivatefunc1')
set imstatusfunc=function('g:IMstatusfunc1')
normal! i
#" Using a funcref variable to set 'completefunc'
VAR Fn1 = function('g:IMactivatefunc1')
LET &imactivatefunc = Fn1
VAR Fn2 = function('g:IMstatusfunc1')
LET &imstatusfunc = Fn2
normal! i
#" Using a string(funcref variable) to set 'completefunc'
LET &imactivatefunc = string(Fn1)
LET &imstatusfunc = string(Fn2)
normal! i
#" Test for using a funcref()
set imactivatefunc=funcref('g:IMactivatefunc1')
set imstatusfunc=funcref('g:IMstatusfunc1')
normal! i
#" Using a funcref variable to set 'imactivatefunc'
LET Fn1 = funcref('g:IMactivatefunc1')
LET &imactivatefunc = Fn1
LET Fn2 = funcref('g:IMstatusfunc1')
LET &imstatusfunc = Fn2
normal! i
#" Using a string(funcref variable) to set 'imactivatefunc'
LET &imactivatefunc = string(Fn1)
LET &imstatusfunc = string(Fn2)
normal! i
#" Test for using a lambda function
VAR optval = "LSTART a LMIDDLE g:IMactivatefunc1(a) LEND"
LET optval = substitute(optval, ' ', '\\ ', 'g')
exe "set imactivatefunc=" .. optval
LET optval = "LSTART LMIDDLE g:IMstatusfunc1() LEND"
LET optval = substitute(optval, ' ', '\\ ', 'g')
exe "set imstatusfunc=" .. optval
normal! i
#" Set 'imactivatefunc' and 'imstatusfunc' to a lambda expression
LET &imactivatefunc = LSTART a LMIDDLE g:IMactivatefunc1(a) LEND
LET &imstatusfunc = LSTART LMIDDLE g:IMstatusfunc1() LEND
normal! i
#" Set 'imactivatefunc' and 'imstatusfunc' to a string(lambda expression)
LET &imactivatefunc = 'LSTART a LMIDDLE g:IMactivatefunc1(a) LEND'
LET &imstatusfunc = 'LSTART LMIDDLE g:IMstatusfunc1() LEND'
normal! i
#" Set 'imactivatefunc' 'imstatusfunc' to a variable with a lambda
#" expression
VAR Lambda1 = LSTART a LMIDDLE g:IMactivatefunc1(a) LEND
VAR Lambda2 = LSTART LMIDDLE g:IMstatusfunc1() LEND
LET &imactivatefunc = Lambda1
LET &imstatusfunc = Lambda2
normal! i
#" Set 'imactivatefunc' 'imstatusfunc' to a string(variable with a lambda
#" expression)
LET &imactivatefunc = string(Lambda1)
LET &imstatusfunc = string(Lambda2)
normal! i
#" Test for clearing the 'completefunc' option
set imactivatefunc='' imstatusfunc=''
set imactivatefunc& imstatusfunc&
set imactivatefunc=g:IMactivatefunc1
set imstatusfunc=g:IMstatusfunc1
call assert_fails("set imactivatefunc=function('abc')", "E700:")
call assert_fails("set imstatusfunc=function('abc')", "E700:")
call assert_fails("set imactivatefunc=funcref('abc')", "E700:")
call assert_fails("set imstatusfunc=funcref('abc')", "E700:")
call assert_fails("LET &imstatusfunc = function('abc')", "E700:")
call assert_fails("LET &imactivatefunc = function('abc')", "E700:")
normal! i
#" set 'imactivatefunc' and 'imstatusfunc' to a non-existing function
set imactivatefunc=IMactivatefunc1
set imstatusfunc=IMstatusfunc1
call assert_fails("set imactivatefunc=function('NonExistingFunc')", 'E700:')
call assert_fails("set imstatusfunc=function('NonExistingFunc')", 'E700:')
call assert_fails("LET &imactivatefunc = function('NonExistingFunc')", 'E700:')
call assert_fails("LET &imstatusfunc = function('NonExistingFunc')", 'E700:')
normal! i
call assert_equal(14, g:IMactivatefunc_called)
call assert_equal(28, g:IMstatusfunc_called)
END
call v9.CheckLegacyAndVim9Success(lines)
" Using Vim9 lambda expression in legacy context should fail
set imactivatefunc=(a)\ =>\ IMactivatefunc1(a)
set imstatusfunc=IMstatusfunc1
call assert_fails('normal! i', 'E117:')
set imactivatefunc=IMactivatefunc1
set imstatusfunc=()\ =>\ IMstatusfunc1(a)
call assert_fails('normal! i', 'E117:')
" set 'imactivatefunc' and 'imstatusfunc' to a partial with dict. This used
" to cause a crash.
func SetIMFunc()
let params1 = {'activate': function('g:DictActivateFunc')}
let params2 = {'status': function('g:DictStatusFunc')}
let &imactivatefunc = params1.activate
let &imstatusfunc = params2.status
endfunc
func g:DictActivateFunc(_) dict
endfunc
func g:DictStatusFunc(_) dict
endfunc
call SetIMFunc()
new
call SetIMFunc()
bw
call test_garbagecollect_now()
new
set imactivatefunc=
set imstatusfunc=
wincmd w
set imactivatefunc=
set imstatusfunc=
:%bw!
delfunc g:DictActivateFunc
delfunc g:DictStatusFunc
delfunc SetIMFunc
" Vim9 tests
let lines =<< trim END
vim9script
# Test for using function()
def IMactivatefunc1(active: number): any
g:IMactivatefunc_called += 1
return 1
enddef
def IMstatusfunc1(): number
g:IMstatusfunc_called += 1
return 1
enddef
g:IMactivatefunc_called = 0
g:IMstatusfunc_called = 0
set iminsert=2
set imactivatefunc=function('IMactivatefunc1')
set imstatusfunc=function('IMstatusfunc1')
normal! i
set iminsert=0
set imactivatefunc=
set imstatusfunc=
END
call v9.CheckScriptSuccess(lines)
" cleanup
set iminsert=0
set imactivatefunc&
set imstatusfunc&
delfunc IMactivatefunc1
delfunc IMstatusfunc1
unlet g:IMactivatefunc_called g:IMstatusfunc_called
%bw!
endfunc
" vim: shiftwidth=2 sts=2 expandtab