mirror of
https://github.com/vim/vim.git
synced 2025-08-27 20:13:38 -04:00
patch 8.0.1336: cannot use imactivatefunc() unless compiled with +xim
Problem: Cannot use imactivatefunc() unless compiled with +xim. Solution: Allow using imactivatefunc() when not compiled with +xim. (Yasuhiro Matsumoto, closes #2349)
This commit is contained in:
parent
291a9d15ed
commit
6315a9ae92
@ -26,8 +26,9 @@ For changing the language of messages and menus see |mlang.txt|.
|
|||||||
7. Input on X11 |mbyte-XIM|
|
7. Input on X11 |mbyte-XIM|
|
||||||
8. Input on MS-Windows |mbyte-IME|
|
8. Input on MS-Windows |mbyte-IME|
|
||||||
9. Input with a keymap |mbyte-keymap|
|
9. Input with a keymap |mbyte-keymap|
|
||||||
10. Using UTF-8 |mbyte-utf8|
|
10. Input with imactivatefunc() |mbyte-func|
|
||||||
11. Overview of options |mbyte-options|
|
11. Using UTF-8 |mbyte-utf8|
|
||||||
|
12. Overview of options |mbyte-options|
|
||||||
|
|
||||||
NOTE: This file contains UTF-8 characters. These may show up as strange
|
NOTE: This file contains UTF-8 characters. These may show up as strange
|
||||||
characters or boxes when using another encoding.
|
characters or boxes when using another encoding.
|
||||||
@ -1254,7 +1255,35 @@ Combining forms:
|
|||||||
ﭏ 0xfb4f Xal alef-lamed
|
ﭏ 0xfb4f Xal alef-lamed
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
10. Using UTF-8 *mbyte-utf8* *UTF-8* *utf-8* *utf8*
|
10. Input with imactivatefunc() *mbyte-func*
|
||||||
|
|
||||||
|
Vim has |imactivatefunc()| and |imstatusfunc()|. This is useful to
|
||||||
|
activate/deativate input method from Vim in any way, also with an external
|
||||||
|
command. For example, fcitx provide fcitx-remote command: >
|
||||||
|
|
||||||
|
set iminsert=2
|
||||||
|
set imsearch=2
|
||||||
|
set imcmdline
|
||||||
|
|
||||||
|
set imactivatefunc=ImActivate
|
||||||
|
function! ImActivate(active)
|
||||||
|
if a:active
|
||||||
|
call system('fcitx-remote -o')
|
||||||
|
else
|
||||||
|
call system('fcitx-remote -c')
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
set imstatusfunc=ImStatus
|
||||||
|
function! ImStatus()
|
||||||
|
return system('fcitx-remote')[0] is# '2'
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
Using this script, you can activate/deactivate XIM via Vim even when it is not
|
||||||
|
compiled with |+xim|.
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
11. Using UTF-8 *mbyte-utf8* *UTF-8* *utf-8* *utf8*
|
||||||
*Unicode* *unicode*
|
*Unicode* *unicode*
|
||||||
The Unicode character set was designed to include all characters from other
|
The Unicode character set was designed to include all characters from other
|
||||||
character sets. Therefore it is possible to write text in any language using
|
character sets. Therefore it is possible to write text in any language using
|
||||||
@ -1402,7 +1431,7 @@ not everybody is able to type a composing character.
|
|||||||
|
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
11. Overview of options *mbyte-options*
|
12. Overview of options *mbyte-options*
|
||||||
|
|
||||||
These options are relevant for editing multi-byte files. Check the help in
|
These options are relevant for editing multi-byte files. Check the help in
|
||||||
options.txt for detailed information.
|
options.txt for detailed information.
|
||||||
|
@ -4256,8 +4256,7 @@ A jump table for the options with a short description can be found at |Q_op|.
|
|||||||
'imactivatefunc' 'imaf' string (default "")
|
'imactivatefunc' 'imaf' string (default "")
|
||||||
global
|
global
|
||||||
{not in Vi}
|
{not in Vi}
|
||||||
{only available when compiled with |+xim| and
|
{only available when compiled with |+mbyte|}
|
||||||
|+GUI_GTK|}
|
|
||||||
This option specifies a function that will be called to
|
This option specifies a function that will be called to
|
||||||
activate/inactivate Input Method.
|
activate/inactivate Input Method.
|
||||||
|
|
||||||
@ -4308,8 +4307,7 @@ A jump table for the options with a short description can be found at |Q_op|.
|
|||||||
'imcmdline' 'imc' boolean (default off)
|
'imcmdline' 'imc' boolean (default off)
|
||||||
global
|
global
|
||||||
{not in Vi}
|
{not in Vi}
|
||||||
{only available when compiled with the |+xim|,
|
{only available when compiled with |+mbyte|}
|
||||||
|+multi_byte_ime| or |global-ime| features}
|
|
||||||
When set the Input Method is always on when starting to edit a command
|
When set the Input Method is always on when starting to edit a command
|
||||||
line, unless entering a search pattern (see 'imsearch' for that).
|
line, unless entering a search pattern (see 'imsearch' for that).
|
||||||
Setting this option is useful when your input method allows entering
|
Setting this option is useful when your input method allows entering
|
||||||
@ -4320,8 +4318,7 @@ A jump table for the options with a short description can be found at |Q_op|.
|
|||||||
'imdisable' 'imd' boolean (default off, on for some systems (SGI))
|
'imdisable' 'imd' boolean (default off, on for some systems (SGI))
|
||||||
global
|
global
|
||||||
{not in Vi}
|
{not in Vi}
|
||||||
{only available when compiled with the |+xim|,
|
{only available when compiled with |+mbyte|}
|
||||||
|+multi_byte_ime| or |global-ime| features}
|
|
||||||
When set the Input Method is never used. This is useful to disable
|
When set the Input Method is never used. This is useful to disable
|
||||||
the IM when it doesn't work properly.
|
the IM when it doesn't work properly.
|
||||||
Currently this option is on by default for SGI/IRIX machines. This
|
Currently this option is on by default for SGI/IRIX machines. This
|
||||||
@ -4336,8 +4333,6 @@ A jump table for the options with a short description can be found at |Q_op|.
|
|||||||
0 :lmap is off and IM is off
|
0 :lmap is off and IM is off
|
||||||
1 :lmap is ON and IM is off
|
1 :lmap is ON and IM is off
|
||||||
2 :lmap is off and IM is ON
|
2 :lmap is off and IM is ON
|
||||||
2 is available only when compiled with the |+multi_byte_ime|, |+xim|
|
|
||||||
or |global-ime|.
|
|
||||||
To always reset the option to zero when leaving Insert mode with <Esc>
|
To always reset the option to zero when leaving Insert mode with <Esc>
|
||||||
this can be used: >
|
this can be used: >
|
||||||
:inoremap <ESC> <ESC>:set iminsert=0<CR>
|
:inoremap <ESC> <ESC>:set iminsert=0<CR>
|
||||||
@ -4350,6 +4345,10 @@ A jump table for the options with a short description can be found at |Q_op|.
|
|||||||
The value 0 may not work correctly with Athena and Motif with some XIM
|
The value 0 may not work correctly with Athena and Motif with some XIM
|
||||||
methods. Use 'imdisable' to disable XIM then.
|
methods. Use 'imdisable' to disable XIM then.
|
||||||
|
|
||||||
|
You can set 'imactivatefunc' and 'imstatusfunc' to handle IME/XIM
|
||||||
|
via external command if vim is not compiled with the |+xim|,
|
||||||
|
|+multi_byte_ime| or |global-ime|.
|
||||||
|
|
||||||
*'imsearch'* *'ims'*
|
*'imsearch'* *'ims'*
|
||||||
'imsearch' 'ims' number (default -1)
|
'imsearch' 'ims' number (default -1)
|
||||||
local to buffer
|
local to buffer
|
||||||
@ -4372,8 +4371,7 @@ A jump table for the options with a short description can be found at |Q_op|.
|
|||||||
'imstatusfunc' 'imsf' string (default "")
|
'imstatusfunc' 'imsf' string (default "")
|
||||||
global
|
global
|
||||||
{not in Vi}
|
{not in Vi}
|
||||||
{only available when compiled with |+xim| and
|
{only available when compiled with |+mbyte|}
|
||||||
|+GUI_GTK|}
|
|
||||||
This option specifies a function that is called to obtain the status
|
This option specifies a function that is called to obtain the status
|
||||||
of Input Method. It must return a positive number when IME is active.
|
of Input Method. It must return a positive number when IME is active.
|
||||||
|
|
||||||
|
@ -2190,6 +2190,7 @@ test_arglist \
|
|||||||
test_highlight \
|
test_highlight \
|
||||||
test_history \
|
test_history \
|
||||||
test_hlsearch \
|
test_hlsearch \
|
||||||
|
test_iminsert \
|
||||||
test_increment \
|
test_increment \
|
||||||
test_increment_dbcs \
|
test_increment_dbcs \
|
||||||
test_ins_complete \
|
test_ins_complete \
|
||||||
|
72
src/mbyte.c
72
src/mbyte.c
@ -4782,6 +4782,20 @@ iconv_end(void)
|
|||||||
|
|
||||||
#endif /* FEAT_MBYTE */
|
#endif /* FEAT_MBYTE */
|
||||||
|
|
||||||
|
#ifdef FEAT_EVAL
|
||||||
|
static void
|
||||||
|
call_imactivatefunc(int active)
|
||||||
|
{
|
||||||
|
char_u *argv[1];
|
||||||
|
|
||||||
|
if (active)
|
||||||
|
argv[0] = (char_u *)"1";
|
||||||
|
else
|
||||||
|
argv[0] = (char_u *)"0";
|
||||||
|
(void)call_func_retnr(p_imaf, 1, argv, FALSE);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(FEAT_XIM) || defined(PROTO)
|
#if defined(FEAT_XIM) || defined(PROTO)
|
||||||
|
|
||||||
# if defined(FEAT_GUI_GTK) || defined(PROTO)
|
# if defined(FEAT_GUI_GTK) || defined(PROTO)
|
||||||
@ -4824,7 +4838,14 @@ im_set_active(int active)
|
|||||||
im_is_active = (active && !p_imdisable);
|
im_is_active = (active && !p_imdisable);
|
||||||
|
|
||||||
if (im_is_active != was_active)
|
if (im_is_active != was_active)
|
||||||
xim_reset();
|
{
|
||||||
|
#ifdef FEAT_EVAL
|
||||||
|
if (p_imaf[0] != NUL)
|
||||||
|
call_imactivatefunc(im_is_active);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
xim_reset();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -5666,15 +5687,7 @@ xim_reset(void)
|
|||||||
|
|
||||||
# ifdef FEAT_EVAL
|
# ifdef FEAT_EVAL
|
||||||
if (p_imaf[0] != NUL)
|
if (p_imaf[0] != NUL)
|
||||||
{
|
call_imactivatefunc(im_is_active);
|
||||||
char_u *argv[1];
|
|
||||||
|
|
||||||
if (im_is_active)
|
|
||||||
argv[0] = (char_u *)"1";
|
|
||||||
else
|
|
||||||
argv[0] = (char_u *)"0";
|
|
||||||
(void)call_func_retnr(p_imaf, 1, argv, FALSE);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
# endif
|
# endif
|
||||||
if (im_activatekey_keyval != GDK_VoidSymbol)
|
if (im_activatekey_keyval != GDK_VoidSymbol)
|
||||||
@ -6442,6 +6455,45 @@ xim_get_status_area_height(void)
|
|||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
#else /* !defined(FEAT_XIM) */
|
||||||
|
|
||||||
|
# ifndef FEAT_GUI_W32
|
||||||
|
int
|
||||||
|
im_get_status()
|
||||||
|
{
|
||||||
|
# ifdef FEAT_EVAL
|
||||||
|
if (p_imsf[0] != NUL)
|
||||||
|
{
|
||||||
|
int is_active;
|
||||||
|
|
||||||
|
/* FIXME: Don't execute user function in unsafe situation. */
|
||||||
|
if (exiting
|
||||||
|
# ifdef FEAT_AUTOCMD
|
||||||
|
|| is_autocmd_blocked()
|
||||||
|
# endif
|
||||||
|
)
|
||||||
|
return FALSE;
|
||||||
|
/* FIXME: :py print 'xxx' is shown duplicate result.
|
||||||
|
* Use silent to avoid it. */
|
||||||
|
++msg_silent;
|
||||||
|
is_active = call_func_retnr(p_imsf, 0, NULL, FALSE);
|
||||||
|
--msg_silent;
|
||||||
|
return (is_active > 0);
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
im_set_active(int active)
|
||||||
|
{
|
||||||
|
# ifdef(USE_IM_CONTROL) && defined(FEAT_EVAL)
|
||||||
|
if (p_imaf[0] != NUL)
|
||||||
|
call_imactivatefunc(p_imdisable ? FALSE : active);
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
#endif /* FEAT_XIM */
|
#endif /* FEAT_XIM */
|
||||||
|
|
||||||
#if defined(FEAT_MBYTE) || defined(PROTO)
|
#if defined(FEAT_MBYTE) || defined(PROTO)
|
||||||
|
@ -1539,7 +1539,7 @@ static struct vimoption options[] =
|
|||||||
(char_u *)&p_ic, PV_NONE,
|
(char_u *)&p_ic, PV_NONE,
|
||||||
{(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
|
{(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
|
||||||
{"imactivatefunc","imaf",P_STRING|P_VI_DEF|P_SECURE,
|
{"imactivatefunc","imaf",P_STRING|P_VI_DEF|P_SECURE,
|
||||||
# if defined(FEAT_EVAL) && defined(FEAT_XIM) && defined(FEAT_GUI_GTK)
|
#if defined(FEAT_EVAL) && defined(USE_IM_CONTROL)
|
||||||
(char_u *)&p_imaf, PV_NONE,
|
(char_u *)&p_imaf, PV_NONE,
|
||||||
{(char_u *)"", (char_u *)NULL}
|
{(char_u *)"", (char_u *)NULL}
|
||||||
# else
|
# else
|
||||||
@ -1582,7 +1582,7 @@ static struct vimoption options[] =
|
|||||||
{(char_u *)B_IMODE_USE_INSERT, (char_u *)0L}
|
{(char_u *)B_IMODE_USE_INSERT, (char_u *)0L}
|
||||||
SCRIPTID_INIT},
|
SCRIPTID_INIT},
|
||||||
{"imstatusfunc","imsf",P_STRING|P_VI_DEF|P_SECURE,
|
{"imstatusfunc","imsf",P_STRING|P_VI_DEF|P_SECURE,
|
||||||
#if defined(FEAT_EVAL) && defined(FEAT_XIM) && defined(FEAT_GUI_GTK)
|
#if defined(FEAT_EVAL) && defined(USE_IM_CONTROL)
|
||||||
(char_u *)&p_imsf, PV_NONE,
|
(char_u *)&p_imsf, PV_NONE,
|
||||||
{(char_u *)"", (char_u *)NULL}
|
{(char_u *)"", (char_u *)NULL}
|
||||||
#else
|
#else
|
||||||
|
@ -581,11 +581,13 @@ EXTERN char_u *p_iconstring; /* 'iconstring' */
|
|||||||
EXTERN int p_ic; /* 'ignorecase' */
|
EXTERN int p_ic; /* 'ignorecase' */
|
||||||
#if defined(FEAT_XIM) && defined(FEAT_GUI_GTK)
|
#if defined(FEAT_XIM) && defined(FEAT_GUI_GTK)
|
||||||
EXTERN char_u *p_imak; /* 'imactivatekey' */
|
EXTERN char_u *p_imak; /* 'imactivatekey' */
|
||||||
|
#define IM_ON_THE_SPOT 0L
|
||||||
|
#define IM_OVER_THE_SPOT 1L
|
||||||
|
EXTERN long p_imst; /* 'imstyle' */
|
||||||
|
#endif
|
||||||
|
#if defined(FEAT_EVAL) && defined(USE_IM_CONTROL)
|
||||||
EXTERN char_u *p_imaf; /* 'imactivatefunc' */
|
EXTERN char_u *p_imaf; /* 'imactivatefunc' */
|
||||||
EXTERN char_u *p_imsf; /* 'imstatusfunc' */
|
EXTERN char_u *p_imsf; /* 'imstatusfunc' */
|
||||||
EXTERN long p_imst; /* 'imstyle' */
|
|
||||||
# define IM_ON_THE_SPOT 0L
|
|
||||||
# define IM_OVER_THE_SPOT 1L
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef USE_IM_CONTROL
|
#ifdef USE_IM_CONTROL
|
||||||
EXTERN int p_imcmdline; /* 'imcmdline' */
|
EXTERN int p_imcmdline; /* 'imcmdline' */
|
||||||
|
@ -2091,12 +2091,8 @@ struct file_buffer
|
|||||||
#define B_IMODE_USE_INSERT -1 /* Use b_p_iminsert value for search */
|
#define B_IMODE_USE_INSERT -1 /* Use b_p_iminsert value for search */
|
||||||
#define B_IMODE_NONE 0 /* Input via none */
|
#define B_IMODE_NONE 0 /* Input via none */
|
||||||
#define B_IMODE_LMAP 1 /* Input via langmap */
|
#define B_IMODE_LMAP 1 /* Input via langmap */
|
||||||
#ifndef USE_IM_CONTROL
|
#define B_IMODE_IM 2 /* Input via input method */
|
||||||
# define B_IMODE_LAST 1
|
#define B_IMODE_LAST 2
|
||||||
#else
|
|
||||||
# define B_IMODE_IM 2 /* Input via input method */
|
|
||||||
# define B_IMODE_LAST 2
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef FEAT_KEYMAP
|
#ifdef FEAT_KEYMAP
|
||||||
short b_kmap_state; /* using "lmap" mappings */
|
short b_kmap_state; /* using "lmap" mappings */
|
||||||
|
@ -115,6 +115,7 @@ NEW_TESTS = test_arabic.res \
|
|||||||
test_highlight.res \
|
test_highlight.res \
|
||||||
test_history.res \
|
test_history.res \
|
||||||
test_hlsearch.res \
|
test_hlsearch.res \
|
||||||
|
test_iminsert.res \
|
||||||
test_increment.res \
|
test_increment.res \
|
||||||
test_increment_dbcs.res \
|
test_increment_dbcs.res \
|
||||||
test_ins_complete.res \
|
test_ins_complete.res \
|
||||||
|
29
src/testdir/test_iminsert.vim
Normal file
29
src/testdir/test_iminsert.vim
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
if !has('multi_byte')
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
source view_util.vim
|
||||||
|
|
||||||
|
let s:imactivatefunc_called = 0
|
||||||
|
let s:imstatusfunc_called = 0
|
||||||
|
|
||||||
|
func IM_activatefunc(active)
|
||||||
|
let s:imactivatefunc_called = 1
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
func IM_statusfunc()
|
||||||
|
let s:imstatusfunc_called = 1
|
||||||
|
return 0
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
func Test_iminsert2()
|
||||||
|
set imactivatefunc=IM_activatefunc
|
||||||
|
set imstatusfunc=IM_statusfunc
|
||||||
|
set iminsert=2
|
||||||
|
normal! i
|
||||||
|
set iminsert=0
|
||||||
|
set imactivatefunc=
|
||||||
|
set imstatusfunc=
|
||||||
|
call assert_equal(1, s:imactivatefunc_called)
|
||||||
|
call assert_equal(1, s:imstatusfunc_called)
|
||||||
|
endfunc
|
@ -771,6 +771,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1336,
|
||||||
/**/
|
/**/
|
||||||
1335,
|
1335,
|
||||||
/**/
|
/**/
|
||||||
|
@ -536,9 +536,7 @@ typedef unsigned long u8char_T; /* long should be 32 bits or more */
|
|||||||
/*
|
/*
|
||||||
* Check input method control.
|
* Check input method control.
|
||||||
*/
|
*/
|
||||||
#if defined(FEAT_XIM) \
|
#if defined(FEAT_MBYTE)
|
||||||
|| (defined(FEAT_GUI) && (defined(FEAT_MBYTE_IME) || defined(GLOBAL_IME))) \
|
|
||||||
|| (defined(FEAT_GUI_MAC) && defined(FEAT_MBYTE))
|
|
||||||
# define USE_IM_CONTROL
|
# define USE_IM_CONTROL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user