Add some default hotkeys
[midnight-commander.git] / src / keybind.c
blob8c9c7c0a76a9fca71692218c733d744283072684
1 /*
2 Copyright (C) 2009 The Free Software Foundation, Inc.
4 Written by: 2005 Vitja Makarov
5 2009 Ilia Maslakov
7 This file is part of the Midnight Commander.
9 The Midnight Commander is free software; you can redistribute it
10 and/or modify it under the terms of the GNU General Public License as
11 published by the Free Software Foundation; either version 2 of the
12 License, or (at your option) any later version.
14 The Midnight Commander is distributed in the hope that it will be
15 useful, but WITHOUT ANY WARRANTY; without even the implied warranty
16 of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
22 MA 02110-1301, USA.
25 #include <config.h>
27 #include <ctype.h>
28 #include <errno.h>
29 #include <stdarg.h>
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include <string.h>
33 #include <sys/types.h>
34 #include <sys/stat.h>
35 #include <unistd.h>
37 #include "global.h"
39 #include "cmddef.h" /* CK_ cmd name const */
40 #include "tty/win.h"
41 #include "tty/key.h" /* KEY_M_ */
42 #include "tty/tty.h" /* keys */
43 #include "wtools.h"
44 #include "strutil.h"
46 #include "keybind.h"
48 static const name_key_map_t command_names[] = {
49 { "EditNoCommand", CK_Ignore_Key },
50 { "EditIgnoreKey", CK_Ignore_Key },
51 { "EditBackSpace", CK_BackSpace },
52 { "EditDelete", CK_Delete },
53 { "EditEnter", CK_Enter },
54 { "EditPageUp", CK_Page_Up },
55 { "EditPageDown", CK_Page_Down },
56 { "EditLeft", CK_Left },
57 { "EditRight", CK_Right },
58 { "EditWordLeft", CK_Word_Left },
59 { "EditWordRight", CK_Word_Right },
60 { "EditUp", CK_Up },
61 { "EditDown", CK_Down },
62 { "EditHome", CK_Home },
63 { "EditEnd", CK_End },
64 { "EditTab", CK_Tab },
65 { "EditUndo", CK_Undo },
66 { "EditBeginningOfText", CK_Beginning_Of_Text },
67 { "EditEndOfText", CK_End_Of_Text },
68 { "EditScrollUp", CK_Scroll_Up },
69 { "EditScrollDown", CK_Scroll_Down },
70 { "EditReturn", CK_Return },
71 { "EditBeginPage", CK_Begin_Page },
72 { "EditEndPage", CK_End_Page },
73 { "EditDeleteWordLeft", CK_Delete_Word_Left },
74 { "EditDeleteWordRight", CK_Delete_Word_Right },
75 { "EditParagraphUp", CK_Paragraph_Up },
76 { "EditParagraphDown", CK_Paragraph_Down },
77 { "EditSave", CK_Save },
78 { "EditLoad", CK_Load },
79 { "EditNew", CK_New },
80 { "EditSaveas", CK_Save_As },
81 { "EditMark", CK_Mark },
82 { "EditCopy", CK_Copy },
83 { "EditMove", CK_Move },
84 { "EditRemove", CK_Remove },
85 { "EditUnmark", CK_Unmark },
86 { "EditSaveBlock", CK_Save_Block },
87 { "EditColumnMark", CK_Column_Mark },
88 { "EditFind", CK_Find },
89 { "EditFindAgain", CK_Find_Again },
90 { "EditReplace", CK_Replace },
91 { "EditReplaceAgain", CK_Replace_Again },
92 { "EditCompleteWord", CK_Complete_Word },
93 { "EditDebugStart", CK_Debug_Start },
94 { "EditDebugStop", CK_Debug_Stop },
95 { "EditDebugToggleBreak", CK_Debug_Toggle_Break },
96 { "EditDebugClear", CK_Debug_Clear },
97 { "EditDebugNext", CK_Debug_Next },
98 { "EditDebugStep", CK_Debug_Step },
99 { "EditDebugBackTrace", CK_Debug_Back_Trace },
100 { "EditDebugContinue", CK_Debug_Continue },
101 { "EditDebugEnterCommand", CK_Debug_Enter_Command },
102 { "EditDebugUntilCurser", CK_Debug_Until_Curser },
103 { "EditInsertFile", CK_Insert_File },
104 { "EditExit", CK_Exit },
105 { "EditToggleInsert", CK_Toggle_Insert },
106 { "EditHelp", CK_Help },
107 { "EditDate", CK_Date },
108 { "EditRefresh", CK_Refresh },
109 { "EditGoto", CK_Goto },
110 { "EditDeleteLine", CK_Delete_Line },
111 { "EditDeleteToLineEnd", CK_Delete_To_Line_End },
112 { "EditDeleteToLineBegin", CK_Delete_To_Line_Begin },
113 { "EditManPage", CK_Man_Page },
114 { "EditSort", CK_Sort },
115 { "EditMail", CK_Mail },
116 { "EditCancel", CK_Cancel },
117 { "EditComplete", CK_Complete },
118 { "EditParagraphFormat", CK_Paragraph_Format },
119 { "EditUtil", CK_Util },
120 { "EditTypeLoadPython", CK_Type_Load_Python },
121 { "EditFindFile", CK_Find_File },
122 { "EditCtags", CK_Ctags },
123 { "EditMatchBracket", CK_Match_Bracket },
124 { "EditTerminal", CK_Terminal },
125 { "EditTerminalApp", CK_Terminal_App },
126 { "EditExtCmd", CK_ExtCmd },
127 { "EditUserMenu", CK_User_Menu },
128 { "EditSaveDesktop", CK_Save_Desktop },
129 { "EditNewWindow", CK_New_Window },
130 { "EditCycle", CK_Cycle },
131 { "EditMenu", CK_Menu },
132 { "EditSaveAndQuit", CK_Save_And_Quit },
133 { "EditRunAnother", CK_Run_Another },
134 { "EditCheckSaveAndQuit", CK_Check_Save_And_Quit },
135 { "EditMaximize", CK_Maximize },
136 { "EditBeginRecordMacro", CK_Begin_Record_Macro },
137 { "EditEndRecordMacro", CK_End_Record_Macro },
138 { "EditDeleteMacro", CK_Delete_Macro },
139 { "EditToggleBookmark", CK_Toggle_Bookmark },
140 { "EditFlushBookmarks", CK_Flush_Bookmarks },
141 { "EditNextBookmark", CK_Next_Bookmark },
142 { "EditPrevBookmark", CK_Prev_Bookmark },
143 { "EditPageUpHighlight", CK_Page_Up_Highlight },
144 { "EditPageDownHighlight", CK_Page_Down_Highlight },
145 { "EditLeftHighlight", CK_Left_Highlight },
146 { "EditRightHighlight", CK_Right_Highlight },
147 { "EditWordLeftHighlight", CK_Word_Left_Highlight },
148 { "EditWordRightHighlight", CK_Word_Right_Highlight },
149 { "EditUpHighlight", CK_Up_Highlight },
150 { "EditDownHighlight", CK_Down_Highlight },
151 { "EditHomeHighlight", CK_Home_Highlight },
152 { "EditEndHighlight", CK_End_Highlight },
153 { "EditBeginningOfTextHighlight", CK_Beginning_Of_Text_Highlight },
154 { "EditEndOfTextHighlight", CK_End_Of_Text_Highlight },
155 { "EditBeginPageHighlight", CK_Begin_Page_Highlight },
156 { "EditEndPageHighlight", CK_End_Page_Highlight },
157 { "EditScrollUpHighlight", CK_Scroll_Up_Highlight },
158 { "EditScrollDownHighlight", CK_Scroll_Down_Highlight },
159 { "EditParagraphUpHighlight", CK_Paragraph_Up_Highlight },
160 { "EditParagraphDownHighlight", CK_Paragraph_Down_Highlight },
161 { "EditXStore", CK_XStore },
162 { "EditXCut", CK_XCut },
163 { "EditXPaste", CK_XPaste },
164 { "EditSelectionHistory", CK_Selection_History },
165 { "EditShell", CK_Shell },
166 { "EditInsertLiteral", CK_Insert_Literal },
167 { "EditExecuteMacro", CK_Execute_Macro },
168 { "EditBeginorEndMacro", CK_Begin_End_Macro },
169 { "EditExtmode", CK_Ext_Mode },
170 { "EditToggleLineState", CK_Toggle_Line_State },
171 #if 0
172 { "EditFocusNext", CK_Focus_Next },
173 { "EditFocusPrev", CK_Focus_Prev },
174 { "EditHeightInc", CK_Height_Inc },
175 { "EditHeightDec", CK_Height_Dec },
176 { "EditMake", CK_Make },
177 { "EditErrorNext", CK_Error_Next },
178 { "EditErrorPrev", CK_Error_Prev },
179 #endif
181 /* viewer */
182 { "ViewSearch", CK_ViewSearch },
183 { "ViewContinueSearch", CK_ViewContinueSearch },
184 { "ViewGotoBookmark", CK_ViewGotoBookmark },
185 { "ViewNewBookmark", CK_ViewNewBookmark },
186 { "ViewMoveUp", CK_ViewMoveUp },
187 { "ViewMoveDown", CK_ViewMoveDown },
188 { "ViewMoveLeft", CK_ViewMoveLeft },
189 { "ViewMoveRight", CK_ViewMoveRight },
190 { "ViewMovePgDn", CK_ViewMovePgDn },
191 { "ViewMovePgUp", CK_ViewMovePgUp },
192 { "ViewMoveHalfPgDn", CK_ViewMoveHalfPgDn },
193 { "ViewMoveHalfPgUp", CK_ViewMoveHalfPgUp },
194 { "ViewMoveToBol", CK_ViewMoveToBol },
195 { "ViewMoveToEol", CK_ViewMoveToEol },
196 { "ViewNextFile", CK_ViewNextFile },
197 { "ViewPrevFile", CK_ViewPrevFile },
198 { "ViewToggleRuler", CK_ViewToggleRuler },
199 { "HexViewToggleNavigationMode", CK_HexViewToggleNavigationMode },
200 { "ViewQuit", CK_ViewQuit },
202 /* main commands */
203 { "CmdChmod", CK_ChmodCmd },
204 { "CmdMenuLastSelected", CK_MenuLastSelectedCmd },
205 { "CmdSingleDirsize", CK_SingleDirsizeCmd },
206 { "CmdCopyCurrentPathname", CK_CopyCurrentPathname },
207 { "CmdCopyOtherPathname", CK_CopyOtherPathname },
208 { "CmdSuspend", CK_SuspendCmd },
209 { "CmdToggleListing", CK_ToggleListingCmd },
210 { "CmdChownAdvanced", CK_ChownAdvancedCmd },
211 { "CmdChown", CK_ChownCmd },
212 { "CmdCompareDirs", CK_CompareDirsCmd },
213 { "CmdConfigureBox", CK_ConfigureBox },
214 { "CmdConfigureVfs", CK_ConfigureVfs },
215 { "CmdConfirmBox", CK_ConfirmBox },
216 { "CmdCopy", CK_CopyCmd },
217 { "CmdDelete", CK_DeleteCmd },
218 { "CmdDirsizes", CK_DirsizesCmd },
219 { "CmdDisplayBitsBox", CK_DisplayBitsBox },
220 { "CmdEdit", CK_EditCmd },
221 { "CmdEditMcMenu", CK_EditMcMenuCmd },
222 { "CmdEditSymlink", CK_EditSymlinkCmd },
223 { "CmdEditSyntax", CK_EditSyntaxCmd },
224 { "CmdEditUserMenu", CK_EditUserMenuCmd },
225 { "CmdExternalPanelize", CK_ExternalPanelize },
226 { "CmdFilter", CK_FilterCmd },
227 { "CmdFilteredView", CK_FilteredViewCmd },
228 { "CmdFind", CK_FindCmd },
229 { "CmdFishlink", CK_FishlinkCmd },
230 { "CmdFtplink", CK_FtplinkCmd },
231 { "CmdHistory", CK_HistoryCmd },
232 { "CmdInfo", CK_InfoCmd },
233 { "CmdJobs", CK_JobsCmd },
234 { "CmdLayout", CK_LayoutCmd },
235 { "CmdLearnKeys", CK_LearnKeys },
236 { "CmdLink", CK_LinkCmd },
237 { "CmdListing", CK_ListingCmd },
238 { "CmdMkdir", CK_MkdirCmd },
239 { "CmdQuickCd", CK_QuickCdCmd },
240 { "CmdQuickChdir", CK_QuickChdirCmd },
241 { "CmdQuickView", CK_QuickViewCmd },
242 { "CmdQuietQuit", CK_QuietQuitCmd },
243 { "CmdRename", CK_RenCmd },
244 { "CmdReread", CK_RereadCmd },
245 { "CmdReselectVfs", CK_ReselectVfs },
246 { "CmdReverseSelection", CK_ReverseSelectionCmd },
247 { "CmdSaveSetup", CK_SaveSetupCmd },
248 { "CmdSelect", CK_SelectCmd },
249 { "CmdSwapPanel", CK_SwapCmd },
250 { "CmdSymlink", CK_SymlinkCmd },
251 { "CmdTree", CK_TreeCmd },
252 { "CmdUndelete", CK_UndeleteCmd },
253 { "CmdUnselect", CK_UnselectCmd },
254 { "CmdUserFileMenu", CK_UserFileMenuCmd },
255 { "CmdView", CK_ViewCmd },
256 { "CmdViewFile", CK_ViewFileCmd },
257 { "CmdCmdCopyCurrentReadlink", CK_CopyCurrentReadlink },
258 { "CmdCopyOtherReadlink", CK_CopyOtherReadlink },
259 { "CmdAddHotlist", CK_AddHotlist },
260 { "CmdQuit", CK_QuitCmd },
261 { "CmdCopyOtherTarget", CK_CopyOtherTarget },
262 { "CmdCopyOthertReadlink", CK_CopyOthertReadlink },
264 /* panel */
265 { "PanelChdirOtherPanel", CK_PanelChdirOtherPanel },
266 { "PanelChdirToReadlink", CK_PanelChdirToReadlink },
267 { "PanelCopyLocal", CK_PanelCmdCopyLocal },
268 { "PanelDeleteLocal", CK_PanelCmdDeleteLocal },
269 { "PanelDoEnter", CK_PanelCmdDoEnter },
270 { "PanelEditNew", CK_PanelCmdEditNew },
271 { "PanelRenameLocal", CK_PanelCmdRenameLocal },
272 { "PanelReverseSelection", CK_PanelCmdReverseSelection },
273 { "PanelSelect", CK_PanelCmdSelect },
274 { "PanelUnselect", CK_PanelCmdUnselect },
275 { "PanelViewSimple", CK_PanelCmdViewSimple },
276 { "PanelCtrlNextPage", CK_PanelCtrlNextPage },
277 { "PanelCtrlPrevPage", CK_PanelCtrlPrevPage },
278 { "PanelDirectoryHistoryList", CK_PanelDirectoryHistoryList },
279 { "PanelDirectoryHistoryNext", CK_PanelDirectoryHistoryNext },
280 { "PanelDirectoryHistoryPrev", CK_PanelDirectoryHistoryPrev },
281 { "PanelGotoBottomFile", CK_PanelGotoBottomFile },
282 { "PanelGotoMiddleFile", CK_PanelGotoMiddleFile },
283 { "PanelGotoTopFile", CK_PanelGotoTopFile },
284 { "PanelMarkFile", CK_PanelMarkFile },
285 { "PanelMoveUp", CK_PanelMoveUp },
286 { "PanelMoveDown", CK_PanelMoveDown },
287 { "PanelMoveLeft", CK_PanelMoveLeft },
288 { "PanelMoveRight", CK_PanelMoveRight },
289 { "PanelMoveEnd", CK_PanelMoveEnd },
290 { "PanelMoveHome", CK_PanelMoveHome },
291 { "PanelNextPage", CK_PanelNextPage },
292 { "PanelPrevPage", CK_PanelPrevPage },
293 { "PanelSetPanelEncoding", CK_PanelSetPanelEncoding },
294 { "PanelStartSearch", CK_PanelStartSearch },
295 { "PanelSyncOtherPanel", CK_PanelSyncOtherPanel },
297 /* widgets */
298 { "InputBol", CK_InputBol },
299 { "InputEol", CK_InputEol },
300 { "InputMoveLeft", CK_InputMoveLeft },
301 { "InputWordLeft", CK_InputWordLeft },
302 { "InputBackwardChar", CK_InputBackwardChar },
303 { "InputBackwardWord", CK_InputBackwardWord },
304 { "InputMoveRight", CK_InputMoveRight },
305 { "InputWordRight", CK_InputWordRight },
306 { "InputForwardChar", CK_InputForwardChar },
307 { "InputForwardWord", CK_InputForwardWord },
308 { "InputBackwardDelete", CK_InputBackwardDelete },
309 { "InputDeleteChar", CK_InputDeleteChar },
310 { "InputKillWord", CK_InputKillWord },
311 { "InputBackwardKillWord", CK_InputBackwardKillWord },
312 { "InputSetMark", CK_InputSetMark },
313 { "InputKillRegion", CK_InputKillRegion },
314 { "InputKillSave", CK_InputKillSave },
315 { "InputYank", CK_InputYank },
316 { "InputKillLine", CK_InputKillLine },
317 { "InputHistoryPrev", CK_InputHistoryPrev },
318 { "InputHistoryNext", CK_InputHistoryNext },
319 { "InputHistoryShow", CK_InputHistoryShow },
320 { "InputComplete", CK_InputComplete },
322 /* common */
323 { "ExtMap1", CK_StartExtMap1 },
324 { "ExtMap2", CK_StartExtMap2 },
325 { "ShowCommandLine", CK_ShowCommandLine },
326 { "SelectCodepage", CK_SelectCodepage },
328 { NULL, 0 }
331 /*** global variables ****************************************************************************/
333 /* viewer/actions_cmd.c */
334 const global_key_map_t default_viewer_keymap[] = {
336 { '?', CK_ViewSearch },
337 { '/', CK_ViewSearch },
338 { XCTRL('r'), CK_ViewContinueSearch },
339 { XCTRL('s'), CK_ViewContinueSearch },
340 { KEY_F (17), CK_ViewContinueSearch },
341 { ALT('r'), CK_ViewToggleRuler },
343 { KEY_HOME, CK_ViewMoveToBol },
344 { KEY_END, CK_ViewMoveToEol },
346 { 'h', CK_ViewMoveLeft },
347 { KEY_LEFT, CK_ViewMoveLeft },
349 { 'l', CK_ViewMoveRight },
350 { KEY_RIGHT, CK_ViewMoveRight },
352 { 'k', CK_ViewMoveUp },
353 { 'y', CK_ViewMoveUp },
354 { KEY_IC, CK_ViewMoveUp },
355 { KEY_UP, CK_ViewMoveUp },
357 { 'j', CK_ViewMoveDown },
358 { 'e', CK_ViewMoveDown },
359 { KEY_DOWN, CK_ViewMoveDown },
360 { KEY_DC, CK_ViewMoveDown },
362 { ' ', CK_ViewMovePgDn },
363 { 'f', CK_ViewMovePgDn },
364 { KEY_NPAGE, CK_ViewMovePgDn },
366 { 'b', CK_ViewMovePgUp },
367 { KEY_PPAGE, CK_ViewMovePgUp },
369 { 'd', CK_ViewMoveHalfPgDn },
370 { 'u', CK_ViewMoveHalfPgUp },
372 { 'm', CK_ViewGotoBookmark },
373 { 'r', CK_ViewNewBookmark },
375 { XCTRL ('f'), CK_ViewNextFile },
376 { XCTRL ('b'), CK_ViewPrevFile },
378 { 'q', CK_ViewQuit },
379 { XCTRL ('g'), CK_ViewQuit },
380 { ESC_CHAR, CK_ViewQuit },
382 { XCTRL ('t'), CK_SelectCodepage },
383 { XCTRL('o'), CK_ShowCommandLine },
384 { 0, 0 }
387 const global_key_map_t default_viewer_hex_keymap[] = {
389 { '\t', CK_HexViewToggleNavigationMode },
390 { XCTRL ('a'), CK_ViewMoveToBol },
391 { XCTRL ('e'), CK_ViewMoveToEol },
393 { 'b', CK_ViewMoveLeft },
394 { KEY_LEFT, CK_ViewMoveLeft },
396 { 'f', CK_ViewMoveRight },
397 { KEY_RIGHT, CK_ViewMoveRight },
399 { 'k', CK_ViewMoveUp },
400 { 'y', CK_ViewMoveUp },
401 { KEY_UP, CK_ViewMoveUp },
403 { 'j', CK_ViewMoveDown },
404 { KEY_DOWN, CK_ViewMoveDown },
405 { KEY_DC, CK_ViewMoveDown },
407 { 0, 0 }
410 /* ../edit/editkeys.c */
411 const global_key_map_t default_editor_keymap[] = {
412 { '\n', CK_Enter },
413 { '\t', CK_Tab },
415 { ESC_CHAR, CK_Exit },
416 { KEY_BACKSPACE, CK_BackSpace },
417 { KEY_DC, CK_Delete },
418 { KEY_DOWN, CK_Down },
419 { KEY_END, CK_End },
420 { KEY_HOME, CK_Home },
421 { KEY_IC, CK_Toggle_Insert },
422 { KEY_LEFT, CK_Left },
423 { KEY_NPAGE, CK_Page_Down },
424 { KEY_PPAGE, CK_Page_Up },
425 { KEY_RIGHT, CK_Right },
426 { KEY_UP, CK_Up },
428 { ALT ('\n'), CK_Find_Definition },
429 { ALT ('\t'), CK_Complete_Word },
430 { ALT ('l'), CK_Goto },
431 { ALT ('L'), CK_Goto },
432 { ALT ('p'), CK_Paragraph_Format },
433 { ALT ('t'), CK_Sort },
434 { ALT ('u'), CK_ExtCmd },
435 { ALT ('<'), CK_Beginning_Of_Text },
436 { ALT ('>'), CK_End_Of_Text },
437 { ALT ('-'), CK_Load_Prev_File },
438 { ALT ('='), CK_Load_Next_File },
439 { ALT ('d'), CK_Delete_Word_Right },
440 { ALT (KEY_BACKSPACE), CK_Delete_Word_Left },
441 { ALT ('n'), CK_Toggle_Line_State },
442 { ALT ('_'), CK_Toggle_Tab_TWS },
443 { ALT ('k'), CK_Toggle_Bookmark },
444 { ALT ('i'), CK_Prev_Bookmark },
445 { ALT ('j'), CK_Next_Bookmark },
446 { ALT ('o'), CK_Flush_Bookmarks },
448 { XCTRL ('k'), CK_Delete_To_Line_End },
449 { XCTRL ('l'), CK_Refresh },
450 { XCTRL ('o'), CK_Shell },
451 { XCTRL ('s'), CK_Toggle_Syntax },
452 { XCTRL ('u'), CK_Undo },
453 { XCTRL ('t'), CK_SelectCodepage },
454 { XCTRL ('q'), CK_Insert_Literal },
455 { XCTRL ('a'), CK_Execute_Macro },
456 { XCTRL ('r'), CK_Begin_End_Macro },
458 { KEY_F (1), CK_Help },
459 { KEY_F (2), CK_Save },
460 { KEY_F (3), CK_Mark },
461 { KEY_F (4), CK_Replace },
462 { KEY_F (5), CK_Copy },
463 { KEY_F (6), CK_Move },
464 { KEY_F (7), CK_Find },
465 { KEY_F (8), CK_Remove },
466 { KEY_F (10), CK_Exit },
467 /* edit user menu */
468 { KEY_F (11), CK_User_Menu },
469 { KEY_F (12), CK_Save_As },
470 { KEY_F (13), CK_Column_Mark },
471 { KEY_F (14), CK_Replace_Again },
472 { KEY_F (15), CK_Insert_File },
473 { KEY_F (17), CK_Find_Again },
474 /* C formatter */
475 { KEY_F (19), CK_Pipe_Block (0) },
477 /* Shift */
478 { KEY_M_SHIFT | KEY_PPAGE, CK_Page_Up_Highlight },
479 { KEY_M_SHIFT | KEY_NPAGE, CK_Page_Down_Highlight },
480 { KEY_M_SHIFT | KEY_LEFT, CK_Left_Highlight },
481 { KEY_M_SHIFT | KEY_RIGHT, CK_Right_Highlight },
482 { KEY_M_SHIFT | KEY_UP, CK_Up_Highlight },
483 { KEY_M_SHIFT | KEY_DOWN, CK_Down_Highlight },
484 { KEY_M_SHIFT | KEY_HOME, CK_Home_Highlight },
485 { KEY_M_SHIFT | KEY_END, CK_End_Highlight },
486 { KEY_M_SHIFT | KEY_IC, CK_XPaste },
487 { KEY_M_SHIFT | KEY_DC, CK_XCut },
488 /* useful for pasting multiline text */
489 { KEY_M_SHIFT | '\n', CK_Return },
491 /* Alt */
492 { KEY_M_ALT | KEY_PPAGE, CK_Page_Up_Alt_Highlight },
493 { KEY_M_ALT | KEY_NPAGE, CK_Page_Down_Highlight },
494 { KEY_M_ALT | KEY_LEFT, CK_Left_Alt_Highlight },
495 { KEY_M_ALT | KEY_RIGHT, CK_Right_Alt_Highlight },
496 { KEY_M_ALT | KEY_UP, CK_Up_Alt_Highlight },
497 { KEY_M_ALT | KEY_DOWN, CK_Down_Alt_Highlight },
498 { KEY_M_ALT | KEY_HOME, CK_Home_Highlight },
499 { KEY_M_ALT | KEY_END, CK_End_Alt_Highlight },
501 /* Ctrl */
502 { KEY_M_CTRL | (KEY_F (2)), CK_Save_As },
503 { KEY_M_CTRL | (KEY_F (4)), CK_Replace_Again },
504 { KEY_M_CTRL | (KEY_F (7)), CK_Find_Again },
505 { KEY_M_CTRL | KEY_BACKSPACE, CK_Undo },
506 { KEY_M_CTRL | KEY_PPAGE, CK_Beginning_Of_Text },
507 { KEY_M_CTRL | KEY_NPAGE, CK_End_Of_Text },
508 { KEY_M_CTRL | KEY_HOME, CK_Beginning_Of_Text },
509 { KEY_M_CTRL | KEY_END, CK_End_Of_Text },
510 { KEY_M_CTRL | KEY_UP, CK_Scroll_Up },
511 { KEY_M_CTRL | KEY_DOWN, CK_Scroll_Down },
512 { KEY_M_CTRL | KEY_LEFT, CK_Word_Left },
513 { KEY_M_CTRL | KEY_RIGHT, CK_Word_Right },
514 { KEY_M_CTRL | KEY_IC, CK_XStore },
515 { KEY_M_CTRL | KEY_DC, CK_Remove },
517 /* Ctrl + Shift */
518 { KEY_M_SHIFT | KEY_M_CTRL | KEY_PPAGE, CK_Beginning_Of_Text_Highlight },
519 { KEY_M_SHIFT | KEY_M_CTRL | KEY_NPAGE, CK_End_Of_Text_Highlight },
520 { KEY_M_SHIFT | KEY_M_CTRL | KEY_LEFT, CK_Word_Left_Highlight },
521 { KEY_M_SHIFT | KEY_M_CTRL | KEY_RIGHT, CK_Word_Right_Highlight },
522 { KEY_M_SHIFT | KEY_M_CTRL | KEY_UP, CK_Scroll_Up_Highlight },
523 { KEY_M_SHIFT | KEY_M_CTRL | KEY_DOWN, CK_Scroll_Down_Highlight },
525 { XCTRL ('x'), CK_StartExtMap1 },
527 { 0, 0 }
530 /* screen.c */
531 const global_key_map_t default_panel_keymap[] = {
533 { ALT('o'), CK_PanelChdirOtherPanel },
534 { ALT('l'), CK_PanelChdirToReadlink },
535 { KEY_F(15), CK_PanelCmdCopyLocal },
536 { KEY_F(18), CK_PanelCmdDeleteLocal },
537 { KEY_ENTER, CK_PanelCmdDoEnter },
538 { '\n', CK_PanelCmdDoEnter },
539 { KEY_F(14), CK_PanelCmdEditNew },
540 { KEY_F(16), CK_PanelCmdRenameLocal },
541 { ALT('*'), CK_PanelCmdReverseSelection },
542 { KEY_KP_ADD, CK_PanelCmdSelect },
543 { KEY_KP_SUBTRACT, CK_PanelCmdUnselect },
544 { KEY_F(13), CK_PanelCmdViewSimple },
545 { KEY_M_CTRL | KEY_NPAGE, CK_PanelCtrlNextPage },
546 { KEY_M_CTRL | KEY_PPAGE, CK_PanelCtrlPrevPage },
547 { ALT('H'), CK_PanelDirectoryHistoryList },
548 { ALT('u'), CK_PanelDirectoryHistoryNext },
549 { ALT('y'), CK_PanelDirectoryHistoryPrev },
550 { ALT('j'), CK_PanelGotoBottomFile },
551 { ALT('r'), CK_PanelGotoMiddleFile },
552 { ALT('g'), CK_PanelGotoTopFile },
553 { KEY_IC, CK_PanelMarkFile },
554 { KEY_UP, CK_PanelMoveUp },
555 { KEY_DOWN, CK_PanelMoveDown },
556 { KEY_LEFT, CK_PanelMoveLeft },
557 { KEY_RIGHT, CK_PanelMoveRight },
558 { KEY_END, CK_PanelMoveEnd },
559 { KEY_HOME, CK_PanelMoveHome },
560 { KEY_A1, CK_PanelMoveHome },
561 { KEY_NPAGE, CK_PanelNextPage },
562 { KEY_PPAGE, CK_PanelPrevPage },
563 { XCTRL('t'), CK_PanelSetPanelEncoding },
564 { XCTRL('s'), CK_PanelStartSearch },
565 { ALT('i'), CK_PanelSyncOtherPanel },
566 { 0, 0 }
569 /* main.c */
570 const global_key_map_t default_main_map[] = {
571 {KEY_F (19), CK_MenuLastSelectedCmd},
572 {KEY_F (20), CK_QuietQuitCmd},
573 {XCTRL ('@'), CK_SingleDirsizeCmd},
574 /* Copy useful information to the command line */
575 {ALT ('a'), CK_CopyCurrentPathname},
576 {ALT ('A'), CK_CopyOtherPathname},
577 {ALT ('c'), CK_QuickCdCmd},
578 /* To access the directory hotlist */
579 {XCTRL ('\\'), CK_QuickChdirCmd},
580 /* Suspend */
581 {XCTRL ('z'), CK_SuspendCmd},
582 /* The filtered view command */
583 {ALT ('!'), CK_FilteredViewCmd},
584 /* Find file */
585 {ALT ('?'), CK_FindCmd},
586 /* Panel refresh */
587 {XCTRL ('r'), CK_RereadCmd},
588 /* Toggle listing between long, user defined and full formats */
589 {ALT ('t'), CK_ToggleListingCmd},
590 /* Swap panels */
591 {XCTRL ('u'), CK_SwapCmd},
592 /* View output */
593 {XCTRL ('o'), CK_ShowCommandLine},
594 {XCTRL ('x'), CK_StartExtMap1 },
595 { 0, 0 }
598 const global_key_map_t default_main_x_map[] = {
599 {XCTRL ('c'), CK_QuitCmd},
600 {'d', CK_CompareDirsCmd},
601 #ifdef USE_VFS
602 {'a', CK_ReselectVfs},
603 #endif /* USE_VFS */
604 {'p', CK_CopyCurrentPathname},
605 {XCTRL ('p'), CK_CopyOtherPathname},
606 {'t', CK_CopyCurrentTagged},
607 {XCTRL ('t'), CK_CopyOtherTarget},
608 {'c', CK_ChmodCmd},
609 {'o', CK_ChownCmd},
610 {'r', CK_CopyCurrentReadlink},
611 {XCTRL ('r'), CK_CopyOtherReadlink},
612 {'l', CK_LinkCmd},
613 {'s', CK_SymlinkCmd},
614 {XCTRL ('s'), CK_EditSymlinkCmd},
615 {'i', CK_InfoCmd},
616 {'q', CK_QuickViewCmd},
617 {'h', CK_AddHotlist},
618 {'!', CK_ExternalPanelize},
619 #ifdef WITH_BACKGROUND
620 {'j', CK_JobsCmd},
621 #endif /* WITH_BACKGROUND */
622 {0, 0}
627 int lookup_action (char *keyname)
629 int i;
631 for (i = 0; command_names [i].name; i++){
632 if (!str_casecmp (command_names [i].name, keyname))
633 return command_names [i].val;
635 return 0;
638 void
639 keymap_add(GArray *keymap, int key, int cmd)
641 global_key_map_t new_bind, *map;
642 map = &(g_array_index(keymap, global_key_map_t, 0));
644 if (key !=0 && cmd !=0) {
645 new_bind.key = key;
646 new_bind.command = cmd;
647 g_array_append_val(keymap, new_bind);
652 void
653 keybind_cmd_bind(GArray *keymap, char *keybind, int action)
655 keymap_add(keymap, lookup_key(keybind), action);