Ticket #1711: i18n: context and cleanup in file prompt strings
[midnight-commander.git] / src / keybind.c
blob2ebb08172a644b7cd021a7b372ecdaee128b9c39
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 },
162 { "EditPageUpAltHighlight", CK_Page_Up_Alt_Highlight },
163 { "EditPageDownAltHighlight", CK_Page_Down_Alt_Highlight },
164 { "EditLeftAltHighlight", CK_Left_Alt_Highlight },
165 { "EditRightAltHighlight", CK_Right_Alt_Highlight },
166 { "EditWordLeftAltHighlight", CK_Word_Left_Alt_Highlight },
167 { "EditWordRightAltHighlight", CK_Word_Right_Alt_Highlight },
168 { "EditUpAltHighlight", CK_Up_Alt_Highlight },
169 { "EditDownAltHighlight", CK_Down_Alt_Highlight },
170 { "EditHomeAltHighlight", CK_Home_Alt_Highlight },
171 { "EditEndAltHighlight", CK_End_Alt_Highlight },
172 { "EditBeginningOfTextAltHighlight", CK_Beginning_Of_Text_Alt_Highlight },
173 { "EditEndOfTextAltHighlight", CK_End_Of_Text_Alt_Highlight },
174 { "EditBeginPageAltHighlight", CK_Begin_Page_Alt_Highlight },
175 { "EditEndPageAltHighlight", CK_End_Page_Alt_Highlight },
176 { "EditScrollUpAltHighlight", CK_Scroll_Up_Alt_Highlight },
177 { "EditScrollDownAltHighlight", CK_Scroll_Down_Alt_Highlight },
178 { "EditParagraphUpAltHighlight", CK_Paragraph_Up_Alt_Highlight },
179 { "EditParagraphDownAltHighlight", CK_Paragraph_Down_Alt_Highlight },
181 { "EditXStore", CK_XStore },
182 { "EditXCut", CK_XCut },
183 { "EditXPaste", CK_XPaste },
184 { "EditSelectionHistory", CK_Selection_History },
185 { "EditShell", CK_Shell },
186 { "EditInsertLiteral", CK_Insert_Literal },
187 { "EditExecuteMacro", CK_Execute_Macro },
188 { "EditBeginorEndMacro", CK_Begin_End_Macro },
189 { "EditExtmode", CK_Ext_Mode },
190 { "EditToggleLineState", CK_Toggle_Line_State },
191 { "EditToggleTabTWS", CK_Toggle_Tab_TWS },
192 { "EditToggleSyntax", CK_Toggle_Syntax },
193 { "EditFindDefinition", CK_Find_Definition },
194 { "EditLoadPrevFile", CK_Load_Prev_File },
195 { "EditLoadNextFile", CK_Load_Next_File },
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 /* viewer */
208 { "ViewSearch", CK_ViewSearch },
209 { "ViewContinueSearch", CK_ViewContinueSearch },
210 { "ViewGotoBookmark", CK_ViewGotoBookmark },
211 { "ViewNewBookmark", CK_ViewNewBookmark },
212 { "ViewMoveUp", CK_ViewMoveUp },
213 { "ViewMoveDown", CK_ViewMoveDown },
214 { "ViewMoveLeft", CK_ViewMoveLeft },
215 { "ViewMoveRight", CK_ViewMoveRight },
216 { "ViewMovePgDn", CK_ViewMovePgDn },
217 { "ViewMovePgUp", CK_ViewMovePgUp },
218 { "ViewMoveHalfPgDn", CK_ViewMoveHalfPgDn },
219 { "ViewMoveHalfPgUp", CK_ViewMoveHalfPgUp },
220 { "ViewMoveToBol", CK_ViewMoveToBol },
221 { "ViewMoveToEol", CK_ViewMoveToEol },
222 { "ViewNextFile", CK_ViewNextFile },
223 { "ViewPrevFile", CK_ViewPrevFile },
224 { "ViewToggleRuler", CK_ViewToggleRuler },
225 { "HexViewToggleNavigationMode", CK_HexViewToggleNavigationMode },
226 { "ViewQuit", CK_ViewQuit },
228 /* main commands */
229 { "CmdChmod", CK_ChmodCmd },
230 { "CmdMenuLastSelected", CK_MenuLastSelectedCmd },
231 { "CmdSingleDirsize", CK_SingleDirsizeCmd },
232 { "CmdCopyCurrentPathname", CK_CopyCurrentPathname },
233 { "CmdCopyOtherPathname", CK_CopyOtherPathname },
234 { "CmdSuspend", CK_SuspendCmd },
235 { "CmdToggleListing", CK_ToggleListingCmd },
236 { "CmdChownAdvanced", CK_ChownAdvancedCmd },
237 { "CmdChown", CK_ChownCmd },
238 { "CmdCompareDirs", CK_CompareDirsCmd },
239 { "CmdConfigureBox", CK_ConfigureBox },
240 { "CmdConfigureVfs", CK_ConfigureVfs },
241 { "CmdConfirmBox", CK_ConfirmBox },
242 { "CmdCopy", CK_CopyCmd },
243 { "CmdDelete", CK_DeleteCmd },
244 { "CmdDirsizes", CK_DirsizesCmd },
245 { "CmdDisplayBitsBox", CK_DisplayBitsBox },
246 { "CmdEdit", CK_EditCmd },
247 { "CmdEditMcMenu", CK_EditMcMenuCmd },
248 { "CmdEditSymlink", CK_EditSymlinkCmd },
249 { "CmdEditSyntax", CK_EditSyntaxCmd },
250 { "CmdEditUserMenu", CK_EditUserMenuCmd },
251 { "CmdExternalPanelize", CK_ExternalPanelize },
252 { "CmdFilter", CK_FilterCmd },
253 { "CmdFilteredView", CK_FilteredViewCmd },
254 { "CmdFind", CK_FindCmd },
255 { "CmdFishlink", CK_FishlinkCmd },
256 { "CmdFtplink", CK_FtplinkCmd },
257 { "CmdHistory", CK_HistoryCmd },
258 { "CmdInfo", CK_InfoCmd },
259 { "CmdJobs", CK_JobsCmd },
260 { "CmdLayout", CK_LayoutCmd },
261 { "CmdLearnKeys", CK_LearnKeys },
262 { "CmdLink", CK_LinkCmd },
263 { "CmdListing", CK_ListingCmd },
264 { "CmdMkdir", CK_MkdirCmd },
265 { "CmdQuickCd", CK_QuickCdCmd },
266 { "CmdQuickChdir", CK_QuickChdirCmd },
267 { "CmdQuickView", CK_QuickViewCmd },
268 { "CmdQuietQuit", CK_QuietQuitCmd },
269 { "CmdRename", CK_RenCmd },
270 { "CmdReread", CK_RereadCmd },
271 { "CmdReselectVfs", CK_ReselectVfs },
272 { "CmdReverseSelection", CK_ReverseSelectionCmd },
273 { "CmdSaveSetup", CK_SaveSetupCmd },
274 { "CmdSelect", CK_SelectCmd },
275 { "CmdSwapPanel", CK_SwapCmd },
276 { "CmdSymlink", CK_SymlinkCmd },
277 { "CmdTree", CK_TreeCmd },
278 { "CmdUndelete", CK_UndeleteCmd },
279 { "CmdUnselect", CK_UnselectCmd },
280 { "CmdUserFileMenu", CK_UserFileMenuCmd },
281 { "CmdView", CK_ViewCmd },
282 { "CmdViewFile", CK_ViewFileCmd },
283 { "CmdCopyCurrentReadlink", CK_CopyCurrentReadlink },
284 { "CmdCopyOtherReadlink", CK_CopyOtherReadlink },
285 { "CmdAddHotlist", CK_AddHotlist },
286 { "CmdQuit", CK_QuitCmd },
287 { "CmdCopyOtherTarget", CK_CopyOtherTarget },
288 { "CmdToggleShowHidden", CK_ToggleShowHidden },
290 /* panel */
291 { "PanelChdirOtherPanel", CK_PanelChdirOtherPanel },
292 { "PanelChdirToReadlink", CK_PanelChdirToReadlink },
293 { "PanelCopyLocal", CK_PanelCmdCopyLocal },
294 { "PanelDeleteLocal", CK_PanelCmdDeleteLocal },
295 { "PanelDoEnter", CK_PanelCmdDoEnter },
296 { "PanelEditNew", CK_PanelCmdEditNew },
297 { "PanelRenameLocal", CK_PanelCmdRenameLocal },
298 { "PanelReverseSelection", CK_PanelCmdReverseSelection },
299 { "PanelSelect", CK_PanelCmdSelect },
300 { "PanelUnselect", CK_PanelCmdUnselect },
301 { "PanelViewSimple", CK_PanelCmdViewSimple },
302 { "PanelCtrlNextPage", CK_PanelCtrlNextPage },
303 { "PanelCtrlPrevPage", CK_PanelCtrlPrevPage },
304 { "PanelDirectoryHistoryList", CK_PanelDirectoryHistoryList },
305 { "PanelDirectoryHistoryNext", CK_PanelDirectoryHistoryNext },
306 { "PanelDirectoryHistoryPrev", CK_PanelDirectoryHistoryPrev },
307 { "PanelGotoBottomFile", CK_PanelGotoBottomFile },
308 { "PanelGotoMiddleFile", CK_PanelGotoMiddleFile },
309 { "PanelGotoTopFile", CK_PanelGotoTopFile },
310 { "PanelMarkFile", CK_PanelMarkFile },
311 { "PanelMoveUp", CK_PanelMoveUp },
312 { "PanelMoveDown", CK_PanelMoveDown },
313 { "PanelMoveLeft", CK_PanelMoveLeft },
314 { "PanelMoveRight", CK_PanelMoveRight },
315 { "PanelMoveEnd", CK_PanelMoveEnd },
316 { "PanelMoveHome", CK_PanelMoveHome },
317 { "PanelNextPage", CK_PanelNextPage },
318 { "PanelPrevPage", CK_PanelPrevPage },
319 { "PanelSetPanelEncoding", CK_PanelSetPanelEncoding },
320 { "PanelStartSearch", CK_PanelStartSearch },
321 { "PanelSyncOtherPanel", CK_PanelSyncOtherPanel },
322 { "PanelToggleSortOrderNext", CK_PanelToggleSortOrderNext },
323 { "PanelToggleSortOrderPrev", CK_PanelToggleSortOrderPrev },
324 { "PanelSelectSortOrder", CK_PanelSelectSortOrder },
325 { "PanelReverseSort", CK_PanelReverseSort },
326 { "PanelSortOrderByName", CK_PanelSortOrderByName },
327 { "PanelSortOrderByExt", CK_PanelSortOrderByExt },
328 { "PanelSortOrderBySize", CK_PanelSortOrderBySize },
329 { "PanelSortOrderByMTime", CK_PanelSortOrderByMTime },
331 /* widgets */
332 { "InputBol", CK_InputBol },
333 { "InputEol", CK_InputEol },
334 { "InputMoveLeft", CK_InputMoveLeft },
335 { "InputWordLeft", CK_InputWordLeft },
336 { "InputBackwardChar", CK_InputBackwardChar },
337 { "InputBackwardWord", CK_InputBackwardWord },
338 { "InputMoveRight", CK_InputMoveRight },
339 { "InputWordRight", CK_InputWordRight },
340 { "InputForwardChar", CK_InputForwardChar },
341 { "InputForwardWord", CK_InputForwardWord },
342 { "InputBackwardDelete", CK_InputBackwardDelete },
343 { "InputDeleteChar", CK_InputDeleteChar },
344 { "InputKillWord", CK_InputKillWord },
345 { "InputBackwardKillWord", CK_InputBackwardKillWord },
346 { "InputSetMark", CK_InputSetMark },
347 { "InputKillRegion", CK_InputKillRegion },
348 { "InputKillSave", CK_InputKillSave },
349 { "InputYank", CK_InputYank },
350 { "InputKillLine", CK_InputKillLine },
351 { "InputHistoryPrev", CK_InputHistoryPrev },
352 { "InputHistoryNext", CK_InputHistoryNext },
353 { "InputHistoryShow", CK_InputHistoryShow },
354 { "InputComplete", CK_InputComplete },
356 /* common */
357 { "ExtMap1", CK_StartExtMap1 },
358 { "ExtMap2", CK_StartExtMap2 },
359 { "ShowCommandLine", CK_ShowCommandLine },
360 { "SelectCodepage", CK_SelectCodepage },
362 { NULL, 0 }
365 /*** global variables ****************************************************************************/
367 /* viewer/actions_cmd.c */
368 const global_key_map_t default_viewer_keymap[] = {
370 { '?', CK_ViewSearch },
371 { '/', CK_ViewSearch },
372 { XCTRL('r'), CK_ViewContinueSearch },
373 { XCTRL('s'), CK_ViewContinueSearch },
374 { KEY_F (17), CK_ViewContinueSearch },
375 { ALT('r'), CK_ViewToggleRuler },
377 { KEY_HOME, CK_ViewMoveToBol },
378 { KEY_END, CK_ViewMoveToEol },
380 { 'h', CK_ViewMoveLeft },
381 { KEY_LEFT, CK_ViewMoveLeft },
383 { 'l', CK_ViewMoveRight },
384 { KEY_RIGHT, CK_ViewMoveRight },
386 { 'k', CK_ViewMoveUp },
387 { 'y', CK_ViewMoveUp },
388 { KEY_IC, CK_ViewMoveUp },
389 { KEY_UP, CK_ViewMoveUp },
391 { 'j', CK_ViewMoveDown },
392 { 'e', CK_ViewMoveDown },
393 { KEY_DOWN, CK_ViewMoveDown },
394 { KEY_DC, CK_ViewMoveDown },
396 { ' ', CK_ViewMovePgDn },
397 { 'f', CK_ViewMovePgDn },
398 { KEY_NPAGE, CK_ViewMovePgDn },
400 { 'b', CK_ViewMovePgUp },
401 { KEY_PPAGE, CK_ViewMovePgUp },
403 { 'd', CK_ViewMoveHalfPgDn },
404 { 'u', CK_ViewMoveHalfPgUp },
406 { 'm', CK_ViewGotoBookmark },
407 { 'r', CK_ViewNewBookmark },
409 { XCTRL ('f'), CK_ViewNextFile },
410 { XCTRL ('b'), CK_ViewPrevFile },
412 { 'q', CK_ViewQuit },
413 { XCTRL ('g'), CK_ViewQuit },
414 { ESC_CHAR, CK_ViewQuit },
416 { XCTRL ('t'), CK_SelectCodepage },
417 { XCTRL('o'), CK_ShowCommandLine },
418 { 0, 0 }
421 const global_key_map_t default_viewer_hex_keymap[] = {
423 { '\t', CK_HexViewToggleNavigationMode },
424 { XCTRL ('a'), CK_ViewMoveToBol },
425 { XCTRL ('e'), CK_ViewMoveToEol },
427 { 'b', CK_ViewMoveLeft },
428 { KEY_LEFT, CK_ViewMoveLeft },
430 { 'f', CK_ViewMoveRight },
431 { KEY_RIGHT, CK_ViewMoveRight },
433 { 'k', CK_ViewMoveUp },
434 { 'y', CK_ViewMoveUp },
435 { KEY_UP, CK_ViewMoveUp },
437 { 'j', CK_ViewMoveDown },
438 { KEY_DOWN, CK_ViewMoveDown },
439 { KEY_DC, CK_ViewMoveDown },
441 { 0, 0 }
444 /* ../edit/editkeys.c */
445 const global_key_map_t default_editor_keymap[] = {
446 { '\n', CK_Enter },
447 { '\t', CK_Tab },
449 { ESC_CHAR, CK_Exit },
450 { KEY_BACKSPACE, CK_BackSpace },
451 { KEY_DC, CK_Delete },
452 { KEY_DOWN, CK_Down },
453 { KEY_END, CK_End },
454 { KEY_HOME, CK_Home },
455 { KEY_IC, CK_Toggle_Insert },
456 { KEY_LEFT, CK_Left },
457 { KEY_NPAGE, CK_Page_Down },
458 { KEY_PPAGE, CK_Page_Up },
459 { KEY_RIGHT, CK_Right },
460 { KEY_UP, CK_Up },
462 { ALT ('\n'), CK_Find_Definition },
463 { ALT ('\t'), CK_Complete_Word },
464 { ALT ('l'), CK_Goto },
465 { ALT ('L'), CK_Goto },
466 { ALT ('p'), CK_Paragraph_Format },
467 { ALT ('t'), CK_Sort },
468 { ALT ('u'), CK_ExtCmd },
469 { ALT ('<'), CK_Beginning_Of_Text },
470 { ALT ('>'), CK_End_Of_Text },
471 { ALT ('-'), CK_Load_Prev_File },
472 { ALT ('='), CK_Load_Next_File },
473 { ALT ('d'), CK_Delete_Word_Right },
474 { ALT (KEY_BACKSPACE), CK_Delete_Word_Left },
475 { ALT ('n'), CK_Toggle_Line_State },
476 { ALT ('_'), CK_Toggle_Tab_TWS },
477 { ALT ('k'), CK_Toggle_Bookmark },
478 { ALT ('i'), CK_Prev_Bookmark },
479 { ALT ('j'), CK_Next_Bookmark },
480 { ALT ('o'), CK_Flush_Bookmarks },
482 { XCTRL ('k'), CK_Delete_To_Line_End },
483 { XCTRL ('l'), CK_Refresh },
484 { XCTRL ('o'), CK_Shell },
485 { XCTRL ('s'), CK_Toggle_Syntax },
486 { XCTRL ('u'), CK_Undo },
487 { XCTRL ('t'), CK_SelectCodepage },
488 { XCTRL ('q'), CK_Insert_Literal },
489 { XCTRL ('a'), CK_Execute_Macro },
490 { XCTRL ('r'), CK_Begin_End_Macro },
492 { KEY_F (1), CK_Help },
493 { KEY_F (2), CK_Save },
494 { KEY_F (3), CK_Mark },
495 { KEY_F (4), CK_Replace },
496 { KEY_F (5), CK_Copy },
497 { KEY_F (6), CK_Move },
498 { KEY_F (7), CK_Find },
499 { KEY_F (8), CK_Remove },
500 { KEY_F (10), CK_Exit },
501 /* edit user menu */
502 { KEY_F (11), CK_User_Menu },
503 { KEY_F (12), CK_Save_As },
504 { KEY_F (13), CK_Column_Mark },
505 { KEY_F (14), CK_Replace_Again },
506 { KEY_F (15), CK_Insert_File },
507 { KEY_F (17), CK_Find_Again },
508 /* C formatter */
509 { KEY_F (19), CK_Pipe_Block (0) },
511 /* Shift */
512 { KEY_M_SHIFT | KEY_PPAGE, CK_Page_Up_Highlight },
513 { KEY_M_SHIFT | KEY_NPAGE, CK_Page_Down_Highlight },
514 { KEY_M_SHIFT | KEY_LEFT, CK_Left_Highlight },
515 { KEY_M_SHIFT | KEY_RIGHT, CK_Right_Highlight },
516 { KEY_M_SHIFT | KEY_UP, CK_Up_Highlight },
517 { KEY_M_SHIFT | KEY_DOWN, CK_Down_Highlight },
518 { KEY_M_SHIFT | KEY_HOME, CK_Home_Highlight },
519 { KEY_M_SHIFT | KEY_END, CK_End_Highlight },
520 { KEY_M_SHIFT | KEY_IC, CK_XPaste },
521 { KEY_M_SHIFT | KEY_DC, CK_XCut },
522 /* useful for pasting multiline text */
523 { KEY_M_SHIFT | '\n', CK_Return },
525 /* Alt */
526 { KEY_M_ALT | KEY_PPAGE, CK_Page_Up_Alt_Highlight },
527 { KEY_M_ALT | KEY_NPAGE, CK_Page_Down_Alt_Highlight },
528 { KEY_M_ALT | KEY_LEFT, CK_Left_Alt_Highlight },
529 { KEY_M_ALT | KEY_RIGHT, CK_Right_Alt_Highlight },
530 { KEY_M_ALT | KEY_UP, CK_Up_Alt_Highlight },
531 { KEY_M_ALT | KEY_DOWN, CK_Down_Alt_Highlight },
532 { KEY_M_ALT | KEY_HOME, CK_Home_Highlight },
533 { KEY_M_ALT | KEY_END, CK_End_Alt_Highlight },
535 /* Ctrl */
536 { KEY_M_CTRL | (KEY_F (2)), CK_Save_As },
537 { KEY_M_CTRL | (KEY_F (4)), CK_Replace_Again },
538 { KEY_M_CTRL | (KEY_F (7)), CK_Find_Again },
539 { KEY_M_CTRL | KEY_BACKSPACE, CK_Undo },
540 { KEY_M_CTRL | KEY_PPAGE, CK_Beginning_Of_Text },
541 { KEY_M_CTRL | KEY_NPAGE, CK_End_Of_Text },
542 { KEY_M_CTRL | KEY_HOME, CK_Beginning_Of_Text },
543 { KEY_M_CTRL | KEY_END, CK_End_Of_Text },
544 { KEY_M_CTRL | KEY_UP, CK_Scroll_Up },
545 { KEY_M_CTRL | KEY_DOWN, CK_Scroll_Down },
546 { KEY_M_CTRL | KEY_LEFT, CK_Word_Left },
547 { KEY_M_CTRL | KEY_RIGHT, CK_Word_Right },
548 { KEY_M_CTRL | KEY_IC, CK_XStore },
549 { KEY_M_CTRL | KEY_DC, CK_Remove },
551 /* Ctrl + Shift */
552 { KEY_M_SHIFT | KEY_M_CTRL | KEY_PPAGE, CK_Beginning_Of_Text_Highlight },
553 { KEY_M_SHIFT | KEY_M_CTRL | KEY_NPAGE, CK_End_Of_Text_Highlight },
554 { KEY_M_SHIFT | KEY_M_CTRL | KEY_LEFT, CK_Word_Left_Highlight },
555 { KEY_M_SHIFT | KEY_M_CTRL | KEY_RIGHT, CK_Word_Right_Highlight },
556 { KEY_M_SHIFT | KEY_M_CTRL | KEY_UP, CK_Scroll_Up_Highlight },
557 { KEY_M_SHIFT | KEY_M_CTRL | KEY_DOWN, CK_Scroll_Down_Highlight },
559 { XCTRL ('x'), CK_StartExtMap1 },
561 { 0, 0 }
564 /* screen.c */
565 const global_key_map_t default_panel_keymap[] = {
567 { ALT('o'), CK_PanelChdirOtherPanel },
568 { ALT('l'), CK_PanelChdirToReadlink },
569 { KEY_F(15), CK_PanelCmdCopyLocal },
570 { KEY_F(18), CK_PanelCmdDeleteLocal },
571 { KEY_ENTER, CK_PanelCmdDoEnter },
572 { '\n', CK_PanelCmdDoEnter },
573 { KEY_F(14), CK_PanelCmdEditNew },
574 { KEY_F(16), CK_PanelCmdRenameLocal },
575 { ALT('*'), CK_PanelCmdReverseSelection },
576 { KEY_KP_ADD, CK_PanelCmdSelect },
577 { KEY_KP_SUBTRACT, CK_PanelCmdUnselect },
578 { KEY_F(13), CK_PanelCmdViewSimple },
579 { KEY_M_CTRL | KEY_NPAGE, CK_PanelCtrlNextPage },
580 { KEY_M_CTRL | KEY_PPAGE, CK_PanelCtrlPrevPage },
581 { ALT('H'), CK_PanelDirectoryHistoryList },
582 { ALT('u'), CK_PanelDirectoryHistoryNext },
583 { ALT('y'), CK_PanelDirectoryHistoryPrev },
584 { ALT('j'), CK_PanelGotoBottomFile },
585 { ALT('r'), CK_PanelGotoMiddleFile },
586 { ALT('g'), CK_PanelGotoTopFile },
587 { KEY_IC, CK_PanelMarkFile },
588 { KEY_UP, CK_PanelMoveUp },
589 { KEY_DOWN, CK_PanelMoveDown },
590 { KEY_LEFT, CK_PanelMoveLeft },
591 { KEY_RIGHT, CK_PanelMoveRight },
592 { KEY_END, CK_PanelMoveEnd },
593 { KEY_HOME, CK_PanelMoveHome },
594 { KEY_A1, CK_PanelMoveHome },
595 { KEY_NPAGE, CK_PanelNextPage },
596 { KEY_PPAGE, CK_PanelPrevPage },
597 { XCTRL('t'), CK_PanelSetPanelEncoding },
598 { XCTRL('s'), CK_PanelStartSearch },
599 { ALT('i'), CK_PanelSyncOtherPanel },
600 { 0, 0 }
603 /* main.c */
604 const global_key_map_t default_main_map[] = {
605 {KEY_F (19), CK_MenuLastSelectedCmd},
606 {KEY_F (20), CK_QuietQuitCmd},
607 {XCTRL ('@'), CK_SingleDirsizeCmd},
608 /* Copy useful information to the command line */
609 {ALT ('a'), CK_CopyCurrentPathname},
610 {ALT ('A'), CK_CopyOtherPathname},
611 {ALT ('c'), CK_QuickCdCmd},
612 /* To access the directory hotlist */
613 {XCTRL ('\\'), CK_QuickChdirCmd},
614 /* Suspend */
615 {XCTRL ('z'), CK_SuspendCmd},
616 /* The filtered view command */
617 {ALT ('!'), CK_FilteredViewCmd},
618 /* Find file */
619 {ALT ('?'), CK_FindCmd},
620 /* Panel refresh */
621 {XCTRL ('r'), CK_RereadCmd},
622 /* Toggle listing between long, user defined and full formats */
623 {ALT ('t'), CK_ToggleListingCmd},
624 /* Swap panels */
625 {XCTRL ('u'), CK_SwapCmd},
626 /* View output */
627 {XCTRL ('o'), CK_ShowCommandLine},
628 {ALT ('.'), CK_ToggleShowHidden},
629 {XCTRL ('x'), CK_StartExtMap1 },
630 { 0, 0 }
633 const global_key_map_t default_main_x_map[] = {
634 {XCTRL ('c'), CK_QuitCmd},
635 {'d', CK_CompareDirsCmd},
636 #ifdef USE_VFS
637 {'a', CK_ReselectVfs},
638 #endif /* USE_VFS */
639 {'p', CK_CopyCurrentPathname},
640 {XCTRL ('p'), CK_CopyOtherPathname},
641 {'t', CK_CopyCurrentTagged},
642 {XCTRL ('t'), CK_CopyOtherTarget},
643 {'c', CK_ChmodCmd},
644 {'o', CK_ChownCmd},
645 {'r', CK_CopyCurrentReadlink},
646 {XCTRL ('r'), CK_CopyOtherReadlink},
647 {'l', CK_LinkCmd},
648 {'s', CK_SymlinkCmd},
649 {XCTRL ('s'), CK_EditSymlinkCmd},
650 {'i', CK_InfoCmd},
651 {'q', CK_QuickViewCmd},
652 {'h', CK_AddHotlist},
653 {'!', CK_ExternalPanelize},
654 #ifdef WITH_BACKGROUND
655 {'j', CK_JobsCmd},
656 #endif /* WITH_BACKGROUND */
657 {0, 0}
660 const global_key_map_t default_input_keymap[] = {
661 /* Motion */
662 { XCTRL('a'), CK_InputBol },
663 { KEY_HOME, CK_InputBol },
664 { KEY_A1, CK_InputBol },
665 { ALT ('<'), CK_InputBol },
666 { XCTRL('e'), CK_InputEol },
667 { KEY_END, CK_InputEol },
668 { KEY_C1, CK_InputEol },
669 { ALT ('>'), CK_InputEol },
670 { KEY_LEFT, CK_InputMoveLeft },
671 { KEY_LEFT | KEY_M_CTRL, CK_InputWordLeft },
672 { KEY_RIGHT, CK_InputMoveRight },
673 { KEY_RIGHT | KEY_M_CTRL, CK_InputWordRight },
675 { XCTRL('b'), CK_InputBackwardChar },
676 { ALT('b'), CK_InputBackwardWord },
677 { XCTRL('f'), CK_InputForwardChar },
678 { ALT('f'), CK_InputForwardWord },
680 /* Editing */
681 { KEY_BACKSPACE, CK_InputBackwardDelete },
682 { KEY_DC, CK_InputDeleteChar },
683 { ALT('d'), CK_InputKillWord },
684 { ALT(KEY_BACKSPACE), CK_InputBackwardKillWord },
686 /* Region manipulation */
687 { XCTRL('w'), CK_InputKillRegion },
688 { ALT('w'), CK_InputKillSave },
689 { XCTRL('y'), CK_InputYank },
690 { XCTRL('k'), CK_InputKillLine },
692 /* History */
693 { ALT('p'), CK_InputHistoryPrev },
694 { ALT('n'), CK_InputHistoryNext },
695 { ALT('h'), CK_InputHistoryShow },
697 /* Completion */
698 { ALT('\t'), CK_InputComplete },
699 { 0, 0 }
703 int lookup_action (char *keyname)
705 int i;
707 for (i = 0; command_names [i].name; i++){
708 if (!str_casecmp (command_names [i].name, keyname))
709 return command_names [i].val;
711 return 0;
714 void
715 keymap_add(GArray *keymap, int key, int cmd)
717 global_key_map_t new_bind, *map;
718 map = &(g_array_index(keymap, global_key_map_t, 0));
720 if (key !=0 && cmd !=0) {
721 new_bind.key = key;
722 new_bind.command = cmd;
723 g_array_append_val(keymap, new_bind);
728 void
729 keybind_cmd_bind(GArray *keymap, char *keybind, int action)
731 keymap_add(keymap, lookup_key(keybind), action);