changeset 18008:8ae333756614 v8.1.2000

patch 8.1.2000: plugin cannot get the current IME status Commit: https://github.com/vim/vim/commit/a3a124627d2eb9d36e3dc3757429d87e041f8c0b Author: Bram Moolenaar <Bram@vim.org> 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)
author Bram Moolenaar <Bram@vim.org>
date Sat, 07 Sep 2019 15:15:04 +0200
parents 3558fd8f7a92
children 40255308856f
files runtime/doc/eval.txt src/evalfunc.c src/mbyte.c src/proto/mbyte.pro src/testdir/test_iminsert.vim
diffstat 5 files changed, 52 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- 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.
 
--- 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},
--- 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".
--- 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);
--- 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