<?xml version="1.0"?>

<bindings id="htmlBindings"
   xmlns="http://www.mozilla.org/xbl"
   xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
 
  <binding id="inputFields" extends="resource:///res/builtin/htmlBindings.xml#inputFieldsBase">
    <handlers>
    <!-- Emacsish single-line motion and delete keys -->
    <handler event="keypress" key="a" modifiers="control"
        command="cmd_beginLine"/>
    <handler event="keypress" key="e" modifiers="control"
        command="cmd_endLine"/>
    <handler event="keypress" key="b" modifiers="control"
        command="cmd_charPrevious"/>
    <handler event="keypress" key="f" modifiers="control"
        command="cmd_charNext"/>
    <handler event="keypress" key="h" modifiers="control"
        command="cmd_deleteCharBackward"/>
    <handler event="keypress" key="d" modifiers="control"
        command="cmd_deleteCharForward"/>
    <handler event="keypress" key="w" modifiers="control"
        command="cmd_deleteWordBackward"/>
    <handler event="keypress" key="u" modifiers="control"
        command="cmd_deleteToBeginningOfLine"/>
    <handler event="keypress" key="k" modifiers="control"
        command="cmd_deleteToEndOfLine"/>

    <!-- Alternate Windows copy/paste/undo/redo keys -->
    <handler event="keypress" keycode="VK_DELETE" modifiers="shift"
        command="cmd_cutOrDelete"/>
    <handler event="keypress" keycode="VK_DELETE" modifiers="control"
        command="cmd_copyOrDelete"/>
    <handler event="keypress" keycode="VK_INSERT" modifiers="control" 
        command="cmd_copy"/>
    <handler event="keypress" keycode="VK_INSERT" modifiers="shift"
        command="cmd_paste"/>

    <!-- navigating by word keys -->
    <handler event="keypress" keycode="VK_HOME" 
        command="cmd_beginLine"/>
    <handler event="keypress" keycode="VK_END" 
        command="cmd_endLine"/>
    <handler event="keypress" keycode="VK_HOME" modifiers="shift"
        command="cmd_selectBeginLine"/>
    <handler event="keypress" keycode="VK_END" modifiers="shift"
        command="cmd_selectEndLine"/>
    <handler event="keypress" keycode="VK_HOME" modifiers="control"
        command="cmd_beginLine"/>
    <handler event="keypress" keycode="VK_END" modifiers="control" 
        command="cmd_endLine"/>
    <handler event="keypress" keycode="VK_HOME" modifiers="control,shift"
        command="cmd_selectBeginLine"/>
    <handler event="keypress" keycode="VK_END" modifiers="control,shift"
        command="cmd_selectEndLine"/>
    <handler event="keypress" keycode="VK_BACK" modifiers="control"
        command="cmd_deleteWordBackward"/>

    <handler event="keypress" keycode="VK_LEFT" modifiers="control" 
        command="cmd_wordPrevious"/>
    <handler event="keypress" keycode="VK_RIGHT" modifiers="control"
        command="cmd_wordNext"/>
    <handler event="keypress" keycode="VK_LEFT" modifiers="shift,control" 
        command="cmd_selectWordPrevious"/>
    <handler event="keypress" keycode="VK_RIGHT" modifiers="shift,control" 
        command="cmd_selectWordNext"/>
    <handler event="keypress" key="y" modifiers="accel"
        command="cmd_redo"/>
    <handler event="keypress" key="r" modifiers="accel"
        command="cmd_redo"/>
    <handler event="keypress" key="a" modifiers="alt"
        command="cmd_selectAll"/>
    </handlers>
  </binding>

  <binding id="textAreas" extends="resource:///res/builtin/htmlBindings.xml#textAreasBase">
    <handlers>

    <!-- Emacsish single-line motion and delete keys -->
    <handler event="keypress" key="a" modifiers="control"
        command="cmd_beginLine"/>
    <handler event="keypress" key="e" modifiers="control"
        command="cmd_endLine"/>
    <handler event="keypress" id="key_left" key="b" modifiers="control"
        command="cmd_charPrevious"/>
    <handler event="keypress" id="key_right" key="f" modifiers="control"
        command="cmd_charNext"/>
    <handler event="keypress" id="key_delback" key="h" modifiers="control"
        command="cmd_deleteCharBackward"/>
    <handler event="keypress" id="key_delforw" key="d" modifiers="control"
        command="cmd_deleteCharForward"/>
    <handler event="keypress" id="key_delwback" key="w" modifiers="control"
        command="cmd_deleteWordBackward"/>
    <handler event="keypress" id="key_del_bol" key="u" modifiers="control"
        command="cmd_deleteToBeginningOfLine"/>
    <handler event="keypress" id="key_del_eol" key="k" modifiers="control"
        command="cmd_deleteToEndOfLine"/>

    <!-- Alternate Windows copy/paste/undo/redo keys -->
    <handler event="keypress" keycode="VK_DELETE" modifiers="shift"
        command="cmd_cutOrDelete"/>
    <handler event="keypress" keycode="VK_DELETE" modifiers="control"
        command="cmd_copyOrDelete"/>
    <handler event="keypress" keycode="VK_INSERT" modifiers="control"
        command="cmd_copy"/>
    <handler event="keypress" keycode="VK_INSERT" modifiers="shift"
        command="cmd_paste"/>

    <!-- Emacsish multi-line motion and delete keys -->
    <handler event="keypress" id="key_linedown" key="n" modifiers="control"
        command="cmd_lineNext"/>
    <handler event="keypress" id="key_lineup" key="p" modifiers="control"
        command="cmd_linePrevious"/>

    <!-- handle home/end/arrow keys and redo -->
    <handler event="keypress" keycode="VK_HOME" 
        command="cmd_beginLine"/>
    <handler event="keypress" keycode="VK_END" 
        command="cmd_endLine"/>
    <handler event="keypress" keycode="VK_HOME" modifiers="shift"
        command="cmd_selectBeginLine"/>
    <handler event="keypress" keycode="VK_END" modifiers="shift"
        command="cmd_selectEndLine"/>

    <handler event="keypress" keycode="VK_HOME" modifiers="control" 
        command="cmd_moveTop"/>
    <handler event="keypress" keycode="VK_END" modifiers="control" 
        command="cmd_moveBottom"/>
    <handler event="keypress" keycode="VK_HOME" modifiers="shift,control"
        command="cmd_selectTop"/>
    <handler event="keypress" keycode="VK_END" modifiers="shift,control"
        command="cmd_selectBottom"/>

    <handler event="keypress" keycode="VK_PAGE_UP" 
        command="cmd_movePageUp"/>
    <handler event="keypress" keycode="VK_PAGE_DOWN" 
        command="cmd_movePageDown"/>

    <handler event="keypress" keycode="VK_LEFT" modifiers="control" 
        command="cmd_wordPrevious"/>
    <handler event="keypress" keycode="VK_RIGHT" modifiers="control" 
        command="cmd_wordNext"/>
    <handler event="keypress" keycode="VK_LEFT" modifiers="shift,control" 
        command="cmd_selectWordPrevious"/>
    <handler event="keypress" keycode="VK_RIGHT" modifiers="shift,control" 
        command="cmd_selectWordNext"/>
    <handler event="keypress" keycode="VK_BACK" modifiers="control"
        command="cmd_deleteWordBackward"/>
    <handler event="keypress" key="y" modifiers="accel"
        command="cmd_redo"/>
    <handler event="keypress" key="r" modifiers="accel"
        command="cmd_redo"/>
    <handler event="keypress" key="a" modifiers="alt"
        command="cmd_selectAll"/>
    </handlers>
  </binding>

  <binding id="browser">
    <handlers>
      <handler event="keypress" keycode="VK_DELETE" modifiers="shift" command="cmd_cut" /> 
      <handler event="keypress" keycode="VK_DELETE" modifiers="control" command="cmd_copy" /> 
      <handler event="keypress" keycode="VK_INSERT" modifiers="control" command="cmd_copy" /> 
      <handler event="keypress" keycode="VK_INSERT" modifiers="shift" command="cmd_paste" /> 
      <handler event="keypress" keycode="VK_HOME" modifiers="shift,control" command="cmd_selectTop" /> 
      <handler event="keypress" keycode="VK_END" modifiers="shift,control" command="cmd_selectBottom" /> 
      <handler event="keypress" keycode="VK_F20" command="cmd_cut" /> 
      <handler event="keypress" keycode="VK_F16" command="cmd_copy" /> 
      <handler event="keypress" keycode="VK_F18" command="cmd_paste" /> 
      <handler event="keypress" keycode="VK_LEFT" modifiers="control" command="cmd_wordPrevious" />
      <handler event="keypress" keycode="VK_RIGHT" modifiers="control" command="cmd_wordNext" />
      <handler event="keypress" keycode="VK_LEFT" modifiers="control,shift" command="cmd_selectWordPrevious" />
      <handler event="keypress" keycode="VK_RIGHT" modifiers="control,shift" command="cmd_selectWordNext" />
      <handler event="keypress" keycode="VK_LEFT" modifiers="shift" command="cmd_selectCharPrevious" />
      <handler event="keypress" keycode="VK_RIGHT" modifiers="shift" command="cmd_selectCharNext" />
      <handler event="keypress" keycode="VK_HOME" modifiers="shift" command="cmd_selectBeginLine" />
      <handler event="keypress" keycode="VK_END" modifiers="shift" command="cmd_selectEndLine" />
      <handler event="keypress" keycode="VK_UP" modifiers="shift" command="cmd_selectLinePrevious" />
      <handler event="keypress" keycode="VK_DOWN" modifiers="shift" command="cmd_selectLineNext" />
      <handler event="keypress" key="a" modifiers="alt" command="cmd_selectAll"/>
    </handlers>
  </binding>

  <binding id="editor">
    <handlers>
      <handler event="keypress" key="h" modifiers="control" command="cmd_deleteCharBackward"/>
      <handler event="keypress" key="d" modifiers="control" command="cmd_deleteCharForward"/>
      <handler event="keypress" key="k" modifiers="control" command="cmd_deleteToEndOfLine"/>
      <handler event="keypress" key="u" modifiers="control" command="cmd_deleteToBeginningOfLine"/>
      <handler event="keypress" key="a" modifiers="control" command="cmd_beginLine"/>
      <handler event="keypress" key="e" modifiers="control" command="cmd_endLine"/>
      <handler event="keypress" key="b" modifiers="control" command="cmd_charPrevious"/>
      <handler event="keypress" key="f" modifiers="control" command="cmd_charNext"/>
      <handler event="keypress" key="p" modifiers="control" command="cmd_linePrevious"/>
      <handler event="keypress" key="n" modifiers="control" command="cmd_lineNext"/>
      <handler event="keypress" key="x" modifiers="control" command="cmd_cut"/>
      <handler event="keypress" key="c" modifiers="control" command="cmd_copy"/>
      <handler event="keypress" key="v" modifiers="control" command="cmd_paste"/>
      <handler event="keypress" key="z" modifiers="control" command="cmd_undo"/>
      <handler event="keypress" key="r" modifiers="accel"   command="cmd_redo"/>
      <handler event="keypress" key="y" modifiers="accel"   command="cmd_redo"/>
      <handler event="keypress" key="a" modifiers="alt" command="cmd_selectAll"/>
      <handler event="keypress" keycode="VK_DELETE" modifiers="shift" command="cmd_cutOrDelete"/>
      <handler event="keypress" keycode="VK_DELETE" modifiers="control" command="cmd_copyOrDelete"/>
      <handler event="keypress" keycode="VK_INSERT" modifiers="control" command="cmd_copy"/>
      <handler event="keypress" keycode="VK_INSERT" modifiers="shift" command="cmd_paste"/>
      <handler event="keypress" keycode="VK_LEFT" modifiers="control" command="cmd_wordPrevious"/>
      <handler event="keypress" keycode="VK_RIGHT" modifiers="control" command="cmd_wordNext"/>
      <handler event="keypress" keycode="VK_LEFT" modifiers="shift,control" command="cmd_selectWordPrevious"/>
      <handler event="keypress" keycode="VK_RIGHT" modifiers="shift,control" command="cmd_selectWordNext"/>
      <handler event="keypress" keycode="VK_BACK" modifiers="control" command="cmd_deleteWordBackward"/>
      <handler event="keypress" keycode="VK_HOME" command="cmd_beginLine"/>
      <handler event="keypress" keycode="VK_END" command="cmd_endLine"/>
      <handler event="keypress" keycode="VK_HOME" modifiers="shift" command="cmd_selectBeginLine"/>
      <handler event="keypress" keycode="VK_END" modifiers="shift" command="cmd_selectEndLine"/>
      <handler event="keypress" keycode="VK_HOME" modifiers="shift,control" command="cmd_selectTop"/>
      <handler event="keypress" keycode="VK_END" modifiers="shift,control" command="cmd_selectBottom"/>
      <handler event="keypress" keycode="VK_HOME" modifiers="control" command="cmd_moveTop"/>
      <handler event="keypress" keycode="VK_END" modifiers="control" command="cmd_moveBottom"/>
      <handler event="keypress" keycode="VK_PAGE_UP" command="cmd_movePageUp"/>
      <handler event="keypress" keycode="VK_PAGE_DOWN" command="cmd_movePageDown"/>
    </handlers>
  </binding>
</bindings>
