# HG changeset patch # User Bram Moolenaar # Date 1567862104 -7200 # Node ID 8ae3337566143836023b6fa29f9613f7c92971b0 # Parent 3558fd8f7a926b191e8ada00a971f761866da38d patch 8.1.2000: plugin cannot get the current IME status Commit: https://github.com/vim/vim/commit/a3a124627d2eb9d36e3dc3757429d87e041f8c0b Author: Bram Moolenaar Date: Sat Sep 7 15:08:38 2019 +0200 patch 8.1.2000: plugin cannot get the current IME status Problem: Plugin cannot get the current IME status. Solution: Add the getimstatus() function. (closes https://github.com/vim/vim/issues/4904) diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -2468,6 +2468,7 @@ getfperm({fname}) String file permissio getfsize({fname}) Number size in bytes of file {fname} getftime({fname}) Number last modification time of file getftype({fname}) String description of type of file {fname} +getimstatus() Number |TRUE| if the IME status is active getjumplist([{winnr} [, {tabnr}]]) List list of jump list items getline({lnum}) String line {lnum} of current buffer @@ -5202,6 +5203,11 @@ getftype({fname}) *getftype()* Can also be used as a |method|: > GetFilename()->getftype() +getimstatus() *getimstatus()* + The result is a Number, which is |TRUE| when the IME status is + active. + See 'imstatusfunc'. + getjumplist([{winnr} [, {tabnr}]]) *getjumplist()* Returns the |jumplist| for the specified window. diff --git a/src/evalfunc.c b/src/evalfunc.c --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -507,6 +507,7 @@ static funcentry_T global_functions[] = {"getfsize", 1, 1, FEARG_1, f_getfsize}, {"getftime", 1, 1, FEARG_1, f_getftime}, {"getftype", 1, 1, FEARG_1, f_getftype}, + {"getimstatus", 0, 0, 0, f_getimstatus}, {"getjumplist", 0, 2, FEARG_1, f_getjumplist}, {"getline", 1, 2, FEARG_1, f_getline}, {"getloclist", 1, 2, 0, f_getloclist}, diff --git a/src/mbyte.c b/src/mbyte.c --- a/src/mbyte.c +++ b/src/mbyte.c @@ -6497,6 +6497,18 @@ im_set_position(int row UNUSED, int col #endif /* FEAT_XIM */ +#if defined(FEAT_EVAL) || defined(PROTO) +/* + * "getimstatus()" function + */ + void +f_getimstatus(typval_T *argvars UNUSED, typval_T *rettv) +{ +# if defined(HAVE_INPUT_METHOD) + rettv->vval.v_number = im_get_status(); +# endif +} +#endif /* * Setup "vcp" for conversion from "from" to "to". diff --git a/src/proto/mbyte.pro b/src/proto/mbyte.pro --- a/src/proto/mbyte.pro +++ b/src/proto/mbyte.pro @@ -90,6 +90,7 @@ int preedit_get_status(void); int im_is_preediting(void); void xim_set_status_area(void); int xim_get_status_area_height(void); +void f_getimstatus(typval_T *argvars, typval_T *rettv); int convert_setup(vimconv_T *vcp, char_u *from, char_u *to); int convert_setup_ext(vimconv_T *vcp, char_u *from, int from_unicode_is_utf8, char_u *to, int to_unicode_is_utf8); int convert_input(char_u *ptr, int len, int maxlen); diff --git a/src/testdir/test_iminsert.vim b/src/testdir/test_iminsert.vim --- a/src/testdir/test_iminsert.vim +++ b/src/testdir/test_iminsert.vim @@ -2,17 +2,22 @@ source view_util.vim 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 0 + 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 @@ -25,3 +30,29 @@ func Test_iminsert2() call assert_equal(expected, s:imactivatefunc_called) call assert_equal(expected, s:imstatusfunc_called) endfunc + +func Test_imgetstatus() + if has('gui_running') + if !has('win32') + throw 'Skipped: running in the GUI, only works on MS-Windows' + endif + 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\=getimstatus()\\", 'nx') + call assert_equal('1', getline(1)) + set iminsert=0 + call feedkeys("o\=getimstatus()\\", 'nx') + call assert_equal('0', getline(2)) + bw! + + set imactivatefunc= + set imstatusfunc= +endfunc