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

Raspunde prin e-mail lui