In response to the following comment made by Bram on Aug 2, 2007: (can be viewed at http://groups.google.com/group/vim_dev/browse_thread/thread/3b73a504c77ba803/)
> I hesitate removing the Hangul support without knowing for sure that it > is not needed. Browsing through the messages I do see remarks that it > might still be useful to a few people. > > Perhaps the Hangul support can be changed to also work for UTF-8? I made (finally) a patch that enables hangul-input module to work for UTF-8. First, hg head: orchistro.ubuntu:~/work/vim-hangulin/src$ hg head changeset: 2790:08c36bef2004 tag: tip user: Bram Moolenaar <[email protected]> date: Thu Apr 28 19:05:05 2011 +0200 summary: Added tag v7-3-170 for changeset 64c3402df964 changeset: 2572:ee53a39d5896 branch: vim73 user: Bram Moolenaar <[email protected]> date: Sun Aug 15 15:24:20 2010 +0200 summary: Last changes for the 7.3 release! Secondly, hg st: orchistro.ubuntu:~/work/vim-hangulin/src$ hg st M src/getchar.c M src/gui.c M src/hangulin.c M src/screen.c Finally, hg diff: ... It is too long. But I cannot find a way to attach a file, so, here goes the diff: orchistro.ubuntu:~/work/vim-hangulin/src$ hg diff diff -r 08c36bef2004 src/getchar.c --- a/src/getchar.c Thu Apr 28 19:05:05 2011 +0200 +++ b/src/getchar.c Sun May 01 20:06:42 2011 +0900 @@ -1722,8 +1722,23 @@ buf[i] = vgetorpeek(TRUE); if (buf[i] == K_SPECIAL #ifdef FEAT_GUI +#ifdef FEAT_HANGULIN + /* Since hangul's utf-8 code has many 0x9b instances. + * Any hangul unicodes of U+XX1B, U+X6CX, U+X6DX, U+X6EX, U +X6FX + * has 0x9B when encoded by utf-8 encoding scheme. + * To correctly input those characters with + * utf-8 hangul-input module in gvim, + * Checking CSI is disabled when hangulinput module is featured in. + * + * But I(orchistro _at_ gmail.com) am not sure if it is right + * choice to skip checking CSI, + * because I have no idea what CSI does exactly. + */ + || (buf[i] == CSI && !gui.in_use) +#else || buf[i] == CSI #endif +#endif ) { /* Must be a K_SPECIAL - KS_SPECIAL - KE_FILLER sequence, diff -r 08c36bef2004 src/gui.c --- a/src/gui.c Thu Apr 28 19:05:05 2011 +0200 +++ b/src/gui.c Sun May 01 20:06:42 2011 +0900 @@ -39,6 +39,8 @@ static int can_update_cursor = TRUE; /* can display the cursor */ +extern size_t hangul_width[]; + /* * The Athena scrollbars can move the thumb to after the end of the scrollbar, * this makes the thumb indicate the part of the text that is shown. Motif @@ -1064,7 +1066,7 @@ gui.highlight_mask = (cattr | attr); #ifdef FEAT_HANGULIN if (composing_hangul) - (void)gui_outstr_nowrap(composing_hangul_buffer, 2, + (void)gui_outstr_nowrap(composing_hangul_buffer, hangul_width[enc_utf8], GUI_MON_IS_CURSOR | GUI_MON_NOCLEAR, cfg, cbg, 0); else #endif @@ -2384,7 +2386,7 @@ #ifdef FEAT_HANGULIN if (composing_hangul && gui.col == gui.cursor_col && gui.row == gui.cursor_row) - (void)gui_outstr_nowrap(composing_hangul_buffer, 2, + (void)gui_outstr_nowrap(composing_hangul_buffer, hangul_width[enc_utf8], GUI_MON_IS_CURSOR | GUI_MON_NOCLEAR, gui.norm_pixel, gui.back_pixel, 0); else diff -r 08c36bef2004 src/hangulin.c --- a/src/hangulin.c Thu Apr 28 19:05:05 2011 +0200 +++ b/src/hangulin.c Sun May 01 20:06:42 2011 +0900 @@ -39,6 +39,8 @@ static int convert_3_to_ks __ARGS((int fv, int mv, int lv, char_u *des)); static int hangul_automata2 __ARGS((char_u *buf, unsigned int *c)); static int hangul_automata3 __ARGS((char_u *buf, unsigned int *c)); +size_t hangul_width[] = {2, /* ksc 5601, 2 bytes */ + 3 /* utf-8, 3 bytes. when enc_utf8 is 1 */ }; #define push(x) {stack[ sp++ ] = *(x); stack[sp++] = *((x)+1);} #define pop(x) {*((x) + 1) = stack[--sp]; *(x) = stack[--sp];} @@ -435,12 +437,14 @@ hangul_input_state_set(0); if (composing_hangul) { - push_raw_key(composing_hangul_buffer, 2); + push_raw_key(composing_hangul_buffer, hangul_width[enc_utf8]); composing_hangul = 0; } } else + { hangul_input_state_set(1); + } if (showmode()) { @@ -745,6 +749,31 @@ } } +static void +hangul_convert_to_utf_8(char_u *buf_utf_8, char_u *buf_euc_kr) +{ + vimconv_T hangul_conv; + iconv_t hangul_iconv_fd = (iconv_t)-1; + int conv_len = 2; + char_u *converted_str; + + hangul_iconv_fd = (iconv_t)my_iconv_open("utf-8", "euc-kr"); + + hangul_conv.vc_type = CONV_ICONV; + hangul_conv.vc_factor = 0; + hangul_conv.vc_fd = hangul_iconv_fd; + hangul_conv.vc_fail = 0; + + converted_str = string_convert(&hangul_conv, buf_euc_kr, &conv_len); + + /* + * Copying utf-8 code to the buffer + */ + memcpy(buf_utf_8, converted_str, conv_len); + + iconv_close(hangul_iconv_fd); +} + int hangul_input_process(s, len) char_u *s; @@ -752,7 +781,8 @@ { int n; unsigned int c; - char_u hanbuf[20]; + char_u hanbuf[2][30]; /* hanbuf[0] : for ks c 5601 codes + hanbuf[1] : for utf-8 codes */ if (len == 1) /* normal key press */ @@ -768,37 +798,70 @@ else { if (composing_hangul) - push_raw_key(composing_hangul_buffer, 2); + push_raw_key(composing_hangul_buffer, hangul_width[enc_utf8]); hangul_input_clear(); composing_hangul = 0; return len; } + /* + * TODO: It will look better if automata for du-bul-sik(2-way korean keyboard) + * and se-bul-sik(3-way korean keyboard) is called automatically + * by a function pointer + */ if (hangul_keyboard_type == 2) - n = hangul_automata2(hanbuf, &c); + { + n = hangul_automata2(hanbuf[0], &c); /* Character the automata created is + always in ks_c_5601-1987 */ + } else - n = hangul_automata3(hanbuf, &c); + { + n = hangul_automata3(hanbuf[0], &c); /* Character the automata created is + always in ks_c_5601-1987 */ + } if (n == AUTOMATA_CORRECT) { - STRNCPY(composing_hangul_buffer, hanbuf, 2); + if (enc_utf8) + hangul_convert_to_utf_8(hanbuf[1], hanbuf[0]); + + STRNCPY(composing_hangul_buffer, hanbuf[enc_utf8], hangul_width[enc_utf8]); gui_update_cursor(TRUE, FALSE); return 0; } else if (n == AUTOMATA_NEW) { + if (enc_utf8) + hangul_convert_to_utf_8(hanbuf[1], hanbuf[0]); if (composing_hangul) - push_raw_key(composing_hangul_buffer, 2); - STRNCPY(composing_hangul_buffer, hanbuf, 2); + push_raw_key(composing_hangul_buffer, hangul_width[enc_utf8]); + STRNCPY(composing_hangul_buffer, hanbuf[enc_utf8], hangul_width[enc_utf8]); composing_hangul = 1; gui_update_cursor(TRUE, FALSE); return 0; } else if (n == AUTOMATA_CORRECT_NEW) { + if (enc_utf8) + hangul_convert_to_utf_8(hanbuf[1], hanbuf[0]); if (composing_hangul) - push_raw_key(hanbuf, 2); - STRNCPY(composing_hangul_buffer, hanbuf+2, 2); + { + push_raw_key(hanbuf[enc_utf8], hangul_width[enc_utf8]); + /* + * Because the content of hanbuf has been pushed into the "inbuf", + * it is turn for the next character. + * Convert next character and put it into composing_hangul_buffer. + */ + if (enc_utf8) + { + hangul_convert_to_utf_8(&hanbuf[1][3], &hanbuf[0][2]); + } + } + + STRNCPY(composing_hangul_buffer, + hanbuf[enc_utf8] + hangul_width[enc_utf8], + hangul_width[enc_utf8]); + composing_hangul = 1; gui_update_cursor(TRUE, FALSE); return 0; @@ -816,7 +879,7 @@ { if (composing_hangul) { - push_raw_key(composing_hangul_buffer, 2); + push_raw_key(composing_hangul_buffer, hangul_width[enc_utf8]); composing_hangul = 0; } *s = c; @@ -1538,6 +1601,13 @@ } } +/* + * convert_3_to_ks() + * + * Receive Cho, Jung, Jong-Seong + * and build ks c 5601-1992 code. + * Returns ks c 5601-1992 code in des array. + */ static int convert_3_to_ks(fv, mv, lv, des) int fv; diff -r 08c36bef2004 src/screen.c --- a/src/screen.c Thu Apr 28 19:05:05 2011 +0200 +++ b/src/screen.c Sun May 01 20:06:42 2011 +0900 @@ -9466,7 +9466,12 @@ if (gui.in_use) { if (hangul_input_state_get()) - MSG_PUTS_ATTR(" \307\321\261\333", attr); /* HANGUL */ + if (enc_utf8) + /* Displays Korean Letters for "Hangul" in utf-8 */ + MSG_PUTS_ATTR(" \355\225\234\352\270\200", attr); + else + /* Displays Korean Letters for "Hangul" in euc-kr */ + MSG_PUTS_ATTR(" \307\321\261\333", attr); } #endif #ifdef FEAT_INS_EXPAND -- You received this message from the "vim_dev" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php
