allowing Mod1 - Mod5 in keybindings defined through :map command

This commit is contained in:
Hannes Schueller 2011-02-07 19:44:01 +01:00
parent 279757557a
commit 293fd102bf
2 changed files with 57 additions and 12 deletions

View File

@ -298,6 +298,24 @@ mappings(const Arg *arg) {
}
}
int
get_modkey(char key) {
switch (key) {
case '1':
return GDK_MOD1_MASK;
case '2':
return GDK_MOD2_MASK;
case '3':
return GDK_MOD3_MASK;
case '4':
return GDK_MOD4_MASK;
case '5':
return GDK_MOD5_MASK;
default:
return FALSE;
}
}
gboolean
process_mapping(char *keystring, int maprecord, char *cmd) {
Key search_key;
@ -315,10 +333,15 @@ process_mapping(char *keystring, int maprecord, char *cmd) {
search_key.key = keystring[1];
}
/* process stuff like <S-v> for Shift-v or <C-v> for Ctrl-v
or stuff like <S-v>a for Shift-v,a or <C-v>a for Ctrl-v,a
*/
if ((strlen(keystring) == 5 || strlen(keystring) == 6) && keystring[0] == '<' && keystring[4] == '>') {
/* process stuff like <S-v> for Shift-v or <C-v> for Ctrl-v (strlen == 5),
stuff like <S-v>a for Shift-v,a or <C-v>a for Ctrl-v,a (strlen == 6 && keystring[4] == '>')
stuff like <M1-v> for Mod1-v (strlen == 6 && keystring[5] == '>')
or stuff like <M1-v>a for Mod1-v,a (strlen = 7)
*/
if (
((strlen(keystring) == 5 || strlen(keystring) == 6) && keystring[0] == '<' && keystring[4] == '>') ||
((strlen(keystring) == 6 || strlen(keystring) == 7) && keystring[0] == '<' && keystring[5] == '>')
) {
switch (toupper(keystring[1])) {
case 'S':
search_key.mask = GDK_SHIFT_MASK;
@ -332,21 +355,34 @@ process_mapping(char *keystring, int maprecord, char *cmd) {
case 'C':
search_key.mask = GDK_CONTROL_MASK;
break;
case 'M':
search_key.mask = get_modkey(keystring[2]);
break;
}
if (!search_key.mask)
return FALSE;
if (strlen(keystring) == 5) {
search_key.key = keystring[3];
} else if (strlen(keystring) == 7) {
search_key.modkey = keystring[4];
search_key.key = keystring[6];
} else {
search_key.modkey= keystring[3];
search_key.key = keystring[5];
if (search_key.mask == 'S' || search_key.mask == 'C') {
search_key.modkey = keystring[3];
search_key.key = keystring[5];
} else {
search_key.key = keystring[4];
}
}
}
/* process stuff like <S-v> for Shift-v or <C-v> for Ctrl-v
or stuff like a<S-v> for a,Shift-v or a<C-v> for a,Ctrl-v
*/
if (strlen(keystring) == 6 && keystring[1] == '<' && keystring[5] == '>') {
/* process stuff like a<S-v> for a,Shift-v or a<C-v> for a,Ctrl-v (strlen == 6)
or stuff like a<M1-v> for a,Mod1-v (strlen == 7)
*/
if (
(strlen(keystring) == 6 && keystring[1] == '<' && keystring[5] == '>') ||
(strlen(keystring) == 7 && keystring[1] == '<' && keystring[6] == '>')
) {
switch (toupper(keystring[2])) {
case 'S':
search_key.mask = GDK_SHIFT_MASK;
@ -355,11 +391,18 @@ process_mapping(char *keystring, int maprecord, char *cmd) {
case 'C':
search_key.mask = GDK_CONTROL_MASK;
break;
case 'M':
search_key.mask = get_modkey(keystring[3]);
break;
}
if (!search_key.mask)
return FALSE;
search_key.modkey= keystring[0];
search_key.key = keystring[4];
if (strlen(keystring) == 6) {
search_key.key = keystring[4];
} else {
search_key.key = keystring[5];
}
}
return (changemapping(&search_key, maprecord, cmd));
}

View File

@ -39,10 +39,12 @@ Vimprobable is not picky about white space in these lines.
.SH FORMAT MODIFIED KEYS
It is possible to mapi keys modified with eiter Control or Shift.
It is possible to map keys modified with eiter Control, Shift or Modkeys.
To map a key modified with Control, use this format: <C-h>
where C stands for the Control-key and h for the h-key.
or <S-k> where S stands for the Shift-key and k for the k-key.
<M1-j> maps the combination of Mod1 and the j-key. Mod1 is
usually the "Alt" key, Mod4 the "Windows" key.
Examples:
<C-h> : Ctrl-h