]> granicus.if.org Git - vim/commitdiff
patch 8.1.2000: plugin cannot get the current IME status v8.1.2000
authorBram Moolenaar <Bram@vim.org>
Sat, 7 Sep 2019 13:08:38 +0000 (15:08 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 7 Sep 2019 13:08:38 +0000 (15:08 +0200)
Problem:    Plugin cannot get the current IME status.
Solution:   Add the getimstatus() function. (closes #4904)

runtime/doc/eval.txt
src/evalfunc.c
src/mbyte.c
src/proto/mbyte.pro
src/testdir/test_iminsert.vim

index 56aa6a345f47d459afaed6bffde87e36ca228923..26a28dca3e039f2fbe4aba81aa1bc057f49a348b 100644 (file)
@@ -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.
 
index 0aa8fbfd09eb255450f8b51588863ac55aa76540..b2ab63dbce3945b36e68db7b89a0835b6f84ddce 100644 (file)
@@ -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},
index 2b764006628900c4e264392567cf551437bef61c..808194f792a308ed674e47dc79ad73cfd556e4fa 100644 (file)
@@ -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".
index b9f043996ef51ab999fb7fd3d281bec3926e3526..86b525c4685277c79f50e51d96aae19e26ef0618 100644 (file)
@@ -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);
index 1a8e4c8a14eb0205500059f49c4dc5e035cb51df..9316ff63af7a71cc2fdf78ba3a21474f1127a835 100644 (file)
@@ -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