# HG changeset patch # User Christian Brabandt # Date 1447163104 -3600 # Node ID 2c00f6b312bf06d685c73a6b911b3cd59425f886 # Parent b5b56b0bbd3da9351b9407a1d343f313065782f1 commit https://github.com/vim/vim/commit/72f4cc4a987d123c0ed909c85b9a05f65cef7202 Author: Bram Moolenaar Date: Tue Nov 10 14:35:18 2015 +0100 patch 7.4.913 Problem: No utf-8 support for the hangul input feature. Solution: Add utf-8 support. (Namsh) diff --git a/runtime/doc/hangulin.txt b/runtime/doc/hangulin.txt --- a/runtime/doc/hangulin.txt +++ b/runtime/doc/hangulin.txt @@ -1,11 +1,8 @@ -*hangulin.txt* For Vim version 7.4. Last change: 2009 Jun 24 +*hangulin.txt* For Vim version 7.4. Last change: 2015 Nov 10 VIM REFERENCE MANUAL by Chi-Deok Hwang and Sung-Hyun Nam -NOTE: The |+hangul_input| feature is scheduled to be removed. If you want to -keep it, please send a message to the Vim user maillist. - Introduction *hangul* ------------ @@ -17,7 +14,8 @@ Compile ------- Next is a basic option. You can add any other configure option. > - ./configure --with-x --enable-multibyte --enable-fontset --enable-hangulinput + ./configure --with-x --enable-multibyte --enable-hangulinput \ + --disable-xim And you should check feature.h. If |+hangul_input| feature is enabled by configure, you can select more options such as keyboard type, 2 bulsik @@ -26,18 +24,21 @@ or 3 bulsik. You can find keywords like #define HANGUL_DEFAULT_KEYBOARD 2 #define ESC_CHG_TO_ENG_MODE /* #define X_LOCALE */ - /* #define SLOW_XSERVER */ Environment variables --------------------- -You should set LANG variable to Korean locale such as ko or ko_KR.euc. +You should set LANG variable to Korean locale such as ko, ko_KR.eucKR +or ko_KR.UTF-8. If you set LC_ALL variable, it should be set to Korean locale also. VIM resource ------------ -You should add nexts to your global vimrc ($HOME/.vimrc). > +You may want to set 'encoding' and 'fileencodings'. +Next are examples: - :set fileencoding=korea + :set encoding=euc-kr + :set encoding=utf-8 + :set fileencodings=ucs-bom,utf-8,cp949,euc-kr,latin1 Keyboard -------- @@ -52,8 +53,16 @@ If both are set, VIM_KEYBOARD has higher Hangul Fonts ------------ -You can set text font using $HOME/.Xdefaults or in your gvimrc file. -But to use Hangul, you should set 'guifontset' in your vimrc. +If you use GTK version of GVIM, you should set 'guifont' and 'guifontwide'. +For example: + set guifont=Courier\ 12 + set guifontwide=NanumGothicCoding\ 12 + +If you use Motif or Athena version of GVIM, you should set 'guifontset' in +your vimrc. You can set fontset in the .Xdefaults file. + +$HOME/.gvimrc: > + set guifontset=english_font,hangul_font $HOME/.Xdefaults: > Vim.font: english_font @@ -66,40 +75,38 @@ But to use Hangul, you should set 'guifo *international: True Vim*fontList: english_font;hangul_font: -$HOME/.gvimrc: > - set guifontset=english_font,hangul_font - attention! the , (comma) or ; (semicolon) And there should be no ':set guifont'. If it exists, then Gvim ignores ':set guifontset'. It means VIM runs without fontset supporting. So, you can see only English. Hangul does not be correctly displayed. -After 'fontset' feature is enabled, VIM does not allow using 'font'. +After 'fontset' feature is enabled, VIM does not allow using english +font only in 'font' setting for syntax. For example, if you use > :set guifontset=eng_font,your_font in your .gvimrc, then you should do for syntax > :hi Comment guifg=Cyan font=another_eng_font,another_your_font If you just do > :hi Comment font=another_eng_font -then you can see a GOOD error message. Be careful! +then you can see a error message. Be careful! hangul_font width should be twice than english_font width. Unsupported Feature ------------------- -Johab font not yet supported. And I don't have any plan. -If you really want to use johab font, you can use the -hanguldraw.c in gau package. +We don't support Johab font. +We don't support Hanja input. +And We don't have any plan to support them. -Hanja input not yet supported. And I don't have any plan. -If you really want to input hanja, just use VIM with hanterm. +If you really need such features, you can use console version of VIM with a +capable terminal emulator. Bug or Comment -------------- Send comments, patches and suggestions to: - Chi-Deok Hwang SungHyun Nam + Chi-Deok Hwang <...> vim:tw=78:ts=8:ft=help:norl: diff --git a/src/feature.h b/src/feature.h --- a/src/feature.h +++ b/src/feature.h @@ -677,9 +677,6 @@ # define ESC_CHG_TO_ENG_MODE /* if defined, when ESC pressed, * turn to english mode */ -# if !defined(FEAT_XFONTSET) && defined(HAVE_X11) && !defined(FEAT_GUI_GTK) -# define FEAT_XFONTSET /* Hangul input requires xfontset */ -# endif # if defined(FEAT_XIM) && !defined(LINT) Error: You should select only ONE of XIM and HANGUL INPUT # endif @@ -687,7 +684,6 @@ #if defined(FEAT_HANGULIN) || defined(FEAT_XIM) /* # define X_LOCALE */ /* for OS with incomplete locale support, like old linux versions. */ -/* # define SLOW_XSERVER */ /* for extremely slow X server */ #endif /* diff --git a/src/gui.c b/src/gui.c --- a/src/gui.c +++ b/src/gui.c @@ -1223,8 +1223,19 @@ gui_update_cursor(force, clear_selection gui.highlight_mask = (cattr | attr); #ifdef FEAT_HANGULIN if (composing_hangul) - (void)gui_outstr_nowrap(composing_hangul_buffer, 2, - GUI_MON_IS_CURSOR | GUI_MON_NOCLEAR, cfg, cbg, 0); + { + char_u *comp_buf; + int comp_len; + + comp_buf = hangul_composing_buffer_get(&comp_len); + if (comp_buf) + { + (void)gui_outstr_nowrap(comp_buf, comp_len, + GUI_MON_IS_CURSOR | GUI_MON_NOCLEAR, + cfg, cbg, 0); + vim_free(comp_buf); + } + } else #endif (void)gui_screenchar(LineOffset[gui.row] + gui.col, @@ -2572,9 +2583,19 @@ gui_undraw_cursor() #ifdef FEAT_HANGULIN if (composing_hangul && gui.col == gui.cursor_col && gui.row == gui.cursor_row) - (void)gui_outstr_nowrap(composing_hangul_buffer, 2, - GUI_MON_IS_CURSOR | GUI_MON_NOCLEAR, - gui.norm_pixel, gui.back_pixel, 0); + { + char_u *comp_buf; + int comp_len; + + comp_buf = hangul_composing_buffer_get(&comp_len); + if (comp_buf) + { + (void)gui_outstr_nowrap(comp_buf, comp_len, + GUI_MON_IS_CURSOR | GUI_MON_NOCLEAR, + gui.norm_pixel, gui.back_pixel, 0); + vim_free(comp_buf); + } + } else { #endif diff --git a/src/hangulin.c b/src/hangulin.c --- a/src/hangulin.c +++ b/src/hangulin.c @@ -1619,3 +1619,49 @@ convert_3_to_ks(fv, mv, lv, des) *des++ = johab_lcon_to_wan[lv]; return 8; } + + char_u * +hangul_string_convert(buf, p_len) + char_u *buf; + int *p_len; +{ + char_u *tmpbuf = NULL; + vimconv_T vc; + + if (enc_utf8) + { + vc.vc_type = CONV_NONE; + if (convert_setup(&vc, (char_u *)"euc-kr", p_enc) == OK) + { + tmpbuf = string_convert(&vc, buf, p_len); + convert_setup(&vc, NULL, NULL); + } + } + + return tmpbuf; +} + + char_u * +hangul_composing_buffer_get(p_len) + int *p_len; +{ + char_u *tmpbuf = NULL; + + if (composing_hangul) + { + int len = 2; + + tmpbuf = hangul_string_convert(composing_hangul_buffer, &len); + if (tmpbuf != NULL) + { + *p_len = len; + } + else + { + tmpbuf = vim_strnsave(composing_hangul_buffer, 2); + *p_len = 2; + } + } + + return tmpbuf; +} diff --git a/src/proto/hangulin.pro b/src/proto/hangulin.pro --- a/src/proto/hangulin.pro +++ b/src/proto/hangulin.pro @@ -6,4 +6,6 @@ void hangul_input_state_toggle __ARGS((v void hangul_keyboard_set __ARGS((void)); int hangul_input_process __ARGS((char_u *s, int len)); void hangul_input_clear __ARGS((void)); +char_u *hangul_string_convert __ARGS((char_u *buf, int *p_len)); +char_u *hangul_composing_buffer_get __ARGS((int *p_len)); /* vim: set ft=c : */ diff --git a/src/screen.c b/src/screen.c --- a/src/screen.c +++ b/src/screen.c @@ -10047,7 +10047,13 @@ showmode() if (gui.in_use) { if (hangul_input_state_get()) - MSG_PUTS_ATTR(" \307\321\261\333", attr); /* HANGUL */ + { + /* HANGUL */ + if (enc_utf8) + MSG_PUTS_ATTR(" \355\225\234\352\270\200", attr); + else + MSG_PUTS_ATTR(" \307\321\261\333", attr); + } } #endif #ifdef FEAT_INS_EXPAND diff --git a/src/ui.c b/src/ui.c --- a/src/ui.c +++ b/src/ui.c @@ -1723,8 +1723,17 @@ push_raw_key(s, len) char_u *s; int len; { + char_u *tmpbuf; + + tmpbuf = hangul_string_convert(s, &len); + if (tmpbuf != NULL) + s = tmpbuf; + while (len--) inbuf[inbufcount++] = *s++; + + if (tmpbuf != NULL) + vim_free(tmpbuf); } #endif diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -742,6 +742,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 913, +/**/ 912, /**/ 911,