* Alexey I. Froloff <raorn@> [061021 17:53]: > Vim should _support_ Meta-Sends-Escape mode which is A Must Have > for non-ascii 8-bit locales Patch attached.
New option - 'eightbitmeta' ('em'), default on. If unset, two things happen: 1. "<M-x>" is stored internaly as "<Esc>x" sequence (was (x | 0x80)). 2. Alt+key puts "<Esc>key" to input buffer (GUI only). It's up to user to keep this option in sync with terminal/console settings, it's not set by Vim and default behavior is unchanged. This makes sense for UNIX platform only, however WIN32 and Photon GUI's also support 2) (untested). -- Regards, Sir Raorn.
diff -ur ../vim70-orig/runtime/doc/options.txt runtime/doc/options.txt --- ../vim70-orig/runtime/doc/options.txt 2006-10-21 17:53:35 +0400 +++ runtime/doc/options.txt 2006-10-21 21:17:09 +0400 @@ -2320,6 +2320,16 @@ also 'gdefault' option. Switching this option on is discouraged! + *'em'* *'eightbitmeta'* *'noem'* *'noeightbitmeta'* +'eightbitmeta' 'em' boolean (default on) + global + {not in Vi} + When set, handles Meta (Alt) + keypress to set the 8th bit. When + unset, handles Meta (Alt) + keypress as an escape prefix. + + You should keep this option in sync with "meta8" (aterm/rxvt) and + "eightBitInput" (xterm) resources. See |:map-alt-keys|. + *'encoding'* *'enc'* *E543* 'encoding' 'enc' string (default: "latin1" or value from $LANG) global diff -ur ../vim70-orig/runtime/doc/tags runtime/doc/tags --- ../vim70-orig/runtime/doc/tags 2006-10-21 17:53:35 +0400 +++ runtime/doc/tags 2006-10-22 00:22:17 +0400 @@ -174,7 +174,9 @@ 'ef' options.txt /*'ef'* 'efm' options.txt /*'efm'* 'ei' options.txt /*'ei'* +'eightbitmeta' options.txt /*'eightbitmeta'* 'ek' options.txt /*'ek'* +'em' options.txt /*'em'* 'enc' options.txt /*'enc'* 'encoding' options.txt /*'encoding'* 'endofline' options.txt /*'endofline'* @@ -486,7 +488,9 @@ 'noeb' options.txt /*'noeb'* 'noed' options.txt /*'noed'* 'noedcompatible' options.txt /*'noedcompatible'* +'noeightbitmeta' options.txt /*'noeightbitmeta'* 'noek' options.txt /*'noek'* +'noem' options.txt /*'noem'* 'noendofline' options.txt /*'noendofline'* 'noeol' options.txt /*'noeol'* 'noequalalways' options.txt /*'noequalalways'* diff -ur ../vim70-orig/runtime/optwin.vim runtime/opwin.vim --- ../vim70-orig/runtime/optwin.vim 2006-10-21 17:53:36 +0400 +++ runtime/optwin.vim 2006-10-22 00:35:57 +0400 @@ -500,6 +500,8 @@ call <SID>BinOptionG("wiv", &wiv) call append("$", "esckeys\trecognize keys that start with <Esc> in Insert mode") call <SID>BinOptionG("ek", &ek) +call append("$", "eightbitmeta\tassume that Alt+Key sends <Esc>Key sequence") +call <SID>BinOptionG("em", &em) call append("$", "scrolljump\tminimal number of lines to scroll at a time") call append("$", " \tset sj=" . &sj) call append("$", "ttyscroll\tmaximum number of lines to use scrolling instead of redrawing") diff -ur ../vim70-orig/src/gui_gtk_x11.c src/gui_gtk_x11.c --- ../vim70-orig/src/gui_gtk_x11.c 2006-10-21 17:53:34 +0400 +++ src/gui_gtk_x11.c 2006-10-21 23:40:53 +0400 @@ -1098,6 +1098,7 @@ #ifdef FEAT_MBYTE && !enc_dbcs #endif + && p_em ) { string[0] |= 0x80; @@ -1151,9 +1152,11 @@ || key_sym == GDK_Return || key_sym == GDK_Linefeed || key_sym == GDK_Escape || key_sym == GDK_KP_Tab || key_sym == GDK_ISO_Enter || key_sym == GDK_3270_Enter + || ((!p_em #ifdef FEAT_MBYTE - || (enc_dbcs && len == 1 && (state & GDK_MOD1_MASK)) + || enc_dbcs #endif + ) && len == 1 && (state & GDK_MOD1_MASK)) ) { modifiers = modifiers_gdk2vim(state); @@ -1170,25 +1173,31 @@ key = simplify_key(key, &modifiers); if (key == CSI) key = K_CSI; - if (IS_SPECIAL(key)) + + len = 0; + + if (!p_em && modifiers & MOD_MASK_ALT) { - string[0] = CSI; - string[1] = K_SECOND(key); - string[2] = K_THIRD(key); - len = 3; + modifiers &= ~MOD_MASK_ALT; + string[len++] = ESC; } - else + + if (modifiers != 0) { - string[0] = key; - len = 1; + string[len++] = CSI; + string[len++] = KS_MODIFIER; + string[len++] = modifiers; } - if (modifiers != 0) + if (IS_SPECIAL(key)) + { + string[len++] = CSI; + string[len++] = K_SECOND(key); + string[len++] = K_THIRD(key); + } + else { - string2[0] = CSI; - string2[1] = KS_MODIFIER; - string2[2] = modifiers; - add_to_input_buf(string2, 3); + string[len++] = key; } } diff -ur ../vim70-orig/src/gui_photon.c src/gui_photon.c --- ../vim70-orig/src/gui_photon.c 2006-04-16 14:09:04 +0400 +++ src/gui_photon.c 2006-10-22 00:09:14 +0400 @@ -571,7 +571,7 @@ modifiers |= MOD_MASK_CTRL; } - if( modifiers & MOD_MASK_ALT ) + if( p_em && modifiers & MOD_MASK_ALT ) { ch = Meta( ch ); modifiers &= ~MOD_MASK_ALT; @@ -587,6 +587,13 @@ } ch = simplify_key( ch, &modifiers ); + + if (!p_em && modifiers && MOD_MASK_ALT) + { + modifiers &= ~MOD_MASK_ALT; + string[ len++ ] = ESC; + } + if( modifiers ) { string[ len++ ] = CSI; diff -ur ../vim70-orig/src/gui_x11.c src/gui_x11.c --- ../vim70-orig/src/gui_x11.c 2006-05-03 00:04:15 +0400 +++ src/gui_x11.c 2006-10-21 23:38:31 +0400 @@ -917,6 +917,7 @@ #ifdef FEAT_MBYTE && !enc_dbcs #endif + && p_em ) { #if defined(FEAT_MENU) && defined(FEAT_GUI_MOTIF) @@ -996,9 +997,11 @@ if (len == -3 || key_sym == XK_space || key_sym == XK_Tab || key_sym == XK_Return || key_sym == XK_Linefeed || key_sym == XK_Escape + || ((!p_em #ifdef FEAT_MBYTE - || (enc_dbcs && len == 1 && (ev_press->state & Mod1Mask)) + || enc_dbcs #endif + ) && len == 1 && (ev_press->state & Mod1Mask)) ) { modifiers = 0; @@ -1022,25 +1025,31 @@ key = simplify_key(key, &modifiers); if (key == CSI) key = K_CSI; - if (IS_SPECIAL(key)) + + len = 0; + + if (!p_em && modifiers == MOD_MASK_ALT) { - string[0] = CSI; - string[1] = K_SECOND(key); - string[2] = K_THIRD(key); - len = 3; + modifiers &= ~MOD_MASK_ALT; + string[len++] = ESC; } - else + + if (modifiers != 0) { - string[0] = key; - len = 1; + string[len++] = CSI; + string[len++] = KS_MODIFIER; + string[len++] = modifiers; } - if (modifiers != 0) + if (IS_SPECIAL(key)) + { + string[len++] = CSI; + string[len++] = K_SECOND(key); + string[len++] = K_THIRD(key); + } + else { - string2[0] = CSI; - string2[1] = KS_MODIFIER; - string2[2] = modifiers; - add_to_input_buf(string2, 3); + string[len++] = key; } } diff -ur ../vim70-orig/src/misc2.c src/misc2.c --- ../vim70-orig/src/misc2.c 2006-10-21 17:53:35 +0400 +++ src/misc2.c 2006-10-21 23:30:25 +0400 @@ -2409,7 +2409,8 @@ { if (table_idx < 0 && (!vim_isprintc(c) || (c & 0x7f) == ' ') - && (c & 0x80)) + && (c & 0x80) + && p_em) { c &= 0x7f; modifiers |= MOD_MASK_ALT; @@ -2494,6 +2495,12 @@ return 0; /* Put the appropriate modifier in a string */ + if (!p_em && modifiers & MOD_MASK_ALT) + { + modifiers &= ~MOD_MASK_ALT; + dst[dlen++] = ESC; + } + if (modifiers != 0) { dst[dlen++] = K_SPECIAL; @@ -2681,6 +2688,7 @@ #ifdef FEAT_MBYTE && !enc_dbcs /* avoid creating a lead byte */ #endif + && p_em ) { key |= 0x80; diff -ur ../vim70-orig/src/option.c src/option.c --- ../vim70-orig/src/option.c 2006-10-21 17:53:35 +0400 +++ src/option.c 2006-10-22 00:15:00 +0400 @@ -959,6 +959,9 @@ {"edcompatible","ed", P_BOOL|P_VI_DEF, (char_u *)&p_ed, PV_NONE, {(char_u *)FALSE, (char_u *)0L}}, + {"eightbitmeta","em", P_BOOL|P_VI_DEF, + (char_u *)&p_em, PV_NONE, + {(char_u *)TRUE, (char_u *)0L}}, {"encoding", "enc", P_STRING|P_VI_DEF|P_RCLR, #ifdef FEAT_MBYTE (char_u *)&p_enc, PV_NONE, diff -ur ../vim70-orig/src/option.h src/option.h --- ../vim70-orig/src/option.h 2006-10-21 17:53:35 +0400 +++ src/option.h 2006-10-21 20:41:27 +0400 @@ -421,6 +421,7 @@ #define DY_LASTLINE 0x001 #define DY_UHEX 0x002 EXTERN int p_ed; /* 'edcompatible' */ +EXTERN int p_em; /* 'eightbitmeta' */ #ifdef FEAT_VERTSPLIT EXTERN char_u *p_ead; /* 'eadirection' */ #endif diff -ur ../vim70-orig/src/os_win32.c src/os_win32.c --- ../vim70-orig/src/os_win32.c 2006-10-21 17:53:35 +0400 +++ src/os_win32.c 2006-10-22 00:08:53 +0400 @@ -1519,12 +1519,21 @@ #ifdef FEAT_MBYTE && !enc_dbcs #endif + && p_em ) { typeahead[typeaheadlen] |= 0x80; modifiers &= ~MOD_MASK_ALT; } + if ( n == 1 && !p_em && modifiers & MOD_MASK_ALT) + { + modifiers &= ~MOD_MASK_ALT; + mch_memmove(typeahead + typeaheadlen + 1, + typeahead + typeaheadlen, n); + typeahead[typeaheadlen++] = ESC; + } + if (modifiers != 0) { /* Prepend modifiers to the character. */
signature.asc
Description: Digital signature