0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

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 #4904)
This commit is contained in:
Bram Moolenaar
2019-09-07 15:08:38 +02:00
parent 1b33bee35e
commit a3a124627d
5 changed files with 52 additions and 1 deletions

View 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.

View 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},

View 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".

View 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);

View 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