2 these #defines are probably the ones most people will be interested in.
3 You can use these two #defines to hard code the key mappings --- just
4 uncomment the one you want. But only if you have trouble with learn
5 keys (which is unlikely).
8 /* KEY_BACKSPACE is the key learned in the learn keys menu : */
9 #define OUR_BACKSPACE_KEY KEY_BACKSPACE
10 /* ...otherwise ctrl-h : */
11 /* #define OUR_BACKSPACE_KEY XCTRL ('h') */
12 /* ...otherwise 127 or DEL in ascii : */
13 /* #define OUR_BACKSPACE_KEY 0177 */
15 /* KEY_DC is the key learned in the learn keys menu */
16 #define OUR_DELETE_KEY KEY_DC
17 /* ...otherwise ctrl-d : */
18 /* #define OUR_DELETE_KEY XCTRL ('d') */
19 /* ...otherwise 127 or DEL in ascii : */
20 /* #define OUR_DELETE_KEY 0177 */
24 This is #include'd into the function edit_translate_key in edit.c.
25 This sequence of code takes 'x_state' and 'x_key' and translates them
26 into either 'command' or 'char_for_insertion'. 'x_key' holds one of
27 KEY_NPAGE, KEY_HOME etc., and 'x_state' holds a bitwise inclusive OR of
28 CONTROL_PRESSED, ALT_PRESSED or SHIFT_PRESSED, although none may
30 'command' is one of the editor commands editcmddef.h.
32 Almost any C code can go into this file. The code below is an example
33 that may by appended or modified by the user.
36 /* look in this file for the list of commands : */
37 #include "editcmddef.h"
39 #define KEY_NUMLOCK ???
41 /* ordinary translations. (Some of this may be redundant.) Note that keys listed
42 first take priority when a key is assigned to more than one command */
44 static long cooledit_key_map
[] =
45 {OUR_BACKSPACE_KEY
, CK_BackSpace
, OUR_DELETE_KEY
, CK_Delete
,
46 XCTRL ('d'), CK_Delete
, '\n', CK_Enter
,
47 KEY_PPAGE
, CK_Page_Up
, KEY_NPAGE
, CK_Page_Down
, KEY_LEFT
, CK_Left
,
48 KEY_RIGHT
, CK_Right
, KEY_UP
, CK_Up
, KEY_DOWN
, CK_Down
, ALT ('\t'), CK_Return
, ALT ('\n'), CK_Return
,
49 KEY_HOME
, CK_Home
, KEY_END
, CK_End
, '\t', CK_Tab
, XCTRL ('u'), CK_Undo
, KEY_IC
, CK_Toggle_Insert
,
50 XCTRL ('o'), CK_Load
, KEY_F (3), CK_Mark
, KEY_F (5), CK_Copy
,
51 KEY_F (6), CK_Move
, KEY_F (8), CK_Remove
, KEY_F (12), CK_Save_As
,
52 KEY_F (2), CK_Save
, XCTRL ('n'), CK_New
,
53 XCTRL ('l'), CK_Refresh
, ESC_CHAR
, CK_Exit
, KEY_F (10), CK_Exit
,
54 KEY_F (19), /*C formatter */ CK_Pipe_Block (0),
55 XCTRL ('p'), /*spell check */ CK_Pipe_Block (1),
56 KEY_F (15), CK_Insert_File
,
57 XCTRL ('f'), CK_Save_Block
, KEY_F (1), CK_Help
,
58 ALT ('t'), CK_Sort
, ALT ('m'), CK_Mail
,
59 XCTRL ('z'), CK_Word_Left
, XCTRL ('x'), CK_Word_Right
,
60 KEY_F (4), CK_Replace
, KEY_F (7), CK_Find
, KEY_F (14), CK_Replace_Again
,
61 XCTRL ('h'), CK_BackSpace
, ALT ('l'), CK_Goto
, ALT ('L'), CK_Goto
, XCTRL ('y'), CK_Delete_Line
,
62 KEY_F (17), CK_Find_Again
, ALT ('p'), CK_Paragraph_Format
, 0};
64 static long emacs_key_map
[] =
65 {OUR_BACKSPACE_KEY
, CK_BackSpace
, OUR_DELETE_KEY
, CK_Delete
, '\n', CK_Enter
,
66 KEY_PPAGE
, CK_Page_Up
, KEY_NPAGE
, CK_Page_Down
, KEY_LEFT
, CK_Left
,
67 KEY_RIGHT
, CK_Right
, KEY_UP
, CK_Up
, KEY_DOWN
, CK_Down
, ALT ('\t'), CK_Return
, ALT ('\n'), CK_Return
,
68 KEY_HOME
, CK_Home
, KEY_END
, CK_End
, '\t', CK_Tab
, XCTRL ('u'), CK_Undo
, KEY_IC
, CK_Toggle_Insert
,
69 XCTRL ('o'), CK_Load
, KEY_F (3), CK_Mark
, KEY_F (5), CK_Copy
,
70 KEY_F (6), CK_Move
, KEY_F (8), CK_Remove
, KEY_F (12), CK_Save_As
,
71 KEY_F (2), CK_Save
, ALT ('p'), CK_Paragraph_Format
,
75 XCTRL ('a'), CK_Home
, XCTRL ('e'), CK_End
,
76 XCTRL ('b'), CK_Left
, XCTRL ('f'), CK_Right
,
77 XCTRL ('n'), CK_Down
, XCTRL ('p'), CK_Up
,
78 XCTRL ('d'), CK_Delete
,
79 XCTRL ('v'), CK_Page_Down
, ALT ('v'), CK_Page_Up
,
81 XCTRL ('k'), CK_Delete_To_Line_End
,
84 ALT ('b'), CK_Word_Left
, ALT ('f'), CK_Word_Right
,
86 XCTRL ('y'), CK_XPaste
,
89 XCTRL ('l'), CK_Refresh
, ESC_CHAR
, CK_Exit
, KEY_F (10), CK_Exit
,
90 KEY_F (19), /*C formatter */ CK_Pipe_Block (0),
91 ALT ('$'), /*spell check */ CK_Pipe_Block (1),
92 KEY_F (15), CK_Insert_File
,
95 KEY_F (4), CK_Replace
, KEY_F (7), CK_Find
, KEY_F (14), CK_Replace_Again
,
96 XCTRL ('h'), CK_BackSpace
, ALT ('l'), CK_Goto
, ALT ('L'), CK_Goto
,
97 KEY_F (17), CK_Find_Again
,
98 ALT ('<'), CK_Beginning_Of_Text
,
99 ALT ('>'), CK_End_Of_Text
,
103 static long key_pad_map
[10] =
104 {XCTRL ('o'), KEY_END
, KEY_DOWN
, KEY_NPAGE
, KEY_LEFT
,
105 KEY_DOWN
, KEY_RIGHT
, KEY_HOME
, KEY_UP
, KEY_PPAGE
};
108 #define DEFAULT_NUM_LOCK 0
110 static int num_lock
= DEFAULT_NUM_LOCK
;
113 switch (edit_key_emulation
) {
114 case EDIT_KEY_EMULATION_NORMAL
:
115 key_map
= cooledit_key_map
;
117 case EDIT_KEY_EMULATION_EMACS
:
118 key_map
= emacs_key_map
;
119 if (x_key
== XCTRL ('x')) {
121 ext_key
= edit_raw_key_query (" Ctrl-X ", _(" Emacs key: "), 0);
133 command
= CK_Macro (edit_raw_key_query (_(" Execute Macro "), _(" Press macro hotkey: "), 1));
134 if (command
== CK_Macro (0))
143 if (x_key
== XCTRL ('q')) {
144 char_for_insertion
= edit_raw_key_query (_(" Insert Literal "), _(" Press any key: "), 0);
147 if (x_key
== XCTRL ('a') && edit_key_emulation
!= EDIT_KEY_EMULATION_EMACS
) {
148 command
= CK_Macro (edit_raw_key_query (" Execute Macro ", " Press macro hotkey: ", 1));
149 if (command
== CK_Macro (0))
153 /* edit is a pointer to the widget */
155 if (x_key
== XCTRL ('r')) {
156 command
= edit
->macro_i
< 0 ? CK_Begin_Record_Macro
: CK_End_Record_Macro
;
159 /* if (x_key == KEY_NUMLOCK) {
160 num_lock = 1 - num_lock;
165 /* first translate the key-pad */
167 if (x_key
>= '0' && x_key
<= '9') {
168 x_key
= key_pad_map
[x_key
- '0'];
174 if ((x_state
& SHIFT_PRESSED
) && (x_state
& CONTROL_PRESSED
)) {
177 command
= CK_Beginning_Of_Text_Highlight
;
180 command
= CK_End_Of_Text_Highlight
;
183 command
= CK_Word_Left_Highlight
;
186 command
= CK_Word_Right_Highlight
;
190 if ((x_state
& SHIFT_PRESSED
) && !(x_state
& CONTROL_PRESSED
)) {
193 command
= CK_Page_Up_Highlight
;
196 command
= CK_Page_Down_Highlight
;
199 command
= CK_Left_Highlight
;
202 command
= CK_Right_Highlight
;
205 command
= CK_Up_Highlight
;
208 command
= CK_Down_Highlight
;
211 command
= CK_Home_Highlight
;
214 command
= CK_End_Highlight
;
224 /* things that need a control key */
225 if (x_state
& CONTROL_PRESSED
) {
228 command
= CK_Save_As
;
231 command
= CK_Replace_Again
;
234 command
= CK_Find_Again
;
240 command
= CK_Beginning_Of_Text
;
243 command
= CK_End_Of_Text
;
246 command
= CK_Scroll_Up
;
249 command
= CK_Scroll_Down
;
252 command
= CK_Word_Left
;
255 command
= CK_Word_Right
;
265 /* an ordinary insertable character */
266 if (x_key
< 256 && is_printable (x_key
)) {
267 char_for_insertion
= x_key
;
272 while (key_map
[i
] != x_key
&& (key_map
[i
] || key_map
[i
+ 1]))
274 command
= key_map
[i
+ 1];
278 /* Function still not found for this key, so try macro's */
279 /* This allows the same macro to be
280 enabled by either eg "ALT('f')" or "XCTRL('f')" or "XCTRL('a'), 'f'" */
282 /* key.h: #define ALT(x) (0x200 | (x)) */
283 if (x_key
& ALT (0)) { /* is an alt key ? */
284 command
= CK_Macro (x_key
- ALT (0));
287 /* key.h: #define XCTRL(x) ((x) & 31) */
288 if (x_key
< ' ') { /* is a ctrl key ? */
289 command
= CK_Macro (x_key
);