Properly fix frame argument handling to work with both Mozilla 1.9 and Mozilla 1.8
[conkeror.git] / modules / bindings.js
blob68d51b775608e0be4417746aaef6bec2363c9691
1 /***** BEGIN LICENSE BLOCK *****
2 Version: MPL 1.1/GPL 2.0/LGPL 2.1
4 The contents of this file are subject to the Mozilla Public License Version
5 1.1 (the "License"); you may not use this file except in compliance with
6 the License. You may obtain a copy of the License at
7 http://www.mozilla.org/MPL/
9 Software distributed under the License is distributed on an "AS IS" basis,
10 WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 for the specific language governing rights and limitations under the
12 License.
14 The Initial Developer of the Original Code is Shawn Betts.
15 Portions created by the Initial Developer are Copyright (C) 2004,2005
16 by the Initial Developer. All Rights Reserved.
18 Alternatively, the contents of this file may be used under the terms of
19 either the GNU General Public License Version 2 or later (the "GPL"), or
20 the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
21 in which case the provisions of the GPL or the LGPL are applicable instead
22 of those above. If you wish to allow use of your version of this file only
23 under the terms of either the GPL or the LGPL, and not to allow others to
24 use your version of this file under the terms of the MPL, indicate your
25 decision by deleting the provisions above and replace them with the notice
26 and other provisions required by the GPL or the LGPL. If you do not delete
27 the provisions above, a recipient may use your version of this file under
28 the terms of any one of the MPL, the GPL or the LGPL.
29 ***** END LICENSE BLOCK *****/
31 // some predefined key maps
32 var     top_kmap           = null;
33 var     ctrlc_kmap         = null;
34 var     ctrlw_kmap         = null;
35 var     ctrlx_kmap         = null;
36 var     four_kmap          = null;
37 var     five_kmap          = null;
38 var     help_kmap          = null;
39 var     input_kmap         = null;
40 var     textarea_kmap      = null;
41 var     select_kmap        = null;
42 var     numberedlinks_kmap = null;
43 var     top_esc_kmap       = null;
44 var     textarea_esc_kmap  = null;
45 var     input_esc_kmap     = null;
46 var     minibuffer_base_kmap = null;
47 var     minibuffer_kmap = null;
48 var     minibuffer_completion_kmap = null;
49 var     isearch_kmap       = null;
50 var     frameset_kmap      = null;
52 var universal_kmap = null;
55 function input_kmap_predicate (window, element) {
56     // Use the input keymap for any input tag that
57     // isn't a radio button or checkbox.
58     try {
59         var tag = element.tagName.toLowerCase();
60         var type = element.getAttribute ("type");
61         if (type != null) {type = type.toLowerCase();}
62         return (tag == "html:input" ||
63                 (tag == "input" &&
64                  type != "radio" &&
65                  type != "checkbox" &&
66                  type != "submit" &&
67                  type != "reset"));
68     } catch (e) { return false; }
72 function textarea_kmap_predicate (window, element) {
73     try {
74         return (element.tagName == "TEXTAREA");
75     } catch (e) { return false; }
78 var context_kmaps = null;
81 function clearKmaps()
83     ctrlc_kmap            = make_keymap();
84     ctrlw_kmap            = make_keymap();
85     ctrlx_kmap            = make_keymap();
86     four_kmap             = make_keymap();
87     five_kmap             = make_keymap();
88     help_kmap             = make_keymap();
89     top_kmap              = make_keymap();
90     input_kmap            = make_context_keymap (input_kmap_predicate);
91     textarea_kmap         = make_context_keymap (textarea_kmap_predicate);
92     minibuffer_base_kmap       = make_keymap();
93     minibuffer_kmap       = make_keymap();
94     minibuffer_completion_kmap       = make_keymap();
95     select_kmap           = make_keymap();
96     numberedlinks_kmap    = make_keymap();
97     isearch_kmap          = make_keymap();
98     frameset_kmap         = make_keymap();
100     top_esc_kmap          = make_keymap();
101     textarea_esc_kmap     = make_keymap();
102     input_esc_kmap        = make_keymap();
104     universal_kmap        = make_keymap();
106     context_kmaps = [input_kmap,
107                      textarea_kmap];
110 // VI Keys for the heathens. Thanks to maxauthority on #conkeror for
111 // the patch.
112 function initViKmaps()
114     clearKmaps();
116     abort_key = kbd ("g",MOD_CTRL);
118     // submaps
119     define_key(top_kmap, kbd ("C-h"), help_kmap);
120     define_key(top_kmap, kbd ("C-w"), ctrlw_kmap);
121     define_key(top_kmap, kbd ("w",0),        ctrlw_kmap); 
122     define_key(top_kmap, kbd ("f",0),        frameset_kmap);
124         // same as emacs, since vi doesnt really have this
125     define_key(help_kmap, kbd ("b",0),"describe-bindings");
126     define_key(help_kmap, kbd ("i",0),"help-page");
127     define_key(help_kmap, kbd ("t",0),"help-with-tutorial");
129         // window/buffer managment
130     // define_key(top_kmap, kbd ("q",0),"quit"); // like less
131     define_key(top_kmap, kbd ("q",MOD_CTRL),"quit"); 
132     define_key(top_kmap, kbd ("b",0),"switch-to-buffer"); 
133     define_key(top_kmap, kbd ("d",0),"kill-buffer");  // Delete buffer
134 //     define_key(ctrlw_kmap, kbd ("w",0),"other-window"); // goes to other window in a split
135 //     define_key(ctrlw_kmap, kbd ("d",0),"delete-windows");  // removes a split
136 //     define_key(ctrlw_kmap, kbd ("D",0),"delete-other-windows");  // removes a split
137 //     define_key(ctrlw_kmap, kbd ("f",0),"split-flip");  // changes horizontal/vertical alignment of the splits
138     define_key(ctrlw_kmap, kbd ("o",0),"find-url-other-frame"); 
139 //     define_key(ctrlw_kmap, kbd ("s",0),"split-window"); // splits a window in 2 halfes if there are 2 buffers in it
140     define_key(ctrlw_kmap, kbd ("Q",0),"delete-frame");
141     define_key(ctrlw_kmap, kbd ("n",0),"make-frame-command");
143         // browser commands
144     define_key(top_kmap, kbd ("o",0),"open-url");
145     define_key(top_kmap, kbd ("O",0),"find-url"); // same as above but in new buffer
146         // opens a query which is not empty but prefilled with the current url which can be edited
147     define_key(top_kmap, kbd ("O", MOD_CTRL),"find-alternate-url"); 
148     define_key(top_kmap, kbd (KeyEvent.DOM_VK_BACK_SPACE,0),"go-up");
149     define_key(top_kmap, kbd ("h",0),"go-back");
150     define_key(top_kmap, kbd ("l",0),"go-forward");
151     define_key(top_kmap, kbd ("a",MOD_CTRL),"cmd_selectAll"); // not really vi like, but ggVG is even worse for select all
152     define_key(top_kmap, kbd (",",MOD_CTRL),"toggle-numbered-links");
153     define_key(top_kmap, kbd (".",MOD_CTRL),"toggle-numbered-images");
154     define_key(top_kmap, kbd ("slash",0),"isearch-forward");
155     define_key(top_kmap, kbd ("back_slash",0),"view-source");
156     define_key(top_kmap, kbd ("S-slash",0),"isearch-backward");
157     define_key(top_kmap, kbd ("r",0),"revert-buffer");
158     define_key(top_kmap, kbd ("1",0),"numberedlinks-1");
159     define_key(top_kmap, kbd ("2",0),"numberedlinks-2");
160     define_key(top_kmap, kbd ("3",0),"numberedlinks-3");
161     define_key(top_kmap, kbd ("4",0),"numberedlinks-4");
162     define_key(top_kmap, kbd ("5",0),"numberedlinks-5");
163     define_key(top_kmap, kbd ("6",0),"numberedlinks-6");
164     define_key(top_kmap, kbd ("7",0),"numberedlinks-7");
165     define_key(top_kmap, kbd ("8",0),"numberedlinks-8");
166     define_key(top_kmap, kbd ("9",0),"numberedlinks-9");
167     define_key(top_kmap, kbd ("comma",0),"goto-numbered-link");
168     define_key(top_kmap, kbd ("period",0),"copy-numbered-image-location");
169     define_key(top_kmap, kbd ("u",0),"buffer-previous");
170     define_key(top_kmap, kbd ("u", MOD_CTRL), "universal-argument");
171     define_key(top_kmap, kbd ("i",0),"buffer-next");
172     define_key(top_kmap, kbd ("p",MOD_CTRL),"buffer-previous");
173     define_key(top_kmap, kbd ("n",MOD_CTRL),"buffer-next");
174     define_key(top_kmap, kbd ("y",0),"copy-current-url");
175     define_key(top_kmap, kbd ("Y",0),"copy-link-location");
176     define_key(top_kmap, kbd (KeyEvent.DOM_VK_ESCAPE,0),"stop-loading");
177     define_key(top_kmap, kbd ("g",MOD_CTRL),"unfocus"); //escape from a textfield
178     define_key(top_kmap, kbd ( "equals", 0),"text-reset");
179     define_key(top_kmap, kbd ( "S-equals", 0),"text-enlarge");
180     define_key(top_kmap, kbd ( "subtract", 0),"text-reduce");
182         // shows the query on the bottom with all conkeror commands
183     define_key(top_kmap, kbd ("S-;"),"execute-extended-command");
184     define_key(top_kmap, kbd ("M-S-;"),"eval-expression");
186     // movement keys
187     //define_key(top_kmap, kbd (" ",MOD_SHIFT),"cmd_scrollPageUp");
188     define_key(top_kmap, kbd (" ",0),"cmd_scrollPageDown");
189     define_key(top_kmap, kbd ("b",MOD_CTRL),"cmd_scrollPageUp");
190     define_key(top_kmap, kbd ("f",MOD_CTRL),"cmd_scrollPageDown");
191     define_key(top_kmap, kbd ("k",0),"cmd_scrollLineUp");
192     define_key(top_kmap, kbd ("j",0),"cmd_scrollLineDown");
193     define_key(top_kmap, kbd ("H",0),"cmd_scrollLeft");
194     define_key(top_kmap, kbd ("L",0),"cmd_scrollRight");
195     define_key(top_kmap, kbd ("0",0),"cmd_scrollBeginLine");
196     define_key(top_kmap, kbd ("S-6",0),"cmd_scrollBeginLine");
197     define_key(top_kmap, kbd ("S-4",0),"cmd_scrollEndLine");
198     define_key(top_kmap, kbd ("g",0),"cmd_scrollTop");
199     define_key(top_kmap, kbd ("G",0),"cmd_scrollBottom");
202         // useful in caret mode
203     define_key(top_kmap, kbd ("a",MOD_CTRL),"beginning-of-line");
204     define_key(top_kmap, kbd ("e",MOD_CTRL),"end-of-line");
205     define_key(top_kmap, kbd ("b",MOD_META),"cmd_wordPrevious");
206     define_key(top_kmap, kbd ("f",MOD_META),"cmd_wordNext");
208     define_key(top_kmap, kbd (KeyEvent.DOM_VK_PAGE_UP, MOD_SHIFT),"cmd_selectPageUp");
209     define_key(top_kmap, kbd (KeyEvent.DOM_VK_PAGE_DOWN, MOD_SHIFT),"cmd_selectPageDown");
210     define_key(top_kmap, kbd (KeyEvent.DOM_VK_DELETE, MOD_SHIFT),"cmd_cut");
211     define_key(top_kmap, kbd (KeyEvent.DOM_VK_DELETE, MOD_CTRL),"cmd_copy");
212     define_key(top_kmap, kbd (KeyEvent.DOM_VK_INSERT, MOD_CTRL),"cmd_copy");
213     define_key(top_kmap, kbd (KeyEvent.DOM_VK_HOME, MOD_SHIFT|MOD_CTRL),"cmd_selectTop");
214     define_key(top_kmap, kbd (KeyEvent.DOM_VK_END, MOD_SHIFT|MOD_CTRL),"cmd_selectBottom");
215     define_key(top_kmap, kbd (KeyEvent.DOM_VK_LEFT, MOD_CTRL|MOD_SHIFT),"cmd_selectWordPrevious");
216     define_key(top_kmap, kbd (KeyEvent.DOM_VK_RIGHT, MOD_CTRL|MOD_SHIFT),"cmd_selectWordNext");
217     define_key(top_kmap, kbd (KeyEvent.DOM_VK_LEFT, MOD_SHIFT),"cmd_selectCharPrevious");
218     define_key(top_kmap, kbd (KeyEvent.DOM_VK_RIGHT, MOD_SHIFT),"cmd_selectCharNext");
219     define_key(top_kmap, kbd (KeyEvent.DOM_VK_HOME, MOD_SHIFT),"cmd_selectBeginLine");
220     define_key(top_kmap, kbd (KeyEvent.DOM_VK_END, MOD_SHIFT),"cmd_selectEndLine");
221     define_key(top_kmap, kbd (KeyEvent.DOM_VK_UP, MOD_SHIFT),"cmd_selectLinePrevious");
222     define_key(top_kmap, kbd (KeyEvent.DOM_VK_DOWN, MOD_SHIFT),"cmd_selectLineNext");
224     define_key(top_kmap, kbd(KeyEvent.DOM_VK_RETURN, MOD_CTRL), "follow-link-in-new-buffer");
226     // Input area keys - the same as for emacs
227     define_key(input_kmap, kbd ("a",MOD_CTRL),"cmd_beginLine");
228     define_key(input_kmap, kbd ("e",MOD_CTRL),"cmd_endLine");
229     define_key(input_kmap, kbd (KeyEvent.DOM_VK_BACK_SPACE, 0), "cmd_deleteCharBackward");
230     define_key(input_kmap, kbd (KeyEvent.DOM_VK_BACK_SPACE, MOD_META), "cmd_deleteWordBackward");
231     define_key(input_kmap, kbd ("d",MOD_CTRL),"cmd_deleteCharForward");
232     define_key(input_kmap, kbd ("d",MOD_META),"cmd_deleteWordForward");
233     define_key(input_kmap, kbd ("b",MOD_CTRL),"cmd_charPrevious");
234     define_key(input_kmap, kbd ("b",MOD_META),"cmd_wordPrevious");
235     define_key(input_kmap, kbd ("f",MOD_CTRL),"cmd_charNext");
236     define_key(input_kmap, kbd ("f",MOD_META),"cmd_wordNext");
237     define_key(input_kmap, kbd ("y",MOD_CTRL),"cmd_paste");
238     define_key(input_kmap, kbd ("w",MOD_META),"cmd_copy");
239     define_key(input_kmap, kbd ("k",MOD_CTRL),"cmd_deleteToEndOfLine");
241     // 101 keys
242     define_key(input_kmap, kbd (KeyEvent.DOM_VK_HOME,MOD_SHIFT), "cmd_selectBeginLine");
243     define_key(input_kmap, kbd (KeyEvent.DOM_VK_END,MOD_SHIFT),"cmd_selectEndLine");
244     define_key(input_kmap, kbd (KeyEvent.DOM_VK_BACK_SPACE,MOD_CTRL), "cmd_deleteWordBackward");
245     define_key(input_kmap, kbd (KeyEvent.DOM_VK_LEFT,MOD_CTRL|MOD_SHIFT),
246                "cmd_selectWordPrevious");
247     define_key(input_kmap, kbd (KeyEvent.DOM_VK_RIGHT,MOD_CTRL|MOD_SHIFT), "cmd_selectWordNext");
249     // Nasty keys
250     define_key(input_kmap, kbd ("r",MOD_CTRL),"cmd_redo");
252     // This must be at the end of input_kmap defs so it's matched last.
253     define_key(input_kmap, kbd (match_any_unmodified_key), null, true);
255     textarea_kmap.parent = input_kmap;
257     // textarea keys - the same as for emacs
258     define_key(textarea_kmap, kbd ("n",MOD_CTRL),"cmd_lineNext");
259     define_key(textarea_kmap, kbd ("p",MOD_CTRL),"cmd_linePrevious");
260     define_key(textarea_kmap, kbd ("M-S-comma"),"cmd_moveTop");
261     define_key(textarea_kmap, kbd ("M-S-period"),"cmd_moveBottom");
262     define_key(textarea_kmap, kbd ("v",MOD_META),"cmd_movePageUp");
263     define_key(textarea_kmap, kbd ("v",MOD_CTRL),"cmd_movePageDown");
265     // 101 keys
266     define_key (textarea_kmap, kbd (KeyEvent.DOM_VK_PAGE_UP,MOD_SHIFT), "cmd_selectPageUp");
267     define_key (textarea_kmap, kbd (KeyEvent.DOM_VK_PAGE_DOWN,MOD_SHIFT), "cmd_selectPageDown");
269     // Nasty keys
270     // define_key(textarea_kmap, kbd ("r",MOD_CTRL),"cmd_redo");
272     init_minibuffer_keys ();
274     init_numberedlinks_keys ();
276     init_isearch_keys ();
278     init_frameset_keys ();
280     init_universal_arg_keys ();
284 function initKmaps()
286     clearKmaps();
288     abort_key = kbd ("g",MOD_CTRL);
290     define_key(help_kmap, kbd ("b",0),"describe-bindings");
291     define_key(help_kmap, kbd ("i",0),"help-page");
292     define_key(help_kmap, kbd ("t",0),"help-with-tutorial");
293     define_key(top_kmap, kbd ("back_slash",0),"view-source");
295     define_key(ctrlx_kmap, kbd ("b",0),"switch-to-buffer"); 
296     define_key(ctrlx_kmap, kbd ("k",0),"kill-buffer"); 
297     define_key(ctrlx_kmap, kbd ("f",MOD_CTRL),"find-url"); 
298     define_key(ctrlx_kmap, kbd ("c",MOD_CTRL),"quit"); 
299 //     define_key(ctrlx_kmap, kbd ("1",0),"delete-other-windows"); 
300 //     define_key(ctrlx_kmap, kbd ("0",0),"delete-window"); 
301 //     define_key(ctrlx_kmap, kbd ("2",0),"split-window"); 
302 //     define_key(ctrlx_kmap, kbd ("o",0),"other-window"); 
303     define_key(ctrlx_kmap, kbd ("v",MOD_CTRL),"find-alternate-url"); 
304     define_key(ctrlx_kmap, kbd ("h",0),"cmd_selectAll");
305     define_key(ctrlx_kmap, kbd ("b",MOD_CTRL),"list-buffers"); 
306     define_key(ctrlx_kmap, kbd ("s",MOD_CTRL),"save-page");
307     
308     define_key(five_kmap, kbd ("f",MOD_CTRL),"find-url-other-frame"); 
309     define_key(five_kmap, kbd ("0",0),"delete-frame");
310     define_key(five_kmap, kbd ("2",0),"make-frame-command");
312     define_key(ctrlx_kmap, kbd ("4",0), four_kmap); 
313     define_key(ctrlx_kmap, kbd ("5",0), five_kmap); 
315     define_key(top_kmap, kbd ("h",MOD_CTRL), help_kmap);
316     define_key(top_kmap, kbd ("x",MOD_CTRL), ctrlx_kmap);
317     define_key(top_kmap, kbd ("c",MOD_CTRL), ctrlc_kmap); 
318     define_key(top_kmap, kbd ("f",0),        frameset_kmap);
320     define_key(top_kmap, kbd ("u",0),"go-up");
321     define_key(top_kmap, kbd ("C-u"), "universal-argument");
322     define_key(top_kmap, kbd (" ",MOD_META),"yank-to-clipboard");
323     define_key(top_kmap, kbd ("g",0),"open-url");
324     define_key(top_kmap, kbd ("l",MOD_META),"toggle-numbered-links");
325     define_key(top_kmap, kbd ("l",MOD_CTRL | MOD_META),"toggle-numbered-images");
326     define_key(top_kmap, kbd ("l",0),"go-back");
327     define_key(top_kmap, kbd ("s",MOD_CTRL),"isearch-forward");
328     define_key(top_kmap, kbd ("r",MOD_CTRL),"isearch-backward");
329     define_key(top_kmap, kbd ("B",0),"go-back");
330     define_key(top_kmap, kbd ("F",0),"go-forward");
331     define_key(top_kmap, kbd ("R",0),"revert-buffer");
332     define_key(top_kmap, kbd ("1",0),"numberedlinks-1");
333     define_key(top_kmap, kbd ("2",0),"numberedlinks-2");
334     define_key(top_kmap, kbd ("3",0),"numberedlinks-3");
335     define_key(top_kmap, kbd ("4",0),"numberedlinks-4");
336     define_key(top_kmap, kbd ("5",0),"numberedlinks-5");
337     define_key(top_kmap, kbd ("6",0),"numberedlinks-6");
338     define_key(top_kmap, kbd ("7",0),"numberedlinks-7");
339     define_key(top_kmap, kbd ("8",0),"numberedlinks-8");
340     define_key(top_kmap, kbd ("9",0),"numberedlinks-9");
341     define_key(top_kmap, kbd ("n",0),"goto-numbered-link");
342     define_key(top_kmap, kbd ("i",0),"copy-numbered-image-location");
343     define_key(top_kmap, kbd ("p",MOD_META),"buffer-previous");
344     define_key(top_kmap, kbd ("n",MOD_META),"buffer-next");
345     define_key(top_kmap, kbd ("c",0),"copy-current-url");
346     define_key(top_kmap, kbd ("C",0),"copy-link-location");
347     define_key(top_kmap, kbd ("x",MOD_META),"execute-extended-command");
348     define_key(top_kmap, kbd ("g",MOD_CTRL),"keyboard-quit");
349     define_key(top_kmap, kbd ( KeyEvent.DOM_VK_ESCAPE, 0),"unfocus");
350     define_key(top_kmap, kbd ( "equals", 0),"text-reset");
351     define_key(top_kmap, kbd ( "S-equals", 0),"text-enlarge");
352     define_key(top_kmap, kbd ( "subtract", 0),"text-reduce");
354     // movement keys
355     define_key(top_kmap, kbd ( KeyEvent.DOM_VK_BACK_SPACE, 0),"cmd_scrollPageUp");
356     define_key(top_kmap, kbd ("space"),"cmd_scrollPageDown");
357     define_key(top_kmap, kbd ("M-v"),"cmd_scrollPageUp");
358     define_key(top_kmap, kbd ("C-v"),"cmd_scrollPageDown");
359     define_key(top_kmap, kbd ("page_up"),"cmd_scrollPageUp");
360     define_key(top_kmap, kbd ("page_down"),"cmd_scrollPageDown");
361     define_key(top_kmap, kbd ("C-p"),"cmd_scrollLineUp");
362     define_key(top_kmap, kbd ("C-n"),"cmd_scrollLineDown");
364     define_key(top_kmap, kbd ("up"),"cmd_scrollLineUp");
365     define_key(top_kmap, kbd ("down"),"cmd_scrollLineDown");
366     define_key(top_kmap, kbd ("left"),"cmd_scrollLeft");
367     define_key(top_kmap, kbd ("right"),"cmd_scrollRight");
370     define_key(top_kmap, kbd ("C-b"),"cmd_scrollLeft");
371     define_key(top_kmap, kbd ("C-f"),"cmd_scrollRight");
372     define_key(top_kmap, kbd ("C-a"),"beginning-of-line");
373     define_key(top_kmap, kbd ("C-e"),"end-of-line");
374     define_key(top_kmap, kbd ("M-S-comma"),"cmd_scrollTop");
375     define_key(top_kmap, kbd ("M-S-period"),"cmd_scrollBottom");
376     define_key(top_kmap, kbd ("C-S-subtract"),"cmd_undo");
377     define_key(top_kmap, kbd ("C-y"),"cmd_paste");
379     define_key(top_kmap, kbd ("M-b"),"cmd_wordPrevious");
380     define_key(top_kmap, kbd ("M-f"),"cmd_wordNext");
382     define_key(top_kmap, kbd ("M-S-;"),"eval-expression");
384     define_key(top_kmap, kbd ("M-w"),"cmd_copy");
385     define_key(top_kmap, kbd ("C-w"),"cmd_cut");
387     define_key(top_kmap, kbd (KeyEvent.DOM_VK_PAGE_UP, MOD_SHIFT),"cmd_selectPageUp");
388     define_key(top_kmap, kbd (KeyEvent.DOM_VK_PAGE_DOWN, MOD_SHIFT),"cmd_selectPageDown");
389     define_key(top_kmap, kbd (KeyEvent.DOM_VK_DELETE, MOD_SHIFT),"cmd_cut");
390     define_key(top_kmap, kbd (KeyEvent.DOM_VK_DELETE, MOD_CTRL),"cmd_copy");
391     define_key(top_kmap, kbd (KeyEvent.DOM_VK_INSERT, MOD_CTRL),"cmd_copy");
392     define_key(top_kmap, kbd (KeyEvent.DOM_VK_HOME, MOD_SHIFT|MOD_CTRL),"cmd_selectTop");
393     define_key(top_kmap, kbd (KeyEvent.DOM_VK_END, MOD_SHIFT|MOD_CTRL),"cmd_selectBottom");
394     define_key(top_kmap, kbd (KeyEvent.DOM_VK_LEFT, MOD_CTRL|MOD_SHIFT),"cmd_selectWordPrevious");
395     define_key(top_kmap, kbd (KeyEvent.DOM_VK_RIGHT, MOD_CTRL|MOD_SHIFT),"cmd_selectWordNext");
396     define_key(top_kmap, kbd (KeyEvent.DOM_VK_LEFT, MOD_SHIFT),"cmd_selectCharPrevious");
397     define_key(top_kmap, kbd (KeyEvent.DOM_VK_RIGHT, MOD_SHIFT),"cmd_selectCharNext");
398     define_key(top_kmap, kbd (KeyEvent.DOM_VK_HOME, MOD_SHIFT),"cmd_selectBeginLine");
399     define_key(top_kmap, kbd (KeyEvent.DOM_VK_END, MOD_SHIFT),"cmd_selectEndLine");
400     define_key(top_kmap, kbd (KeyEvent.DOM_VK_UP, MOD_SHIFT),"cmd_selectLinePrevious");
401     define_key(top_kmap, kbd (KeyEvent.DOM_VK_DOWN, MOD_SHIFT),"cmd_selectLineNext");
403     define_key(top_kmap, kbd(KeyEvent.DOM_VK_RETURN, MOD_CTRL), "follow-link-in-new-buffer");
405     // Input area keys
406     define_key(input_kmap, kbd ("a",MOD_CTRL),"cmd_beginLine");
407     define_key(input_kmap, kbd ("e",MOD_CTRL),"cmd_endLine");
408     define_key(input_kmap, kbd (KeyEvent.DOM_VK_BACK_SPACE, 0), "cmd_deleteCharBackward");
409     define_key(input_kmap, kbd (KeyEvent.DOM_VK_BACK_SPACE, MOD_META), "cmd_deleteWordBackward");
410     define_key(input_kmap, kbd ("d",MOD_CTRL),"cmd_deleteCharForward");
411     define_key(input_kmap, kbd ("d",MOD_META),"cmd_deleteWordForward");
412     define_key(input_kmap, kbd ("b",MOD_CTRL),"cmd_charPrevious");
413     define_key(input_kmap, "left", "cmd_charPrevious");
414     define_key(input_kmap, kbd ("b",MOD_META),"cmd_wordPrevious");
415     define_key(input_kmap, kbd ("f",MOD_CTRL),"cmd_charNext");
416     define_key(input_kmap, "right", "cmd_charNext");
417     define_key(input_kmap, kbd ("f",MOD_META),"cmd_wordNext");
418     define_key(input_kmap, kbd ("y",MOD_CTRL),"cmd_paste");
419     define_key(input_kmap, kbd ("w",MOD_META),"cmd_copy");
420     define_key(input_kmap, kbd ("k",MOD_CTRL),"cmd_deleteToEndOfLine");
422     // 101 keys
423     define_key(input_kmap, kbd (KeyEvent.DOM_VK_HOME,MOD_SHIFT), "cmd_selectBeginLine");
424     define_key(input_kmap, kbd (KeyEvent.DOM_VK_END,MOD_SHIFT),"cmd_selectEndLine");
425     define_key(input_kmap, kbd (KeyEvent.DOM_VK_BACK_SPACE,MOD_CTRL), "cmd_deleteWordBackward");
426     define_key(input_kmap, kbd (KeyEvent.DOM_VK_LEFT,MOD_CTRL|MOD_SHIFT),
427                "cmd_selectWordPrevious");
428     define_key(input_kmap, kbd (KeyEvent.DOM_VK_RIGHT,MOD_CTRL|MOD_SHIFT), "cmd_selectWordNext");
430     // Nasty keys
431     define_key(input_kmap, kbd ("r",MOD_CTRL),"cmd_redo");
433     // This must be at the end of input_kmap defs so it's matched last.
434     define_key(input_kmap, kbd (match_any_unmodified_key), null, true);
436     textarea_kmap.parent = input_kmap;
438     // textarea keys
439     define_key(textarea_kmap, kbd ("n",MOD_CTRL),"cmd_lineNext");
440     define_key(textarea_kmap, "down", "cmd_lineNext");
441     define_key(textarea_kmap, kbd ("p",MOD_CTRL),"cmd_linePrevious");
442     define_key(textarea_kmap, "up", "cmd_linePrevious");
443     define_key(textarea_kmap, kbd ("<",MOD_META),"cmd_moveTop");
444     define_key(textarea_kmap, kbd (">",MOD_META),"cmd_moveBottom");
445     define_key(textarea_kmap, kbd ("v",MOD_META),"cmd_movePageUp");
446     define_key(textarea_kmap, "page_up", "cmd_movePageUp");
448     define_key(textarea_kmap, kbd ("v",MOD_CTRL),"cmd_movePageDown");
449     define_key(textarea_kmap, "page_down", "cmd_movePageDown");
450     define_key(textarea_kmap, kbd (" ",MOD_META),"yank-to-clipboard");
452     // 101 keys
453     define_key (textarea_kmap, kbd (KeyEvent.DOM_VK_PAGE_UP,MOD_SHIFT), "cmd_selectPageUp");
454     define_key (textarea_kmap, kbd (KeyEvent.DOM_VK_PAGE_DOWN,MOD_SHIFT), "cmd_selectPageDown");
459     init_minibuffer_keys ();
461     init_numberedlinks_keys ();
463     init_isearch_keys ();
465     init_frameset_keys ();
467     init_universal_arg_keys ();
469     var browser_kmset = new keymap_set();
470     browser_kmset.default_keymap = top_kmap;
471     browser_kmset.context_keymaps = context_kmaps;
473     browser_buffer.prototype.keymap_set = browser_kmset;
477 function init_minibuffer_keys () {
478     // minibuffer bindings
479     //
481     define_key(minibuffer_base_kmap, "C-a", "minibuffer-cmd_beginLine");
482     define_key(minibuffer_base_kmap, "C-e", "minibuffer-cmd_endLine");
483     define_key(minibuffer_base_kmap, "back_space", "minibuffer-cmd_deleteCharBackward");
484     define_key(minibuffer_base_kmap, "M-back_space", "minibuffer-cmd_deleteWordBackward");
485     define_key(minibuffer_base_kmap, "C-d", "minibuffer-cmd_deleteCharForward");
486     define_key(minibuffer_base_kmap, "M-d", "minibuffer-cmd_deleteWordForward");
487     define_key(minibuffer_base_kmap, "C-b", "minibuffer-cmd_charPrevious");
488     define_key(minibuffer_base_kmap, "M-b", "minibuffer-cmd_wordPrevious");
489     define_key(minibuffer_base_kmap, "C-f", "minibuffer-cmd_charNext");
490     define_key(minibuffer_base_kmap, "M-f", "minibuffer-cmd_wordNext");
491     define_key(minibuffer_base_kmap, "C-y", "minibuffer-cmd_paste");
492     define_key(minibuffer_base_kmap, "M-w", "minibuffer-cmd_copy");
493     define_key(minibuffer_base_kmap, "C-k", "minibuffer-cmd_deleteToEndOfLine");
495     define_key(minibuffer_base_kmap, "S-home", "minibuffer-cmd_selectBeginLine");
496     define_key(minibuffer_base_kmap, "S-end", "minibuffer-cmd_selectEndLine");
497     define_key(minibuffer_base_kmap, "C-back_space", "minibuffer-cmd_deleteWordBackward");
498     define_key(minibuffer_base_kmap, "C-S-left", "minibuffer-cmd_selectWordPrevious");
499     define_key(minibuffer_base_kmap, "C-S-right", "minibuffer-cmd_selectWordNext");
501     // Nasty keys
502     define_key(minibuffer_base_kmap, "C-r", "minibuffer-cmd_redo");
504     define_key(minibuffer_base_kmap, kbd(match_any_unmodified_key), "minibuffer-insert-character");
506     define_key (minibuffer_kmap, "return", "exit-minibuffer");
507     define_key (minibuffer_kmap, "C-m", "exit-minibuffer");
508     define_key (minibuffer_kmap, "M-p", "minibuffer-history-previous");
509     define_key (minibuffer_kmap, "M-n", "minibuffer-history-next");
510     define_key (minibuffer_kmap, "C-g", "minibuffer-abort");
511     define_key (minibuffer_kmap, "escape", "minibuffer-abort");
513     define_key (minibuffer_completion_kmap, "tab", "minibuffer-complete");
514     define_key (minibuffer_completion_kmap, "space", "minibuffer-accept-match");
515     define_key (minibuffer_completion_kmap, kbd(match_any_unmodified_key), "minibuffer-insert-character-complete");
517     minibuffer_completion_kmap.parent = minibuffer_kmap;
519     minibuffer_kmap.parent = minibuffer_base_kmap;
523 function init_numberedlinks_keys () {
524     // numbered links bindings
525     //
526     define_key (numberedlinks_kmap, "M-return", "numberedlinks-focus");
527     define_key (numberedlinks_kmap, "return", "numberedlinks-follow");
528     define_key (numberedlinks_kmap, "C-return", "numberedlinks-follow-other-buffer");
529     define_key (numberedlinks_kmap, "C-M-return", "numberedlinks-follow-other-frame");
530     define_key (numberedlinks_kmap, "C-v", "numberedlinks-save");
531     define_key (numberedlinks_kmap, "C-g", "numberedlinks-abort");
532     define_key (numberedlinks_kmap, "escape", "numberedlinks-abort");
533     
534     // we also want to consume TAB but ignore it.  there should be a general command for this.
535     numberedlinks_kmap.parent = minibuffer_base_kmap;
539 function init_isearch_keys () {
540     // isearch bindings
541     //
542     define_key (isearch_kmap, "back_space", "isearch-backspace");
543     define_key (isearch_kmap, "C-r", "isearch-continue-backward");
544     define_key (isearch_kmap, "C-s", "isearch-continue-forward");
545     define_key (isearch_kmap, "C-g", "isearch-abort");
546     define_key (isearch_kmap, "escape", "isearch-abort");
547     define_key (isearch_kmap, kbd(match_any_unmodified_key), "isearch-add-character");
548     define_key (isearch_kmap, kbd(match_any_key), "isearch-done");
552 function init_frameset_keys () {
553     define_key(frameset_kmap, kbd ("f",0),"next-frameset-frame");
554     define_key(frameset_kmap, kbd ("i",0),"next-iframe");
555     define_key(frameset_kmap, kbd (KeyEvent.DOM_VK_RETURN,0), "open-frameset-frame-in-current-buffer");
556     define_key(frameset_kmap, kbd (KeyEvent.DOM_VK_RETURN,MOD_CTRL), "open-frameset-frame-in-new-buffer");
557     define_key(frameset_kmap, kbd (KeyEvent.DOM_VK_RETURN,MOD_CTRL | MOD_META), "open-frameset-frame-in-new-frame");
558     define_key(frameset_kmap, kbd ("c",0), "copy-frameset-frame-location");
559     define_key(frameset_kmap, kbd ("t", 0), "frameset-focus-top");
560     define_key(frameset_kmap, kbd ("u", 0), "frameset-focus-up");
561     define_key(frameset_kmap, kbd ("back_slash", 0), "frameset-view-source");
565 function init_universal_arg_keys ()
567     define_key(universal_kmap, kbd ("u", MOD_CTRL), "universal-argument-more");
568     define_key(universal_kmap, kbd ("1", 0), "universal-digit");
569     define_key(universal_kmap, kbd ("2", 0), "universal-digit");
570     define_key(universal_kmap, kbd ("3", 0), "universal-digit");
571     define_key(universal_kmap, kbd ("4", 0), "universal-digit");
572     define_key(universal_kmap, kbd ("5", 0), "universal-digit");
573     define_key(universal_kmap, kbd ("6", 0), "universal-digit");
574     define_key(universal_kmap, kbd ("7", 0), "universal-digit");
575     define_key(universal_kmap, kbd ("8", 0), "universal-digit");
576     define_key(universal_kmap, kbd ("9", 0), "universal-digit");
577     define_key(universal_kmap, kbd ("0", 0), "universal-digit");
578     define_key(universal_kmap, kbd ("subtract", 0), "universal-negate");
581 /* FIXME: All of this genBindings stuff should operate on a particular
582    buffer, rather than the current selected buffer. */
583 function genBindingsHelper(window, doc, kmap, prefix)
585     try {
586         for (var i=0; i<kmap.length; i++) {
587             //fallthrough keys are used by context-maps like input-kmap to ensure
588             //that ordinary, unmodified characters will go to the input widget
589             //instead of top_kmap.  Therefore we don't display these keys in the
590             //help screen.
591             //
592             if (kmap[i].fallthrough) continue;
593             if (kmap[i].key.match_function) continue;
594             var command = kmap[i].command || "Prefix Command";;
595             var key = format_key_press(code, kmap[i].key.modifiers);
597             doc.write("<TR><TD>")
598                 doc.write(prefix.join(" ") + " " + key);
599             doc.write("</TD><TD>")
600                 doc.write(command);
601             doc.write("</TD></TR>");
603             if (kmap[i].keymap) {
604                 var p = [];
605                 for (var j in prefix) p[j] = prefix[j];
606                 p.push(format_key_press(kmap[i].key.keyCode, kmap[i].key.modifiers));
607                 genBindingsHelper(window, doc, kmap[i].keymap, p);
608             }
609         }
610     } catch(e) {window.alert(e);}
613 function genAllBindings(window, kmap)
615   genBindings(window, top_kmap, "Top Level");
616   genBindings(window, input_kmap, "Text Box");
617   genBindings(window, textarea_kmap, "Text Area");
620 function genBindings(window, kmap, name)
622     try {
623         var doc = window.content.document;
625         doc.write("<h1>" + name + " Key bindings</h1><p>");
626         doc.write("<table border='1'>");
627         doc.write("<tr><th>Key<th>Binding");
628         genBindingsHelper(window, doc, kmap, []);
629         doc.write("</table></p>");
630     } catch(e) {window.alert(e);}
633 //// ESCAPE bindings
635 function add_escape_bindings()
637     define_key(top_kmap, kbd (KeyEvent.DOM_VK_ESCAPE, 0), top_esc_kmap);
638     define_key(input_kmap, kbd (KeyEvent.DOM_VK_ESCAPE, 0), input_esc_kmap);
639     define_key(textarea_kmap, kbd (KeyEvent.DOM_VK_ESCAPE, 0), textarea_esc_kmap);
641     // Top
642     define_key(top_esc_kmap, kbd (" ",0),"yank-to-clipboard");
643     define_key(top_esc_kmap, kbd ("l",0),"toggle-numbered-links");
644     define_key(top_esc_kmap, kbd ("p",0),"buffer-previous");
645     define_key(top_esc_kmap, kbd ("n",0),"buffer-next");
646     define_key(top_esc_kmap, kbd ("x",0),"execute-extended-command");
647     define_key(top_esc_kmap, kbd ("v",0),"cmd_scrollPageUp");
648     define_key(top_esc_kmap, kbd ("<",0),"cmd_scrollTop");
649     define_key(top_esc_kmap, kbd (">",0),"cmd_scrollBottom");
650     define_key(top_esc_kmap, kbd ("v",0),"cmd_movePageUp");
651     define_key(top_esc_kmap, kbd ("b",0),"cmd_wordPrevious");
652     define_key(top_esc_kmap, kbd ("f",0),"cmd_wordNext");
654     // Input
655     define_key(input_esc_kmap, kbd (KeyEvent.DOM_VK_BACK_SPACE, 0), "cmd_deleteWordBackward");
656     define_key(input_esc_kmap, kbd ("d",0),"cmd_deleteWordForward");
657     define_key(input_esc_kmap, kbd ("b",0),"cmd_wordPrevious");
658     define_key(input_esc_kmap, kbd ("f",0),"cmd_wordNext");
659     define_key(input_esc_kmap, kbd ("w",0),"cmd_copy");
661     textarea_esc_kmap.parent = input_esc_kmap;
663     // Textarea
664     // define_key(textarea_esc_kmap, kbd ("d",0),"cmd_deleteWordForward");
665     // define_key(textarea_esc_kmap, kbd ("b",0),"cmd_wordPrevious");
666     // define_key(textarea_esc_kmap, kbd ("f",0),"cmd_wordNext");
667     // define_key(textarea_esc_kmap, kbd ("w",0),"cmd_copy");
668     define_key(textarea_esc_kmap, kbd ("<",0),"cmd_moveTop");
669     define_key(textarea_esc_kmap, kbd (">",0),"cmd_moveBottom");
670     define_key(textarea_esc_kmap, kbd ("v",0),"cmd_movePageUp");
674 initKmaps();