윈도우즈용 gvim을 사용해 보면 한글을 입력할 때 별도의 조합창이 열리기 때문에 보기가 좀 껄끄럽습니다.
외국에서 만들어진 대부분의 프로그램들이 다 그렇지만요....
아무튼 어설프게 수정을 좀 해봤습니다.
입력중에 캐럿이 글자 전체를 감싸는 따위의 기능은 없지만 그럭저럭 볼만합니다.
수정에 사용된 버전은 6.3입니다.
--- gui_w32.c Mon Jun 07 14:30:18 2004
+++ gui_w32.c Thu Mar 03 10:58:10 2005
@@ -776,6 +776,15 @@
if (!_OnImeNotify(hwnd, (DWORD)wParam, (DWORD)lParam))
return MyWindowProc(hwnd, uMsg, wParam, lParam);
break;
+
+ case WM_IME_STARTCOMPOSITION:
+ _OnImeStartComposition(hwnd, wParam, lParam);
+ return MyWindowProc(hwnd, uMsg, wParam, lParam);
+
+ case WM_IME_ENDCOMPOSITION:
+ _OnImeEndComposition(hwnd, wParam, lParam);
+ return MyWindowProc(hwnd, uMsg, wParam, lParam);
+
case WM_IME_COMPOSITION:
if (!_OnImeComposition(hwnd, wParam, lParam))
return MyWindowProc(hwnd, uMsg, wParam, lParam);
@@ -1478,22 +1487,54 @@
return lResult;
}
+static char_u bskey[] = {CSI, 'k', 'b'};
+static char_u delkey[] = {CSI, 'k', 'D'};
+static char_u backkey[] = {CSI, 'k', 'l'};
+
+ static LRESULT
+_OnImeStartComposition(HWND hwnd, WPARAM dbcs, LPARAM param)
+{
+ add_to_input_buf(" ", 1);
+ add_to_input_buf(backkey, (int)sizeof(backkey));
+ return 1;
+}
+
+ static LRESULT
+_OnImeEndComposition(HWND hwnd, WPARAM dbcs, LPARAM param)
+{
+ add_to_input_buf(delkey, (int)sizeof(delkey));
+ return 1;
+}
+
static LRESULT
_OnImeComposition(HWND hwnd, WPARAM dbcs, LPARAM param)
{
char_u *ret;
int len;
- if ((param & GCS_RESULTSTR) == 0) /* Composition unfinished. */
- return 0;
-
- ret = GetResultStr(hwnd, GCS_RESULTSTR, &len);
- if (ret != NULL)
+ if ((param & GCS_RESULTSTR) != 0)
{
- add_to_input_buf_csi(ret, len);
- vim_free(ret);
- return 1;
+ ret = GetResultStr(hwnd, GCS_RESULTSTR, &len);
+ if (ret != NULL)
+ {
+ add_to_input_buf_csi(ret, len);
+ vim_free(ret);
+ return 1;
+ }
}
+ else if ((param & GCS_COMPSTR) != 0)
+ {
+ ret = GetResultStr(hwnd, GCS_COMPSTR, &len);
+ if (ret != NULL)
+ {
+ add_to_input_buf(delkey, (int)sizeof(delkey));
+ add_to_input_buf_csi(ret, len);
+ vim_free(ret);
+ add_to_input_buf(backkey, (int)sizeof(backkey));
+ return 1;
+ }
+ }
+
return 0;
}