Ticket #1790: mc crashes on start
[midnight-commander.git] / src / keybind.c
blobc898e8c06627d645b7869c5e5756b0c272d6198d
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_keymap_t command_names[] = {
49 #ifdef USE_INTERNAL_EDIT
50 { "EditNoCommand", CK_Ignore_Key },
51 { "EditIgnoreKey", CK_Ignore_Key },
52 { "EditBackSpace", CK_BackSpace },
53 { "EditDelete", CK_Delete },
54 { "EditEnter", CK_Enter },
55 { "EditPageUp", CK_Page_Up },
56 { "EditPageDown", CK_Page_Down },
57 { "EditLeft", CK_Left },
58 { "EditRight", CK_Right },
59 { "EditWordLeft", CK_Word_Left },
60 { "EditWordRight", CK_Word_Right },
61 { "EditUp", CK_Up },
62 { "EditDown", CK_Down },
63 { "EditHome", CK_Home },
64 { "EditEnd", CK_End },
65 { "EditTab", CK_Tab },
66 { "EditUndo", CK_Undo },
67 { "EditBeginningOfText", CK_Beginning_Of_Text },
68 { "EditEndOfText", CK_End_Of_Text },
69 { "EditScrollUp", CK_Scroll_Up },
70 { "EditScrollDown", CK_Scroll_Down },
71 { "EditReturn", CK_Return },
72 { "EditBeginPage", CK_Begin_Page },
73 { "EditEndPage", CK_End_Page },
74 { "EditDeleteWordLeft", CK_Delete_Word_Left },
75 { "EditDeleteWordRight", CK_Delete_Word_Right },
76 { "EditParagraphUp", CK_Paragraph_Up },
77 { "EditParagraphDown", CK_Paragraph_Down },
78 { "EditSave", CK_Save },
79 { "EditLoad", CK_Load },
80 { "EditNew", CK_New },
81 { "EditSaveas", CK_Save_As },
82 { "EditMark", CK_Mark },
83 { "EditCopy", CK_Copy },
84 { "EditMove", CK_Move },
85 { "EditRemove", CK_Remove },
86 { "EditUnmark", CK_Unmark },
87 { "EditSaveBlock", CK_Save_Block },
88 { "EditColumnMark", CK_Column_Mark },
89 { "EditFind", CK_Find },
90 { "EditFindAgain", CK_Find_Again },
91 { "EditReplace", CK_Replace },
92 { "EditReplaceAgain", CK_Replace_Again },
93 { "EditCompleteWord", CK_Complete_Word },
94 { "EditDebugStart", CK_Debug_Start },
95 { "EditDebugStop", CK_Debug_Stop },
96 { "EditDebugToggleBreak", CK_Debug_Toggle_Break },
97 { "EditDebugClear", CK_Debug_Clear },
98 { "EditDebugNext", CK_Debug_Next },
99 { "EditDebugStep", CK_Debug_Step },
100 { "EditDebugBackTrace", CK_Debug_Back_Trace },
101 { "EditDebugContinue", CK_Debug_Continue },
102 { "EditDebugEnterCommand", CK_Debug_Enter_Command },
103 { "EditDebugUntilCurser", CK_Debug_Until_Curser },
104 { "EditInsertFile", CK_Insert_File },
105 { "EditQuit", CK_Quit },
106 { "EditToggleInsert", CK_Toggle_Insert },
107 { "EditHelp", CK_Help },
108 { "EditDate", CK_Date },
109 { "EditRefresh", CK_Refresh },
110 { "EditGoto", CK_Goto },
111 { "EditDeleteLine", CK_Delete_Line },
112 { "EditDeleteToLineEnd", CK_Delete_To_Line_End },
113 { "EditDeleteToLineBegin", CK_Delete_To_Line_Begin },
114 { "EditManPage", CK_Man_Page },
115 { "EditSort", CK_Sort },
116 { "EditMail", CK_Mail },
117 { "EditCancel", CK_Cancel },
118 { "EditComplete", CK_Complete },
119 { "EditParagraphFormat", CK_Paragraph_Format },
120 { "EditUtil", CK_Util },
121 { "EditTypeLoadPython", CK_Type_Load_Python },
122 { "EditFindFile", CK_Find_File },
123 { "EditCtags", CK_Ctags },
124 { "EditMatchBracket", CK_Match_Bracket },
125 { "EditTerminal", CK_Terminal },
126 { "EditTerminalApp", CK_Terminal_App },
127 { "EditExtCmd", CK_ExtCmd },
128 { "EditUserMenu", CK_User_Menu },
129 { "EditBeginRecordMacro", CK_Begin_Record_Macro },
130 { "EditEndRecordMacro", CK_End_Record_Macro },
131 { "EditDeleteMacro", CK_Delete_Macro },
132 { "EditToggleBookmark", CK_Toggle_Bookmark },
133 { "EditFlushBookmarks", CK_Flush_Bookmarks },
134 { "EditNextBookmark", CK_Next_Bookmark },
135 { "EditPrevBookmark", CK_Prev_Bookmark },
136 { "EditPageUpHighlight", CK_Page_Up_Highlight },
137 { "EditPageDownHighlight", CK_Page_Down_Highlight },
138 { "EditLeftHighlight", CK_Left_Highlight },
139 { "EditRightHighlight", CK_Right_Highlight },
140 { "EditWordLeftHighlight", CK_Word_Left_Highlight },
141 { "EditWordRightHighlight", CK_Word_Right_Highlight },
142 { "EditUpHighlight", CK_Up_Highlight },
143 { "EditDownHighlight", CK_Down_Highlight },
144 { "EditHomeHighlight", CK_Home_Highlight },
145 { "EditEndHighlight", CK_End_Highlight },
146 { "EditBeginningOfTextHighlight", CK_Beginning_Of_Text_Highlight },
147 { "EditEndOfTextHighlight", CK_End_Of_Text_Highlight },
148 { "EditBeginPageHighlight", CK_Begin_Page_Highlight },
149 { "EditEndPageHighlight", CK_End_Page_Highlight },
150 { "EditScrollUpHighlight", CK_Scroll_Up_Highlight },
151 { "EditScrollDownHighlight", CK_Scroll_Down_Highlight },
152 { "EditParagraphUpHighlight", CK_Paragraph_Up_Highlight },
153 { "EditParagraphDownHighlight", CK_Paragraph_Down_Highlight },
155 { "EditPageUpAltHighlight", CK_Page_Up_Alt_Highlight },
156 { "EditPageDownAltHighlight", CK_Page_Down_Alt_Highlight },
157 { "EditLeftAltHighlight", CK_Left_Alt_Highlight },
158 { "EditRightAltHighlight", CK_Right_Alt_Highlight },
159 { "EditWordLeftAltHighlight", CK_Word_Left_Alt_Highlight },
160 { "EditWordRightAltHighlight", CK_Word_Right_Alt_Highlight },
161 { "EditUpAltHighlight", CK_Up_Alt_Highlight },
162 { "EditDownAltHighlight", CK_Down_Alt_Highlight },
163 { "EditHomeAltHighlight", CK_Home_Alt_Highlight },
164 { "EditEndAltHighlight", CK_End_Alt_Highlight },
165 { "EditBeginningOfTextAltHighlight", CK_Beginning_Of_Text_Alt_Highlight },
166 { "EditEndOfTextAltHighlight", CK_End_Of_Text_Alt_Highlight },
167 { "EditBeginPageAltHighlight", CK_Begin_Page_Alt_Highlight },
168 { "EditEndPageAltHighlight", CK_End_Page_Alt_Highlight },
169 { "EditScrollUpAltHighlight", CK_Scroll_Up_Alt_Highlight },
170 { "EditScrollDownAltHighlight", CK_Scroll_Down_Alt_Highlight },
171 { "EditParagraphUpAltHighlight", CK_Paragraph_Up_Alt_Highlight },
172 { "EditParagraphDownAltHighlight", CK_Paragraph_Down_Alt_Highlight },
174 { "EditShiftBlockLeft", CK_Shift_Block_Left },
175 { "EditShiftBlockRight", CK_Shift_Block_Right },
177 { "EditXStore", CK_XStore },
178 { "EditXCut", CK_XCut },
179 { "EditXPaste", CK_XPaste },
180 { "EditSelectionHistory", CK_Selection_History },
181 { "EditShell", CK_Shell },
182 { "EditInsertLiteral", CK_Insert_Literal },
183 { "EditExecuteMacro", CK_Execute_Macro },
184 { "EditBeginOrEndMacro", CK_Begin_End_Macro },
185 { "EditExtMode", CK_Ext_Mode },
186 { "EditToggleLineState", CK_Toggle_Line_State },
187 { "EditToggleTabTWS", CK_Toggle_Tab_TWS },
188 { "EditToggleSyntax", CK_Toggle_Syntax },
189 { "EditFindDefinition", CK_Find_Definition },
190 { "EditLoadPrevFile", CK_Load_Prev_File },
191 { "EditLoadNextFile", CK_Load_Next_File },
192 { "EditOptions", CK_Edit_Options },
193 { "EditSaveMode", CK_Edit_Save_Mode },
194 { "EditChooseSyntax", CK_Choose_Syntax },
195 { "EditAbout", CK_About },
197 #if 0
198 { "EditFocusNext", CK_Focus_Next },
199 { "EditFocusPrev", CK_Focus_Prev },
200 { "EditHeightInc", CK_Height_Inc },
201 { "EditHeightDec", CK_Height_Dec },
202 { "EditMake", CK_Make },
203 { "EditErrorNext", CK_Error_Next },
204 { "EditErrorPrev", CK_Error_Prev },
205 #endif
207 #if 0
208 { "EditSaveDesktop", CK_Save_Desktop },
209 { "EditNewWindow", CK_New_Window },
210 { "EditCycle", CK_Cycle },
211 { "EditMenu", CK_Menu },
212 { "EditSaveAndQuit", CK_Save_And_Quit },
213 { "EditRunAnother", CK_Run_Another },
214 { "EditCheckSaveAndQuit", CK_Check_Save_And_Quit },
215 { "EditMaximize", CK_Maximize },
216 #endif
218 #endif
220 /* viewer */
221 { "ViewSearch", CK_ViewSearch },
222 { "ViewContinueSearch", CK_ViewContinueSearch },
223 { "ViewGotoBookmark", CK_ViewGotoBookmark },
224 { "ViewNewBookmark", CK_ViewNewBookmark },
225 { "ViewMoveUp", CK_ViewMoveUp },
226 { "ViewMoveDown", CK_ViewMoveDown },
227 { "ViewMoveLeft", CK_ViewMoveLeft },
228 { "ViewMoveRight", CK_ViewMoveRight },
229 { "ViewMovePgDn", CK_ViewMovePgDn },
230 { "ViewMovePgUp", CK_ViewMovePgUp },
231 { "ViewMoveHalfPgDn", CK_ViewMoveHalfPgDn },
232 { "ViewMoveHalfPgUp", CK_ViewMoveHalfPgUp },
233 { "ViewMoveToBol", CK_ViewMoveToBol },
234 { "ViewMoveToEol", CK_ViewMoveToEol },
235 { "ViewNextFile", CK_ViewNextFile },
236 { "ViewPrevFile", CK_ViewPrevFile },
237 { "ViewToggleRuler", CK_ViewToggleRuler },
238 { "HexViewToggleNavigationMode", CK_HexViewToggleNavigationMode },
239 { "ViewQuit", CK_ViewQuit },
241 /* main commands */
242 { "CmdChmod", CK_ChmodCmd },
243 { "CmdMenuLastSelected", CK_MenuLastSelectedCmd },
244 { "CmdSingleDirsize", CK_SingleDirsizeCmd },
245 { "CmdCopyCurrentPathname", CK_CopyCurrentPathname },
246 { "CmdCopyOtherPathname", CK_CopyOtherPathname },
247 { "CmdSuspend", CK_SuspendCmd },
248 { "CmdToggleListing", CK_ToggleListingCmd },
249 { "CmdChownAdvanced", CK_ChownAdvancedCmd },
250 { "CmdChown", CK_ChownCmd },
251 { "CmdCompareDirs", CK_CompareDirsCmd },
252 { "CmdConfigureBox", CK_ConfigureBox },
253 { "CmdConfigureVfs", CK_ConfigureVfs },
254 { "CmdConfirmBox", CK_ConfirmBox },
255 { "CmdCopy", CK_CopyCmd },
256 { "CmdDelete", CK_DeleteCmd },
257 { "CmdDirsizes", CK_DirsizesCmd },
258 { "CmdDisplayBitsBox", CK_DisplayBitsBox },
259 { "CmdEdit", CK_EditCmd },
260 { "CmdEditExtFile", CK_EditExtFileCmd },
261 { "CmdEditFhlFile", CK_EditFhlFileCmd },
262 { "CmdEditMcMenu", CK_EditMcMenuCmd },
263 { "CmdEditSymlink", CK_EditSymlinkCmd },
264 { "CmdEditSyntax", CK_EditSyntaxCmd },
265 { "CmdEditUserMenu", CK_EditUserMenuCmd },
266 { "CmdExternalPanelize", CK_ExternalPanelize },
267 { "CmdFilter", CK_FilterCmd },
268 { "CmdFilteredView", CK_FilteredViewCmd },
269 { "CmdFind", CK_FindCmd },
270 #ifdef USE_NETCODE
271 { "CmdFishlink", CK_FishlinkCmd },
272 { "CmdFtplink", CK_FtplinkCmd },
273 #endif
274 { "CmdHistory", CK_HistoryCmd },
275 { "CmdInfo", CK_InfoCmd },
276 #ifdef WITH_BACKGROUND
277 { "CmdJobs", CK_JobsCmd },
278 #endif
279 { "CmdLayout", CK_LayoutCmd },
280 { "CmdLearnKeys", CK_LearnKeys },
281 { "CmdLink", CK_LinkCmd },
282 { "CmdListing", CK_ListingCmd },
283 #ifdef LISTMODE_EDITOR
284 { "CmdListmodeCmd", CK_ListmodeCmd }.
285 #endif
286 { "CmdMenuInfo", CK_MenuInfoCmd },
287 { "CmdMenuQuickView", CK_MenuQuickViewCmd },
288 { "CmdMkdir", CK_MkdirCmd },
289 #if defined (USE_NETCODE) && defined (ENABLE_VFS_MCFS)
290 { "CmdNetlink", CK_NetlinkCmd },
291 #endif
292 { "CmdQuickCd", CK_QuickCdCmd },
293 { "CmdQuickChdir", CK_QuickChdirCmd },
294 { "CmdQuickView", CK_QuickViewCmd },
295 { "CmdQuietQuit", CK_QuietQuitCmd },
296 { "CmdRename", CK_RenameCmd },
297 { "CmdReread", CK_RereadCmd },
298 { "CmdReselectVfs", CK_ReselectVfs },
299 { "CmdReverseSelection", CK_ReverseSelectionCmd },
300 { "CmdSaveSetup", CK_SaveSetupCmd },
301 { "CmdSelect", CK_SelectCmd },
302 #if defined (USE_NETCODE) && defined (WITH_SMBFS)
303 { "CmdSmblinkCmd", CK_SmblinkCmd },
304 #endif
305 { "CmdSwapPanel", CK_SwapCmd },
306 { "CmdSymlink", CK_SymlinkCmd },
307 { "CmdTree", CK_TreeCmd },
308 { "CmdTreeBox", CK_TreeBoxCmd },
309 #ifdef USE_EXT2FSLIB
310 { "CmdUndelete", CK_UndeleteCmd },
311 #endif
312 { "CmdUnselect", CK_UnselectCmd },
313 { "CmdUserMenu", CK_UserMenuCmd },
314 { "CmdUserFileMenu", CK_UserFileMenuCmd },
315 { "CmdView", CK_ViewCmd },
316 { "CmdViewFile", CK_ViewFileCmd },
317 { "CmdCopyCurrentReadlink", CK_CopyCurrentReadlink },
318 { "CmdCopyOtherReadlink", CK_CopyOtherReadlink },
319 { "CmdAddHotlist", CK_AddHotlist },
320 { "CmdQuit", CK_QuitCmd },
321 { "CmdCopyCurrentTagged", CK_CopyCurrentTagged },
322 { "CmdCopyOtherTagged", CK_CopyOtherTagged },
323 { "CmdToggleShowHidden", CK_ToggleShowHidden },
325 /* panel */
326 { "PanelChdirOtherPanel", CK_PanelChdirOtherPanel },
327 { "PanelChdirToReadlink", CK_PanelChdirToReadlink },
328 { "PanelCopyLocal", CK_PanelCmdCopyLocal },
329 { "PanelDeleteLocal", CK_PanelCmdDeleteLocal },
330 { "PanelDoEnter", CK_PanelCmdDoEnter },
331 { "PanelEditNew", CK_PanelCmdEditNew },
332 { "PanelRenameLocal", CK_PanelCmdRenameLocal },
333 { "PanelReverseSelection", CK_PanelCmdReverseSelection },
334 { "PanelSelect", CK_PanelCmdSelect },
335 { "PanelUnselect", CK_PanelCmdUnselect },
336 { "PanelViewSimple", CK_PanelCmdViewSimple },
337 { "PanelCtrlNextPage", CK_PanelCtrlNextPage },
338 { "PanelCtrlPrevPage", CK_PanelCtrlPrevPage },
339 { "PanelDirectoryHistoryList", CK_PanelDirectoryHistoryList },
340 { "PanelDirectoryHistoryNext", CK_PanelDirectoryHistoryNext },
341 { "PanelDirectoryHistoryPrev", CK_PanelDirectoryHistoryPrev },
342 { "PanelGotoBottomFile", CK_PanelGotoBottomFile },
343 { "PanelGotoMiddleFile", CK_PanelGotoMiddleFile },
344 { "PanelGotoTopFile", CK_PanelGotoTopFile },
345 { "PanelMarkFile", CK_PanelMarkFile },
346 { "PanelMoveUp", CK_PanelMoveUp },
347 { "PanelMoveDown", CK_PanelMoveDown },
348 { "PanelMoveLeft", CK_PanelMoveLeft },
349 { "PanelMoveRight", CK_PanelMoveRight },
350 { "PanelMoveEnd", CK_PanelMoveEnd },
351 { "PanelMoveHome", CK_PanelMoveHome },
352 { "PanelNextPage", CK_PanelNextPage },
353 { "PanelPrevPage", CK_PanelPrevPage },
354 #ifdef HAVE_CHARSET
355 { "PanelSetPanelEncoding", CK_PanelSetPanelEncoding },
356 #endif
357 { "PanelStartSearch", CK_PanelStartSearch },
358 { "PanelSyncOtherPanel", CK_PanelSyncOtherPanel },
359 { "PanelToggleSortOrderNext", CK_PanelToggleSortOrderNext },
360 { "PanelToggleSortOrderPrev", CK_PanelToggleSortOrderPrev },
361 { "PanelSelectSortOrder", CK_PanelSelectSortOrder },
362 { "PanelReverseSort", CK_PanelReverseSort },
363 { "PanelSortOrderByName", CK_PanelSortOrderByName },
364 { "PanelSortOrderByExt", CK_PanelSortOrderByExt },
365 { "PanelSortOrderBySize", CK_PanelSortOrderBySize },
366 { "PanelSortOrderByMTime", CK_PanelSortOrderByMTime },
368 /* input line */
369 { "InputBol", CK_InputBol },
370 { "InputEol", CK_InputEol },
371 { "InputMoveLeft", CK_InputMoveLeft },
372 { "InputWordLeft", CK_InputWordLeft },
373 { "InputBackwardChar", CK_InputBackwardChar },
374 { "InputBackwardWord", CK_InputBackwardWord },
375 { "InputMoveRight", CK_InputMoveRight },
376 { "InputWordRight", CK_InputWordRight },
377 { "InputForwardChar", CK_InputForwardChar },
378 { "InputForwardWord", CK_InputForwardWord },
379 { "InputBackwardDelete", CK_InputBackwardDelete },
380 { "InputDeleteChar", CK_InputDeleteChar },
381 { "InputKillWord", CK_InputKillWord },
382 { "InputBackwardKillWord", CK_InputBackwardKillWord },
383 { "InputSetMark", CK_InputSetMark },
384 { "InputKillRegion", CK_InputKillRegion },
385 { "InputYank", CK_InputYank },
386 { "InputKillLine", CK_InputKillLine },
387 { "InputHistoryPrev", CK_InputHistoryPrev },
388 { "InputHistoryNext", CK_InputHistoryNext },
389 { "InputHistoryShow", CK_InputHistoryShow },
390 { "InputComplete", CK_InputComplete },
391 { "InputXStore", CK_InputKillSave },
392 { "InputXPaste", CK_InputPaste },
393 { "InputClearLine", CK_InputClearLine },
395 /* common */
396 { "ExtMap1", CK_StartExtMap1 },
397 { "ExtMap2", CK_StartExtMap2 },
398 { "ShowCommandLine", CK_ShowCommandLine },
399 { "SelectCodepage", CK_SelectCodepage },
401 { NULL, 0 }
404 /*** global variables ****************************************************************************/
406 /* viewer/actions_cmd.c */
407 const global_keymap_t default_viewer_keymap[] = {
408 { '?', CK_ViewSearch, "?" },
409 { '/', CK_ViewSearch, "/" },
410 { XCTRL ('r'), CK_ViewContinueSearch, "C-r" },
411 { XCTRL ('s'), CK_ViewContinueSearch, "C-s" },
412 { KEY_F (17), CK_ViewContinueSearch, "S-F7" },
413 { 'n', CK_ViewContinueSearch, "n" },
414 { ALT ('r'), CK_ViewToggleRuler, "M-r" },
416 { XCTRL ('a'), CK_ViewMoveToBol, "C-a" },
417 { XCTRL ('e'), CK_ViewMoveToEol, "C-e" },
419 { 'h', CK_ViewMoveLeft, "h" },
420 { KEY_LEFT, CK_ViewMoveLeft, "Left" },
422 { 'l', CK_ViewMoveRight, "l" },
423 { KEY_RIGHT, CK_ViewMoveRight, "Right" },
425 { 'k', CK_ViewMoveUp, "k" },
426 { 'y', CK_ViewMoveUp, "y" },
427 { KEY_IC, CK_ViewMoveUp, "Insert" },
428 { KEY_UP, CK_ViewMoveUp, "Up" },
430 { 'j', CK_ViewMoveDown, "j" },
431 { 'e', CK_ViewMoveDown, "e" },
432 { KEY_DOWN, CK_ViewMoveDown, "Down" },
433 { KEY_DC, CK_ViewMoveDown, "Delete" },
435 { ' ', CK_ViewMovePgDn, "Space" },
436 { 'f', CK_ViewMovePgDn, "f" },
437 { KEY_NPAGE, CK_ViewMovePgDn, "PgDn" },
439 { 'b', CK_ViewMovePgUp, "b" },
440 { KEY_PPAGE, CK_ViewMovePgUp, "PgUp" },
442 { 'd', CK_ViewMoveHalfPgDn, "d" },
443 { 'u', CK_ViewMoveHalfPgUp, "u" },
445 { 'm', CK_ViewGotoBookmark, "m" },
446 { 'r', CK_ViewNewBookmark, "r" },
448 { XCTRL ('f'), CK_ViewNextFile, "C-f" },
449 { XCTRL ('b'), CK_ViewPrevFile, "C-b" },
451 { 'q', CK_ViewQuit, "q" },
452 { XCTRL ('g'), CK_ViewQuit, "C-q" },
453 { ESC_CHAR, CK_ViewQuit, "Esc" },
455 { ALT ('e'), CK_SelectCodepage, "M-e" },
456 { XCTRL ('o'), CK_ShowCommandLine, "C-o" },
458 { 0, 0, "" }
461 const global_keymap_t default_viewer_hex_keymap[] = {
462 { '\t', CK_HexViewToggleNavigationMode, "Tab" },
463 { XCTRL ('a'), CK_ViewMoveToBol, "C-a" },
464 { XCTRL ('e'), CK_ViewMoveToEol, "C-e" },
466 { 'b', CK_ViewMoveLeft, "b" },
467 { KEY_LEFT, CK_ViewMoveLeft, "Left" },
469 { 'f', CK_ViewMoveRight, "f" },
470 { KEY_RIGHT, CK_ViewMoveRight, "Right" },
472 { 'k', CK_ViewMoveUp, "k" },
473 { 'y', CK_ViewMoveUp, "y" },
474 { KEY_UP, CK_ViewMoveUp, "Up" },
476 { 'j', CK_ViewMoveDown, "j" },
477 { KEY_DOWN, CK_ViewMoveDown, "Down" },
478 { KEY_DC, CK_ViewMoveDown, "Delete" },
480 { 0, 0, "" }
483 #ifdef USE_INTERNAL_EDIT
484 /* ../edit/editkeys.c */
485 const global_keymap_t default_editor_keymap[] = {
486 { '\n', CK_Enter, "Enter" },
487 { '\t', CK_Tab, "Tab" },
489 { ESC_CHAR, CK_Quit, "Esc" },
490 { KEY_BACKSPACE, CK_BackSpace, "BackSpace" },
491 { KEY_DC, CK_Delete, "Delete" },
492 { KEY_DOWN, CK_Down, "Down" },
493 { KEY_END, CK_End, "End" },
494 { KEY_HOME, CK_Home, "Home" },
495 { KEY_IC, CK_Toggle_Insert, "Insert" },
496 { KEY_LEFT, CK_Left, "Left" },
497 { KEY_NPAGE, CK_Page_Down, "PgDn" },
498 { KEY_PPAGE, CK_Page_Up, "PgUp" },
499 { KEY_RIGHT, CK_Right, "Right" },
500 { KEY_UP, CK_Up, "Up" },
502 { ALT ('\n'), CK_Find_Definition, "M-Enter" },
503 { ALT ('\t'), CK_Complete_Word, "M-Tab" },
504 { ALT ('l'), CK_Goto, "M-l" },
505 { ALT ('L'), CK_Goto, "M-L" },
506 { ALT ('p'), CK_Paragraph_Format, "M-p" },
507 { ALT ('t'), CK_Sort, "M-t" },
508 { ALT ('u'), CK_ExtCmd, "M-u" },
509 { ALT ('<'), CK_Beginning_Of_Text, "M-<" },
510 { ALT ('>'), CK_End_Of_Text, "M->" },
511 { ALT ('-'), CK_Load_Prev_File, "M--" },
512 { ALT ('+'), CK_Load_Next_File, "M-+" },
513 { ALT ('d'), CK_Delete_Word_Right, "M-d" },
514 { ALT (KEY_BACKSPACE), CK_Delete_Word_Left, "M-BackSpace" },
515 { ALT ('n'), CK_Toggle_Line_State, "M-n" },
516 { ALT ('_'), CK_Toggle_Tab_TWS, "M-_" },
517 { ALT ('k'), CK_Toggle_Bookmark, "M-k" },
518 { ALT ('i'), CK_Prev_Bookmark, "M-i" },
519 { ALT ('j'), CK_Next_Bookmark, "M-j" },
520 { ALT ('o'), CK_Flush_Bookmarks, "M-o" },
522 { XCTRL ('n'), CK_New, "C-n" },
523 { XCTRL ('k'), CK_Delete_To_Line_End, "C-k" },
524 { XCTRL ('l'), CK_Refresh, "C-l" },
525 { XCTRL ('o'), CK_Shell, "C-o" },
526 { XCTRL ('s'), CK_Toggle_Syntax, "C-s" },
527 { XCTRL ('u'), CK_Undo, "C-u" },
528 { ALT ('e'), CK_SelectCodepage, "M-e" },
529 { XCTRL ('q'), CK_Insert_Literal, "C-q" },
530 { XCTRL ('r'), CK_Begin_End_Macro, "C-r" },
531 { XCTRL ('r'), CK_Begin_Record_Macro, "C-r" },
532 { XCTRL ('r'), CK_End_Record_Macro, "C-r" },
533 { XCTRL ('a'), CK_Execute_Macro, "C-a" },
535 { KEY_F (1), CK_Help, "F1" },
536 { KEY_F (2), CK_Save, "F2" },
537 { KEY_F (3), CK_Mark, "F3" },
538 { KEY_F (4), CK_Replace, "F4" },
539 { KEY_F (5), CK_Copy, "F5" },
540 { KEY_F (6), CK_Move, "F6" },
541 { KEY_F (7), CK_Find, "F7" },
542 { KEY_F (8), CK_Remove, "F8" },
543 { KEY_F (10), CK_Quit, "F10" },
544 /* edit user menu */
545 { KEY_F (11), CK_User_Menu, "S-F1" },
546 { KEY_F (12), CK_Save_As, "S-F2" },
547 { KEY_F (13), CK_Column_Mark, "S-F3" },
548 { KEY_F (14), CK_Replace_Again, "S-F4" },
549 { KEY_F (15), CK_Insert_File, "S-F5" },
550 { KEY_F (17), CK_Find_Again, "S-F6" },
551 /* C formatter */
552 { KEY_F (19), CK_Pipe_Block (0), "S-F9" },
554 /* Shift */
555 { KEY_M_SHIFT | KEY_NPAGE, CK_Page_Down_Highlight, "S-PgDn" },
556 { KEY_M_SHIFT | KEY_PPAGE, CK_Page_Up_Highlight, "S-PgUp" },
557 { KEY_M_SHIFT | KEY_LEFT, CK_Left_Highlight, "S-Left" },
558 { KEY_M_SHIFT | KEY_RIGHT, CK_Right_Highlight, "S-Right" },
559 { KEY_M_SHIFT | KEY_UP, CK_Up_Highlight, "S-Up" },
560 { KEY_M_SHIFT | KEY_DOWN, CK_Down_Highlight, "S-Down" },
561 { KEY_M_SHIFT | KEY_HOME, CK_Home_Highlight, "S-Home" },
562 { KEY_M_SHIFT | KEY_END, CK_End_Highlight, "S-End" },
563 { KEY_M_SHIFT | KEY_IC, CK_XPaste, "S-Insert" },
564 { KEY_M_SHIFT | KEY_DC, CK_XCut, "S-Delete" },
565 /* useful for pasting multiline text */
566 { KEY_M_SHIFT | '\n', CK_Return, "S-Enter" },
568 /* Alt */
569 { KEY_M_ALT | KEY_NPAGE, CK_Page_Down_Alt_Highlight, "M-PgDn" },
570 { KEY_M_ALT | KEY_PPAGE, CK_Page_Up_Alt_Highlight, "M-PgUp" },
571 { KEY_M_ALT | KEY_LEFT, CK_Left_Alt_Highlight, "M-Left" },
572 { KEY_M_ALT | KEY_RIGHT, CK_Right_Alt_Highlight, "M-Right" },
573 { KEY_M_ALT | KEY_UP, CK_Up_Alt_Highlight, "M-Up" },
574 { KEY_M_ALT | KEY_DOWN, CK_Down_Alt_Highlight, "M-Down" },
575 { KEY_M_ALT | KEY_HOME, CK_Home_Highlight, "M-Home" },
576 { KEY_M_ALT | KEY_END, CK_End_Alt_Highlight, "M-End" },
578 /* Ctrl */
579 { KEY_M_CTRL | (KEY_F (2)), CK_Save_As, "C-F2" },
580 { KEY_M_CTRL | (KEY_F (4)), CK_Replace_Again, "C-F4" },
581 { KEY_M_CTRL | (KEY_F (7)), CK_Find_Again, "C-F7" },
582 { KEY_M_CTRL | KEY_BACKSPACE, CK_Undo, "C-BackSpase" },
583 { KEY_M_CTRL | KEY_NPAGE, CK_End_Of_Text, "C-PgDn" },
584 { KEY_M_CTRL | KEY_PPAGE, CK_Beginning_Of_Text, "C-PgUp" },
585 { KEY_M_CTRL | KEY_HOME, CK_Beginning_Of_Text, "C-Home" },
586 { KEY_M_CTRL | KEY_END, CK_End_Of_Text, "C-End" },
587 { KEY_M_CTRL | KEY_UP, CK_Scroll_Up, "C-Up" },
588 { KEY_M_CTRL | KEY_DOWN, CK_Scroll_Down, "C-Down" },
589 { KEY_M_CTRL | KEY_LEFT, CK_Word_Left, "C-Left" },
590 { KEY_M_CTRL | KEY_RIGHT, CK_Word_Right, "C-Right" },
591 { KEY_M_CTRL | KEY_IC, CK_XStore, "C-Insert" },
592 { KEY_M_CTRL | KEY_DC, CK_Remove, "C-Delete" },
594 /* Ctrl + Shift */
595 { KEY_M_SHIFT | KEY_M_CTRL | KEY_NPAGE, CK_End_Of_Text_Highlight, "C-S-PgDn" },
596 { KEY_M_SHIFT | KEY_M_CTRL | KEY_PPAGE, CK_Beginning_Of_Text_Highlight, "C-S-PgUp" },
597 { KEY_M_SHIFT | KEY_M_CTRL | KEY_LEFT, CK_Word_Left_Highlight, "C-S-Left" },
598 { KEY_M_SHIFT | KEY_M_CTRL | KEY_RIGHT, CK_Word_Right_Highlight, "C-S-Right" },
599 { KEY_M_SHIFT | KEY_M_CTRL | KEY_UP, CK_Scroll_Up_Highlight, "C-S-Up" },
600 { KEY_M_SHIFT | KEY_M_CTRL | KEY_DOWN, CK_Scroll_Down_Highlight, "C-S-Down" },
602 { XCTRL ('x'), CK_Ext_Mode, "C-x" },
604 { 0, 0, "" }
607 /* emacs keyboard layout emulation */
608 const global_keymap_t default_editor_x_keymap[] = {
609 { 'k', CK_New, "k"},
610 { 'e', CK_Execute_Macro, "e"},
611 { 0, 0, "" }
613 #endif
615 /* screen.c */
616 const global_keymap_t default_panel_keymap[] = {
617 { ALT ('o'), CK_PanelChdirOtherPanel, "M-o" },
618 { ALT ('l'), CK_PanelChdirToReadlink, "M-l" },
619 { KEY_F (15), CK_PanelCmdCopyLocal, "S-F5" },
620 { KEY_F (18), CK_PanelCmdDeleteLocal, "S-F8" },
621 { KEY_ENTER, CK_PanelCmdDoEnter, "Enter" },
622 { '\n', CK_PanelCmdDoEnter, "Enter" },
623 { KEY_F (14), CK_PanelCmdEditNew, "S-F4" },
624 { KEY_F (16), CK_PanelCmdRenameLocal, "S-F6" },
625 { ALT ('*'), CK_PanelCmdReverseSelection, "M-*" },
626 { KEY_KP_ADD, CK_PanelCmdSelect, "Gray+" },
627 { KEY_KP_SUBTRACT, CK_PanelCmdUnselect, "Gray-" },
628 { KEY_F (13), CK_PanelCmdViewSimple, "S-F3" },
629 { KEY_M_CTRL | KEY_NPAGE, CK_PanelCtrlNextPage, "C-PgDn" },
630 { KEY_M_CTRL | KEY_PPAGE, CK_PanelCtrlPrevPage, "C-PgUp" },
631 { ALT ('H'), CK_PanelDirectoryHistoryList, "M-H" },
632 { ALT ('u'), CK_PanelDirectoryHistoryNext, "M-u" },
633 { ALT ('y'), CK_PanelDirectoryHistoryPrev, "M-y" },
634 { ALT ('j'), CK_PanelGotoBottomFile, "M-j" },
635 { ALT ('r'), CK_PanelGotoMiddleFile, "M-r" },
636 { ALT ('g'), CK_PanelGotoTopFile, "M-g" },
637 { KEY_IC, CK_PanelMarkFile, "Insert" },
638 { KEY_UP, CK_PanelMoveUp, "Up" },
639 { KEY_DOWN, CK_PanelMoveDown, "Down" },
640 { KEY_LEFT, CK_PanelMoveLeft, "Left" },
641 { KEY_RIGHT, CK_PanelMoveRight, "Right" },
642 { KEY_END, CK_PanelMoveEnd, "End" },
643 { KEY_HOME, CK_PanelMoveHome, "Home" },
644 { KEY_A1, CK_PanelMoveHome, "Home" },
645 { KEY_NPAGE, CK_PanelNextPage, "PgDn" },
646 { KEY_PPAGE, CK_PanelPrevPage, "PgUp" },
647 { ALT ('e'), CK_PanelSetPanelEncoding, "M-e" },
648 { XCTRL ('s'), CK_PanelStartSearch, "C-s" },
649 { ALT ('s'), CK_PanelStartSearch, "M-s" },
650 { ALT ('i'), CK_PanelSyncOtherPanel, "M-i" },
652 { 0, 0 , "" }
655 /* main.c */
656 const global_keymap_t default_main_map[] = {
657 { KEY_F (2), CK_UserMenuCmd, "F2" },
658 { KEY_F (3), CK_ViewCmd, "F3" },
659 { KEY_F (4), CK_EditCmd, "F4" },
660 { KEY_F (5), CK_CopyCmd, "F5" },
661 { KEY_F (6), CK_RenameCmd, "F6" },
662 { KEY_F (7), CK_MkdirCmd, "F7" },
663 { KEY_F (8), CK_DeleteCmd, "F6" },
664 { KEY_F (10), CK_QuitCmd, "F10" },
665 { KEY_F (13), CK_ViewFileCmd, "S-F3" },
666 { KEY_F (19), CK_MenuLastSelectedCmd, "S-F9" },
667 { KEY_F (20), CK_QuietQuitCmd, "S-10" },
668 { ALT ('h'), CK_HistoryCmd, "M-h" },
669 { XCTRL ('@'), CK_SingleDirsizeCmd, "C-Space" },
670 /* Copy useful information to the command line */
671 { ALT ('a'), CK_CopyCurrentPathname, "M-a" },
672 { ALT ('A'), CK_CopyOtherPathname, "M-A" },
673 { ALT ('c'), CK_QuickCdCmd, "M-c" },
674 /* To access the directory hotlist */
675 { XCTRL ('\\'), CK_QuickChdirCmd, "C-\\" },
676 /* Suspend */
677 { XCTRL ('z'), CK_SuspendCmd, "C-z" },
678 /* The filtered view command */
679 { ALT ('!'), CK_FilteredViewCmd, "M-!" },
680 /* Find file */
681 { ALT ('?'), CK_FindCmd, "M-?" },
682 /* Panel refresh */
683 { XCTRL ('r'), CK_RereadCmd, "C-r" },
684 /* Toggle listing between long, user defined and full formats */
685 { ALT ('t'), CK_ToggleListingCmd, "M-t" },
686 /* Swap panels */
687 { XCTRL ('u'), CK_SwapCmd, "C-u" },
688 /* View output */
689 { XCTRL ('o'), CK_ShowCommandLine, "C-o" },
690 { ALT ('.'), CK_ToggleShowHidden, "M-." },
691 { XCTRL ('x'), CK_StartExtMap1, "C-x" },
692 /* Select/unselect group */
693 { ALT ('*'), CK_SelectCmd, "M-*" },
694 { KEY_KP_ADD, CK_UnselectCmd, "Gray+" },
695 { KEY_KP_SUBTRACT, CK_ReverseSelectionCmd, "Gray-" },
697 { 0, 0, "" }
700 const global_keymap_t default_main_x_map[] = {
701 { XCTRL ('c'), CK_QuitCmd, "C-c" },
702 { 'd', CK_CompareDirsCmd, "d" },
703 #ifdef USE_VFS
704 { 'a', CK_ReselectVfs, "a"},
705 #endif /* USE_VFS */
706 { 'p', CK_CopyCurrentPathname, "p" },
707 { XCTRL ('p'), CK_CopyOtherPathname, "C-p" },
708 { 't', CK_CopyCurrentTagged, "t" },
709 { XCTRL ('t'), CK_CopyOtherTagged, "C-t" },
710 { 'c', CK_ChmodCmd, "c" },
711 { 'o', CK_ChownCmd, "o" },
712 { 'r', CK_CopyCurrentReadlink, "r" },
713 { XCTRL ('r'), CK_CopyOtherReadlink, "C-r" },
714 { 'l', CK_LinkCmd, "l" },
715 { 's', CK_SymlinkCmd, "s" },
716 { XCTRL ('s'), CK_EditSymlinkCmd, "C-s" },
717 { 'i', CK_MenuInfoCmd, "i" },
718 { 'i', CK_InfoCmd, "i" },
719 { 'q', CK_QuickViewCmd, "q" },
720 { 'h', CK_AddHotlist, "h" },
721 { '!', CK_ExternalPanelize, "!" },
722 #ifdef WITH_BACKGROUND
723 { 'j', CK_JobsCmd, "j" },
724 #endif /* WITH_BACKGROUND */
726 { 0, 0, "" }
729 const global_keymap_t default_input_keymap[] = {
730 /* Motion */
731 { XCTRL ('a'), CK_InputBol, "C-a" },
732 { KEY_HOME, CK_InputBol, "Home" },
733 { KEY_A1, CK_InputBol, "Home" },
734 { ALT ('<'), CK_InputBol, "M-<" },
735 { XCTRL ('e'), CK_InputEol, "C-e" },
736 { KEY_END, CK_InputEol, "End" },
737 { KEY_C1, CK_InputEol, "End" },
738 { ALT ('>'), CK_InputEol, "M->" },
739 { KEY_LEFT, CK_InputMoveLeft, "left" },
740 { KEY_M_CTRL | KEY_LEFT, CK_InputWordLeft, "C-Left" },
741 { KEY_RIGHT, CK_InputMoveRight, "Right" },
742 { KEY_M_CTRL | KEY_RIGHT, CK_InputWordRight, "C-Right" },
744 { XCTRL ('b'), CK_InputBackwardChar, "C-b" },
745 { ALT ('b'), CK_InputBackwardWord, "M-b" },
746 { XCTRL ('f'), CK_InputForwardChar, "C-f" },
747 { ALT ('f'), CK_InputForwardWord, "M-f" },
749 /* Editing */
750 { KEY_BACKSPACE, CK_InputBackwardDelete, "BackSpace" },
751 { KEY_DC, CK_InputDeleteChar, "Delete" },
752 { ALT ('d'), CK_InputKillWord, "M-d" },
753 { ALT (KEY_BACKSPACE), CK_InputBackwardKillWord, "M-BackSpace" },
755 /* Region manipulation */
756 { XCTRL ('w'), CK_InputKillRegion, "C-w" },
757 { ALT ('w'), CK_InputKillSave, "M-w" },
758 { XCTRL ('y'), CK_InputYank, "C-y" },
759 { XCTRL ('k'), CK_InputKillLine, "C-k" },
761 /* History */
762 { ALT ('p'), CK_InputHistoryPrev, "M-p" },
763 { ALT ('n'), CK_InputHistoryNext, "M-n" },
764 { ALT ('h'), CK_InputHistoryShow, "M-h" },
766 /* Completion */
767 { ALT ('\t'), CK_InputComplete, "M-tab" },
769 { 0, 0, "" }
774 lookup_action (const char *keyname)
776 int i;
778 for (i = 0; command_names [i].name; i++)
779 if (!str_casecmp (command_names [i].name, keyname))
780 return command_names [i].val;
782 return 0;
785 static void
786 keymap_add (GArray *keymap, int key, int cmd, const char *caption)
788 if (key != 0 && cmd != 0) {
789 global_keymap_t new_bind;
791 new_bind.key = key;
792 new_bind.command = cmd;
793 g_snprintf (new_bind.caption, sizeof (new_bind.caption), "%s", caption);
794 g_array_append_val (keymap, new_bind);
798 void
799 keybind_cmd_bind (GArray *keymap, const char *keybind, int action)
801 char *caption = NULL;
802 int key;
804 key = lookup_key (keybind, &caption);
805 keymap_add (keymap, key, action, caption);
806 g_free (caption);
809 const char *
810 lookup_keymap_shortcut (const global_keymap_t *keymap, int action)
812 unsigned int i;
814 for (i = 0; keymap[i].key != 0; i++)
815 if (keymap[i].command == action)
816 return (keymap[i].caption[0] != '\0') ? keymap[i].caption : NULL;
818 return NULL;