summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-09-07 15:08:38 +0200
committerBram Moolenaar <Bram@vim.org>2019-09-07 15:08:38 +0200
commita3a124627d2eb9d36e3dc3757429d87e041f8c0b (patch)
tree21060d151a17a390b7233c41048ff760a6c32ed5
parent1b33bee35ed53b8d6f5c66a0e0a2da3c11bb7f3b (diff)
downloadvim-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.txt6
-rw-r--r--src/evalfunc.c1
-rw-r--r--src/mbyte.c12
-rw-r--r--src/proto/mbyte.pro1
-rw-r--r--src/testdir/test_iminsert.vim33
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