diff options
author | Bram Moolenaar <Bram@vim.org> | 2019-09-07 15:08:38 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2019-09-07 15:08:38 +0200 |
commit | a3a124627d2eb9d36e3dc3757429d87e041f8c0b (patch) | |
tree | 21060d151a17a390b7233c41048ff760a6c32ed5 | |
parent | 1b33bee35ed53b8d6f5c66a0e0a2da3c11bb7f3b (diff) | |
download | vim-git-a3a124627d2eb9d36e3dc3757429d87e041f8c0b.tar.gz |
patch 8.1.2000: plugin cannot get the current IME statusv8.1.2000
Problem: Plugin cannot get the current IME status.
Solution: Add the getimstatus() function. (closes #4904)
-rw-r--r-- | runtime/doc/eval.txt | 6 | ||||
-rw-r--r-- | src/evalfunc.c | 1 | ||||
-rw-r--r-- | src/mbyte.c | 12 | ||||
-rw-r--r-- | src/proto/mbyte.pro | 1 | ||||
-rw-r--r-- | src/testdir/test_iminsert.vim | 33 |
5 files changed, 52 insertions, 1 deletions
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index 56aa6a345..26a28dca3 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -2468,6 +2468,7 @@ getfperm({fname}) String file permissions of file {fname} 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 index 0aa8fbfd0..b2ab63dbc 100644 --- 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 index 2b7640066..808194f79 100644 --- a/src/mbyte.c +++ b/src/mbyte.c @@ -6497,6 +6497,18 @@ im_set_position(int row UNUSED, int col UNUSED) #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 index b9f043996..86b525c46 100644 --- 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 index 1a8e4c8a1..9316ff63a 100644 --- 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\<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 |