]> git.lizzy.rs Git - micro.git/commitdiff
Allow configuration for info/term bindings
authorZachary Yedidia <zyedidia@gmail.com>
Wed, 1 Jul 2020 21:11:07 +0000 (17:11 -0400)
committerZachary Yedidia <zyedidia@gmail.com>
Sun, 9 Aug 2020 20:42:03 +0000 (16:42 -0400)
This commit exposes the separate infopane bindings to configuration
from the user. This also adds support for separate bindings in the
terminal emulator view. Default bindings are provided, but can also
be rebound in bindings.json.

internal/action/bindings.go
internal/action/bufpane.go
internal/action/defaults.go [new file with mode: 0644]
internal/action/defaults_darwin.go
internal/action/defaults_other.go
internal/action/infopane.go
internal/action/termpane.go

index 17eceb375653850ed705df46db76de6094ac3d7d..592482375d3404c98a88e122a8926df6b36d9027 100644 (file)
@@ -16,6 +16,12 @@ import (
        "github.com/zyedidia/tcell"
 )
 
+var Binder = map[string]func(e Event, action string){
+       "info":     InfoMapEvent,
+       "buffer":   BufMapEvent,
+       "terminal": TermMapEvent,
+}
+
 func createBindingsIfNotExist(fname string) {
        if _, e := os.Stat(fname); os.IsNotExist(e) {
                ioutil.WriteFile(fname, []byte("{}"), 0644)
@@ -24,10 +30,9 @@ func createBindingsIfNotExist(fname string) {
 
 // InitBindings intializes the bindings map by reading from bindings.json
 func InitBindings() {
-       config.Bindings = DefaultBindings()
+       config.Bindings = DefaultBindings("buffer")
 
-       var parsed map[string]string
-       defaults := DefaultBindings()
+       var parsed map[string]interface{}
 
        filename := filepath.Join(config.ConfigDir, "bindings.json")
        createBindingsIfNotExist(filename)
@@ -45,55 +50,52 @@ func InitBindings() {
                }
        }
 
-       for k, v := range defaults {
-               BindKey(k, v)
-       }
-       for k, v := range parsed {
-               BindKey(k, v)
-       }
-
-       defaultInfos := DefaultInfoBindings()
-       for k, v := range defaultInfos {
-               BindInfoKey(k, v)
-       }
-}
+       for p, bind := range Binder {
+               defaults := DefaultBindings(p)
 
-func BindInfoKey(k, v string) {
-       event, err := findEvent(k)
-       if err != nil {
-               screen.TermMessage(err)
+               for k, v := range defaults {
+                       BindKey(k, v, bind)
+               }
        }
 
-       switch e := event.(type) {
-       case KeyEvent:
-               InfoMapKey(e, v)
-       case KeySequenceEvent:
-               InfoMapKey(e, v)
-       case MouseEvent:
-               InfoMapMouse(e, v)
-       case RawEvent:
-               InfoMapKey(e, v)
+       for k, v := range parsed {
+               switch val := v.(type) {
+               case string:
+                       BindKey(k, val, Binder["buffer"])
+               case map[string]interface{}:
+                       bind := Binder[k]
+                       for e, a := range val {
+                               s, ok := a.(string)
+                               if !ok {
+                                       screen.TermMessage("Error reading bindings.json: non-string and non-map entry", k)
+                               } else {
+                                       BindKey(e, s, bind)
+                               }
+                       }
+               default:
+                       screen.TermMessage("Error reading bindings.json: non-string and non-map entry", k)
+               }
        }
 }
 
-func BindKey(k, v string) {
+func BindKey(k, v string, bind func(e Event, a string)) {
        event, err := findEvent(k)
        if err != nil {
                screen.TermMessage(err)
        }
 
-       switch e := event.(type) {
-       case KeyEvent:
-               BufMapKey(e, v)
-       case KeySequenceEvent:
-               BufMapKey(e, v)
-       case MouseEvent:
-               BufMapMouse(e, v)
-       case RawEvent:
-               BufMapKey(e, v)
-       }
-
-       config.Bindings[k] = v
+       bind(event, v)
+
+       // switch e := event.(type) {
+       // case KeyEvent:
+       //      InfoMapKey(e, v)
+       // case KeySequenceEvent:
+       //      InfoMapKey(e, v)
+       // case MouseEvent:
+       //      InfoMapMouse(e, v)
+       // case RawEvent:
+       //      InfoMapKey(e, v)
+       // }
 }
 
 var r = regexp.MustCompile("<(.+?)>")
@@ -276,7 +278,7 @@ func TryBindKey(k, v string, overwrite bool) (bool, error) {
                        parsed[k] = v
                }
 
-               BindKey(k, v)
+               BindKey(k, v, Binder["buffer"])
 
                txt, _ := json.MarshalIndent(parsed, "", "    ")
                return true, ioutil.WriteFile(filename, append(txt, '\n'), 0644)
@@ -316,9 +318,9 @@ func UnbindKey(k string) error {
                        }
                }
 
-               defaults := DefaultBindings()
+               defaults := DefaultBindings("buffer")
                if a, ok := defaults[k]; ok {
-                       BindKey(k, a)
+                       BindKey(k, a, Binder["buffer"])
                } else if _, ok := config.Bindings[k]; ok {
                        BufUnmap(key)
                        delete(config.Bindings, k)
index 3b4ba699fc695faba891a69427efb98b1b2fd355..44a07f96d9a731fadd9549a9839ba3fbd13e4a86 100644 (file)
@@ -1,7 +1,6 @@
 package action
 
 import (
-       "log"
        "strings"
        "time"
 
@@ -61,8 +60,17 @@ func LuaAction(fn string) func(*BufPane) bool {
        }
 }
 
-// BufMapKey maps a key event to an action
-func BufMapKey(k Event, action string) {
+// BufMapKey maps an event to an action
+func BufMapEvent(k Event, action string) {
+       switch e := k.(type) {
+       case KeyEvent, KeySequenceEvent, RawEvent:
+               bufMapKey(e, action)
+       case MouseEvent:
+               bufMapMouse(e, action)
+       }
+}
+
+func bufMapKey(k Event, action string) {
        var actionfns []func(*BufPane) bool
        var names []string
        var types []byte
@@ -145,13 +153,13 @@ func BufMapKey(k Event, action string) {
 }
 
 // BufMapMouse maps a mouse event to an action
-func BufMapMouse(k MouseEvent, action string) {
+func bufMapMouse(k MouseEvent, action string) {
        if f, ok := BufMouseActions[action]; ok {
                BufBindings.RegisterMouseBinding(k, BufMouseActionGeneral(f))
        } else {
                // TODO
                // delete(BufMouseBindings, k)
-               BufMapKey(k, action)
+               bufMapKey(k, action)
        }
 }
 
@@ -423,14 +431,14 @@ func (h *BufPane) Bindings() *KeyTree {
 func (h *BufPane) DoKeyEvent(e Event) bool {
        binds := h.Bindings()
        action, more := binds.NextEvent(e, nil)
-       log.Println("Next event", e, more)
        if action != nil && !more {
                action(h)
                binds.ResetEvents()
+               return true
        } else if action == nil && !more {
                binds.ResetEvents()
        }
-       return false
+       return more
 }
 
 func (h *BufPane) execAction(action func(*BufPane) bool, name string, cursor int) bool {
diff --git a/internal/action/defaults.go b/internal/action/defaults.go
new file mode 100644 (file)
index 0000000..c3d1572
--- /dev/null
@@ -0,0 +1,21 @@
+package action
+
+var termdefaults = map[string]string{
+       "<Ctrl-q><Ctrl-q>": "Exit",
+       "<Ctrl-e><Ctrl-e>": "CommandMode",
+       "<Ctrl-w><Ctrl-w>": "NextSplit",
+}
+
+// DefaultBindings returns a map containing micro's default keybindings
+func DefaultBindings(pane string) map[string]string {
+       switch pane {
+       case "info":
+               return infodefaults
+       case "buffer":
+               return bufdefaults
+       case "terminal":
+               return termdefaults
+       default:
+               return map[string]string{}
+       }
+}
index 6df65d31b37b46df07b97b814b12e0c156a64b90..c04d717e8d82d8308417661b255198582b458327 100644 (file)
 package action
 
-// DefaultBindings returns a map containing micro's default keybindings
-func DefaultBindings() map[string]string {
-       return map[string]string{
-               "Up":             "CursorUp",
-               "Down":           "CursorDown",
-               "Right":          "CursorRight",
-               "Left":           "CursorLeft",
-               "ShiftUp":        "SelectUp",
-               "ShiftDown":      "SelectDown",
-               "ShiftLeft":      "SelectLeft",
-               "ShiftRight":     "SelectRight",
-               "AltLeft":        "WordLeft",
-               "AltRight":       "WordRight",
-               "AltUp":          "MoveLinesUp",
-               "AltDown":        "MoveLinesDown",
-               "AltShiftRight":  "SelectWordRight",
-               "AltShiftLeft":   "SelectWordLeft",
-               "CtrlLeft":       "StartOfTextToggle",
-               "CtrlRight":      "EndOfLine",
-               "CtrlShiftLeft":  "SelectToStartOfTextToggle",
-               "ShiftHome":      "SelectToStartOfTextToggle",
-               "CtrlShiftRight": "SelectToEndOfLine",
-               "ShiftEnd":       "SelectToEndOfLine",
-               "CtrlUp":         "CursorStart",
-               "CtrlDown":       "CursorEnd",
-               "CtrlShiftUp":    "SelectToStart",
-               "CtrlShiftDown":  "SelectToEnd",
-               "Alt-{":          "ParagraphPrevious",
-               "Alt-}":          "ParagraphNext",
-               "Enter":          "InsertNewline",
-               "CtrlH":          "Backspace",
-               "Backspace":      "Backspace",
-               "OldBackspace":   "Backspace",
-               "Alt-CtrlH":      "DeleteWordLeft",
-               "Alt-Backspace":  "DeleteWordLeft",
-               "Tab":            "Autocomplete|IndentSelection|InsertTab",
-               "Backtab":        "CycleAutocompleteBack|OutdentSelection|OutdentLine",
-               "Ctrl-o":         "OpenFile",
-               "Ctrl-s":         "Save",
-               "Ctrl-f":         "Find",
-               "Ctrl-n":         "FindNext",
-               "Ctrl-p":         "FindPrevious",
-               "Ctrl-z":         "Undo",
-               "Ctrl-y":         "Redo",
-               "Ctrl-c":         "CopyLine|Copy",
-               "Ctrl-x":         "Cut",
-               "Ctrl-k":         "CutLine",
-               "Ctrl-d":         "DuplicateLine",
-               "Ctrl-v":         "Paste",
-               "Ctrl-a":         "SelectAll",
-               "Ctrl-t":         "AddTab",
-               "Alt-,":          "PreviousTab",
-               "Alt-.":          "NextTab",
-               "Home":           "StartOfTextToggle",
-               "End":            "EndOfLine",
-               "CtrlHome":       "CursorStart",
-               "CtrlEnd":        "CursorEnd",
-               "PageUp":         "CursorPageUp",
-               "PageDown":       "CursorPageDown",
-               "CtrlPageUp":     "PreviousTab",
-               "CtrlPageDown":   "NextTab",
-               "Ctrl-g":         "ToggleHelp",
-               "Alt-g":          "ToggleKeyMenu",
-               "Ctrl-r":         "ToggleRuler",
-               "Ctrl-l":         "command-edit:goto ",
-               "Delete":         "Delete",
-               "Ctrl-b":         "ShellMode",
-               "Ctrl-q":         "Quit",
-               "Ctrl-e":         "CommandMode",
-               "Ctrl-w":         "NextSplit",
-               "Ctrl-u":         "ToggleMacro",
-               "Ctrl-j":         "PlayMacro",
-               "Insert":         "ToggleOverwriteMode",
+var bufdefaults = map[string]string{
+       "Up":             "CursorUp",
+       "Down":           "CursorDown",
+       "Right":          "CursorRight",
+       "Left":           "CursorLeft",
+       "ShiftUp":        "SelectUp",
+       "ShiftDown":      "SelectDown",
+       "ShiftLeft":      "SelectLeft",
+       "ShiftRight":     "SelectRight",
+       "AltLeft":        "WordLeft",
+       "AltRight":       "WordRight",
+       "AltUp":          "MoveLinesUp",
+       "AltDown":        "MoveLinesDown",
+       "AltShiftRight":  "SelectWordRight",
+       "AltShiftLeft":   "SelectWordLeft",
+       "CtrlLeft":       "StartOfTextToggle",
+       "CtrlRight":      "EndOfLine",
+       "CtrlShiftLeft":  "SelectToStartOfTextToggle",
+       "ShiftHome":      "SelectToStartOfTextToggle",
+       "CtrlShiftRight": "SelectToEndOfLine",
+       "ShiftEnd":       "SelectToEndOfLine",
+       "CtrlUp":         "CursorStart",
+       "CtrlDown":       "CursorEnd",
+       "CtrlShiftUp":    "SelectToStart",
+       "CtrlShiftDown":  "SelectToEnd",
+       "Alt-{":          "ParagraphPrevious",
+       "Alt-}":          "ParagraphNext",
+       "Enter":          "InsertNewline",
+       "CtrlH":          "Backspace",
+       "Backspace":      "Backspace",
+       "OldBackspace":   "Backspace",
+       "Alt-CtrlH":      "DeleteWordLeft",
+       "Alt-Backspace":  "DeleteWordLeft",
+       "Tab":            "Autocomplete|IndentSelection|InsertTab",
+       "Backtab":        "CycleAutocompleteBack|OutdentSelection|OutdentLine",
+       "Ctrl-o":         "OpenFile",
+       "Ctrl-s":         "Save",
+       "Ctrl-f":         "Find",
+       "Ctrl-n":         "FindNext",
+       "Ctrl-p":         "FindPrevious",
+       "Ctrl-z":         "Undo",
+       "Ctrl-y":         "Redo",
+       "Ctrl-c":         "CopyLine|Copy",
+       "Ctrl-x":         "Cut",
+       "Ctrl-k":         "CutLine",
+       "Ctrl-d":         "DuplicateLine",
+       "Ctrl-v":         "Paste",
+       "Ctrl-a":         "SelectAll",
+       "Ctrl-t":         "AddTab",
+       "Alt-,":          "PreviousTab",
+       "Alt-.":          "NextTab",
+       "Home":           "StartOfTextToggle",
+       "End":            "EndOfLine",
+       "CtrlHome":       "CursorStart",
+       "CtrlEnd":        "CursorEnd",
+       "PageUp":         "CursorPageUp",
+       "PageDown":       "CursorPageDown",
+       "CtrlPageUp":     "PreviousTab",
+       "CtrlPageDown":   "NextTab",
+       "Ctrl-g":         "ToggleHelp",
+       "Alt-g":          "ToggleKeyMenu",
+       "Ctrl-r":         "ToggleRuler",
+       "Ctrl-l":         "command-edit:goto ",
+       "Delete":         "Delete",
+       "Ctrl-b":         "ShellMode",
+       "Ctrl-q":         "Quit",
+       "Ctrl-e":         "CommandMode",
+       "Ctrl-w":         "NextSplit",
+       "Ctrl-u":         "ToggleMacro",
+       "Ctrl-j":         "PlayMacro",
+       "Insert":         "ToggleOverwriteMode",
 
-               // Emacs-style keybindings
-               "Alt-f": "WordRight",
-               "Alt-b": "WordLeft",
-               "Alt-a": "StartOfText",
-               "Alt-e": "EndOfLine",
-               // "Alt-p": "CursorUp",
-               // "Alt-n": "CursorDown",
+       // Emacs-style keybindings
+       "Alt-f": "WordRight",
+       "Alt-b": "WordLeft",
+       "Alt-a": "StartOfText",
+       "Alt-e": "EndOfLine",
+       // "Alt-p": "CursorUp",
+       // "Alt-n": "CursorDown",
 
-               // Integration with file managers
-               "F2":  "Save",
-               "F3":  "Find",
-               "F4":  "Quit",
-               "F7":  "Find",
-               "F10": "Quit",
-               "Esc": "Escape,Deselect,ClearInfo,RemoveAllMultiCursors",
+       // Integration with file managers
+       "F2":  "Save",
+       "F3":  "Find",
+       "F4":  "Quit",
+       "F7":  "Find",
+       "F10": "Quit",
+       "Esc": "Escape,Deselect,ClearInfo,RemoveAllMultiCursors",
 
-               // Mouse bindings
-               "MouseWheelUp":   "ScrollUp",
-               "MouseWheelDown": "ScrollDown",
-               "MouseLeft":      "MousePress",
-               "MouseMiddle":    "PastePrimary",
-               "Ctrl-MouseLeft": "MouseMultiCursor",
+       // Mouse bindings
+       "MouseWheelUp":   "ScrollUp",
+       "MouseWheelDown": "ScrollDown",
+       "MouseLeft":      "MousePress",
+       "MouseMiddle":    "PastePrimary",
+       "Ctrl-MouseLeft": "MouseMultiCursor",
 
-               "Alt-n":        "SpawnMultiCursor",
-               "AltShiftUp":   "SpawnMultiCursorUp",
-               "AltShiftDown": "SpawnMultiCursorDown",
-               "Alt-m":        "SpawnMultiCursorSelect",
-               "Alt-p":        "RemoveMultiCursor",
-               "Alt-c":        "RemoveAllMultiCursors",
-               "Alt-x":        "SkipMultiCursor",
-       }
+       "Alt-n":        "SpawnMultiCursor",
+       "AltShiftUp":   "SpawnMultiCursorUp",
+       "AltShiftDown": "SpawnMultiCursorDown",
+       "Alt-m":        "SpawnMultiCursorSelect",
+       "Alt-p":        "RemoveMultiCursor",
+       "Alt-c":        "RemoveAllMultiCursors",
+       "Alt-x":        "SkipMultiCursor",
 }
 
-func DefaultInfoBindings() map[string]string {
-       return map[string]string{
-               "Up":             "HistoryUp",
-               "Down":           "HistoryDown",
-               "Right":          "CursorRight",
-               "Left":           "CursorLeft",
-               "ShiftUp":        "SelectUp",
-               "ShiftDown":      "SelectDown",
-               "ShiftLeft":      "SelectLeft",
-               "ShiftRight":     "SelectRight",
-               "AltLeft":        "WordLeft",
-               "AltRight":       "WordRight",
-               "AltUp":          "CursorStart",
-               "AltDown":        "CursorEnd",
-               "AltShiftRight":  "SelectWordRight",
-               "AltShiftLeft":   "SelectWordLeft",
-               "CtrlLeft":       "StartOfTextToggle",
-               "CtrlRight":      "EndOfLine",
-               "CtrlShiftLeft":  "SelectToStartOfTextToggle",
-               "ShiftHome":      "SelectToStartOfTextToggle",
-               "CtrlShiftRight": "SelectToEndOfLine",
-               "ShiftEnd":       "SelectToEndOfLine",
-               "CtrlUp":         "CursorStart",
-               "CtrlDown":       "CursorEnd",
-               "CtrlShiftUp":    "SelectToStart",
-               "CtrlShiftDown":  "SelectToEnd",
-               "Enter":          "ExecuteCommand",
-               "CtrlH":          "Backspace",
-               "Backspace":      "Backspace",
-               "OldBackspace":   "Backspace",
-               "Alt-CtrlH":      "DeleteWordLeft",
-               "Alt-Backspace":  "DeleteWordLeft",
-               "Tab":            "CommandComplete",
-               "Backtab":        "CycleAutocompleteBack",
-               "Ctrl-z":         "Undo",
-               "Ctrl-y":         "Redo",
-               "Ctrl-c":         "CopyLine|Copy",
-               "Ctrl-x":         "Cut",
-               "Ctrl-k":         "CutLine",
-               "Ctrl-v":         "Paste",
-               "Home":           "StartOfTextToggle",
-               "End":            "EndOfLine",
-               "CtrlHome":       "CursorStart",
-               "CtrlEnd":        "CursorEnd",
-               "Delete":         "Delete",
-               "Ctrl-q":         "AbortCommand",
-               "Ctrl-e":         "EndOfLine",
-               "Ctrl-a":         "StartOfLine",
-               "Ctrl-w":         "DeleteWordLeft",
-               "Insert":         "ToggleOverwriteMode",
-               "Ctrl-b":         "WordLeft",
-               "Ctrl-f":         "WordRight",
-               "Ctrl-d":         "DeleteWordLeft",
-               "Ctrl-m":         "ExecuteCommand",
-               "Ctrl-n":         "HistoryDown",
-               "Ctrl-p":         "HistoryUp",
-               "Ctrl-u":         "SelectToStart",
+var infodefaults = map[string]string{
+       "Up":             "HistoryUp",
+       "Down":           "HistoryDown",
+       "Right":          "CursorRight",
+       "Left":           "CursorLeft",
+       "ShiftUp":        "SelectUp",
+       "ShiftDown":      "SelectDown",
+       "ShiftLeft":      "SelectLeft",
+       "ShiftRight":     "SelectRight",
+       "AltLeft":        "WordLeft",
+       "AltRight":       "WordRight",
+       "AltUp":          "CursorStart",
+       "AltDown":        "CursorEnd",
+       "AltShiftRight":  "SelectWordRight",
+       "AltShiftLeft":   "SelectWordLeft",
+       "CtrlLeft":       "StartOfTextToggle",
+       "CtrlRight":      "EndOfLine",
+       "CtrlShiftLeft":  "SelectToStartOfTextToggle",
+       "ShiftHome":      "SelectToStartOfTextToggle",
+       "CtrlShiftRight": "SelectToEndOfLine",
+       "ShiftEnd":       "SelectToEndOfLine",
+       "CtrlUp":         "CursorStart",
+       "CtrlDown":       "CursorEnd",
+       "CtrlShiftUp":    "SelectToStart",
+       "CtrlShiftDown":  "SelectToEnd",
+       "Enter":          "ExecuteCommand",
+       "CtrlH":          "Backspace",
+       "Backspace":      "Backspace",
+       "OldBackspace":   "Backspace",
+       "Alt-CtrlH":      "DeleteWordLeft",
+       "Alt-Backspace":  "DeleteWordLeft",
+       "Tab":            "CommandComplete",
+       "Backtab":        "CycleAutocompleteBack",
+       "Ctrl-z":         "Undo",
+       "Ctrl-y":         "Redo",
+       "Ctrl-c":         "CopyLine|Copy",
+       "Ctrl-x":         "Cut",
+       "Ctrl-k":         "CutLine",
+       "Ctrl-v":         "Paste",
+       "Home":           "StartOfTextToggle",
+       "End":            "EndOfLine",
+       "CtrlHome":       "CursorStart",
+       "CtrlEnd":        "CursorEnd",
+       "Delete":         "Delete",
+       "Ctrl-q":         "AbortCommand",
+       "Ctrl-e":         "EndOfLine",
+       "Ctrl-a":         "StartOfLine",
+       "Ctrl-w":         "DeleteWordLeft",
+       "Insert":         "ToggleOverwriteMode",
+       "Ctrl-b":         "WordLeft",
+       "Ctrl-f":         "WordRight",
+       "Ctrl-d":         "DeleteWordLeft",
+       "Ctrl-m":         "ExecuteCommand",
+       "Ctrl-n":         "HistoryDown",
+       "Ctrl-p":         "HistoryUp",
+       "Ctrl-u":         "SelectToStart",
 
-               // Emacs-style keybindings
-               "Alt-f": "WordRight",
-               "Alt-b": "WordLeft",
-               "Alt-a": "StartOfText",
-               "Alt-e": "EndOfLine",
+       // Emacs-style keybindings
+       "Alt-f": "WordRight",
+       "Alt-b": "WordLeft",
+       "Alt-a": "StartOfText",
+       "Alt-e": "EndOfLine",
 
-               // Integration with file managers
-               "F10": "AbortCommand",
-               "Esc": "AbortCommand",
+       // Integration with file managers
+       "F10": "AbortCommand",
+       "Esc": "AbortCommand",
 
-               // Mouse bindings
-               "MouseWheelUp":   "HistoryUp",
-               "MouseWheelDown": "HistoryDown",
-               "MouseLeft":      "MousePress",
-               "MouseMiddle":    "PastePrimary",
-       }
+       // Mouse bindings
+       "MouseWheelUp":   "HistoryUp",
+       "MouseWheelDown": "HistoryDown",
+       "MouseLeft":      "MousePress",
+       "MouseMiddle":    "PastePrimary",
 }
index ee4e311dae5b4d32f5d7c451d0a3e07ecd126c7b..d0290e403178dafdee3b0b4b5fc08dc3547b28fa 100644 (file)
 
 package action
 
-// DefaultBindings returns a map containing micro's default keybindings
-func DefaultBindings() map[string]string {
-       return map[string]string{
-               "Up":             "CursorUp",
-               "Down":           "CursorDown",
-               "Right":          "CursorRight",
-               "Left":           "CursorLeft",
-               "ShiftUp":        "SelectUp",
-               "ShiftDown":      "SelectDown",
-               "ShiftLeft":      "SelectLeft",
-               "ShiftRight":     "SelectRight",
-               "CtrlLeft":       "WordLeft",
-               "CtrlRight":      "WordRight",
-               "AltUp":          "MoveLinesUp",
-               "AltDown":        "MoveLinesDown",
-               "CtrlShiftRight": "SelectWordRight",
-               "CtrlShiftLeft":  "SelectWordLeft",
-               "AltLeft":        "StartOfTextToggle",
-               "AltRight":       "EndOfLine",
-               "AltShiftLeft":   "SelectToStartOfTextToggle",
-               "ShiftHome":      "SelectToStartOfTextToggle",
-               "AltShiftRight":  "SelectToEndOfLine",
-               "ShiftEnd":       "SelectToEndOfLine",
-               "CtrlUp":         "CursorStart",
-               "CtrlDown":       "CursorEnd",
-               "CtrlShiftUp":    "SelectToStart",
-               "CtrlShiftDown":  "SelectToEnd",
-               "Alt-{":          "ParagraphPrevious",
-               "Alt-}":          "ParagraphNext",
-               "Enter":          "InsertNewline",
-               "CtrlH":          "Backspace",
-               "Backspace":      "Backspace",
-               "OldBackspace":   "Backspace",
-               "Alt-CtrlH":      "DeleteWordLeft",
-               "Alt-Backspace":  "DeleteWordLeft",
-               "Tab":            "Autocomplete|IndentSelection|InsertTab",
-               "Backtab":        "CycleAutocompleteBack|OutdentSelection|OutdentLine",
-               "Ctrl-o":         "OpenFile",
-               "Ctrl-s":         "Save",
-               "Ctrl-f":         "Find",
-               "Ctrl-n":         "FindNext",
-               "Ctrl-p":         "FindPrevious",
-               "Ctrl-z":         "Undo",
-               "Ctrl-y":         "Redo",
-               "Ctrl-c":         "CopyLine|Copy",
-               "Ctrl-x":         "Cut",
-               "Ctrl-k":         "CutLine",
-               "Ctrl-d":         "DuplicateLine",
-               "Ctrl-v":         "Paste",
-               "Ctrl-a":         "SelectAll",
-               "Ctrl-t":         "AddTab",
-               "Alt-,":          "PreviousTab",
-               "Alt-.":          "NextTab",
-               "Home":           "StartOfTextToggle",
-               "End":            "EndOfLine",
-               "CtrlHome":       "CursorStart",
-               "CtrlEnd":        "CursorEnd",
-               "PageUp":         "CursorPageUp",
-               "PageDown":       "CursorPageDown",
-               "CtrlPageUp":     "PreviousTab",
-               "CtrlPageDown":   "NextTab",
-               "Ctrl-g":         "ToggleHelp",
-               "Alt-g":          "ToggleKeyMenu",
-               "Ctrl-r":         "ToggleRuler",
-               "Ctrl-l":         "command-edit:goto ",
-               "Delete":         "Delete",
-               "Ctrl-b":         "ShellMode",
-               "Ctrl-q":         "Quit",
-               "Ctrl-e":         "CommandMode",
-               "Ctrl-w":         "NextSplit",
-               "Ctrl-u":         "ToggleMacro",
-               "Ctrl-j":         "PlayMacro",
-               "Insert":         "ToggleOverwriteMode",
+var bufdefaults = map[string]string{
+       "Up":             "CursorUp",
+       "Down":           "CursorDown",
+       "Right":          "CursorRight",
+       "Left":           "CursorLeft",
+       "ShiftUp":        "SelectUp",
+       "ShiftDown":      "SelectDown",
+       "ShiftLeft":      "SelectLeft",
+       "ShiftRight":     "SelectRight",
+       "CtrlLeft":       "WordLeft",
+       "CtrlRight":      "WordRight",
+       "AltUp":          "MoveLinesUp",
+       "AltDown":        "MoveLinesDown",
+       "CtrlShiftRight": "SelectWordRight",
+       "CtrlShiftLeft":  "SelectWordLeft",
+       "AltLeft":        "StartOfTextToggle",
+       "AltRight":       "EndOfLine",
+       "AltShiftLeft":   "SelectToStartOfTextToggle",
+       "ShiftHome":      "SelectToStartOfTextToggle",
+       "AltShiftRight":  "SelectToEndOfLine",
+       "ShiftEnd":       "SelectToEndOfLine",
+       "CtrlUp":         "CursorStart",
+       "CtrlDown":       "CursorEnd",
+       "CtrlShiftUp":    "SelectToStart",
+       "CtrlShiftDown":  "SelectToEnd",
+       "Alt-{":          "ParagraphPrevious",
+       "Alt-}":          "ParagraphNext",
+       "Enter":          "InsertNewline",
+       "CtrlH":          "Backspace",
+       "Backspace":      "Backspace",
+       "OldBackspace":   "Backspace",
+       "Alt-CtrlH":      "DeleteWordLeft",
+       "Alt-Backspace":  "DeleteWordLeft",
+       "Tab":            "Autocomplete|IndentSelection|InsertTab",
+       "Backtab":        "CycleAutocompleteBack|OutdentSelection|OutdentLine",
+       "Ctrl-o":         "OpenFile",
+       "Ctrl-s":         "Save",
+       "Ctrl-f":         "Find",
+       "Ctrl-n":         "FindNext",
+       "Ctrl-p":         "FindPrevious",
+       "Ctrl-z":         "Undo",
+       "Ctrl-y":         "Redo",
+       "Ctrl-c":         "CopyLine|Copy",
+       "Ctrl-x":         "Cut",
+       "Ctrl-k":         "CutLine",
+       "Ctrl-d":         "DuplicateLine",
+       "Ctrl-v":         "Paste",
+       "Ctrl-a":         "SelectAll",
+       "Ctrl-t":         "AddTab",
+       "Alt-,":          "PreviousTab",
+       "Alt-.":          "NextTab",
+       "Home":           "StartOfTextToggle",
+       "End":            "EndOfLine",
+       "CtrlHome":       "CursorStart",
+       "CtrlEnd":        "CursorEnd",
+       "PageUp":         "CursorPageUp",
+       "PageDown":       "CursorPageDown",
+       "CtrlPageUp":     "PreviousTab",
+       "CtrlPageDown":   "NextTab",
+       "Ctrl-g":         "ToggleHelp",
+       "Alt-g":          "ToggleKeyMenu",
+       "Ctrl-r":         "ToggleRuler",
+       "Ctrl-l":         "command-edit:goto ",
+       "Delete":         "Delete",
+       "Ctrl-b":         "ShellMode",
+       "Ctrl-q":         "Quit",
+       "Ctrl-e":         "CommandMode",
+       "Ctrl-w":         "NextSplit",
+       "Ctrl-u":         "ToggleMacro",
+       "Ctrl-j":         "PlayMacro",
+       "Insert":         "ToggleOverwriteMode",
 
-               // Emacs-style keybindings
-               "Alt-f": "WordRight",
-               "Alt-b": "WordLeft",
-               "Alt-a": "StartOfText",
-               "Alt-e": "EndOfLine",
-               // "Alt-p": "CursorUp",
-               // "Alt-n": "CursorDown",
+       // Emacs-style keybindings
+       "Alt-f": "WordRight",
+       "Alt-b": "WordLeft",
+       "Alt-a": "StartOfText",
+       "Alt-e": "EndOfLine",
+       // "Alt-p": "CursorUp",
+       // "Alt-n": "CursorDown",
 
-               // Integration with file managers
-               "F2":  "Save",
-               "F3":  "Find",
-               "F4":  "Quit",
-               "F7":  "Find",
-               "F10": "Quit",
-               "Esc": "Escape,Deselect,ClearInfo,RemoveAllMultiCursors",
+       // Integration with file managers
+       "F2":  "Save",
+       "F3":  "Find",
+       "F4":  "Quit",
+       "F7":  "Find",
+       "F10": "Quit",
+       "Esc": "Escape,Deselect,ClearInfo,RemoveAllMultiCursors",
 
-               // Mouse bindings
-               "MouseWheelUp":   "ScrollUp",
-               "MouseWheelDown": "ScrollDown",
-               "MouseLeft":      "MousePress",
-               "MouseMiddle":    "PastePrimary",
-               "Ctrl-MouseLeft": "MouseMultiCursor",
+       // Mouse bindings
+       "MouseWheelUp":   "ScrollUp",
+       "MouseWheelDown": "ScrollDown",
+       "MouseLeft":      "MousePress",
+       "MouseMiddle":    "PastePrimary",
+       "Ctrl-MouseLeft": "MouseMultiCursor",
 
-               "Alt-n":        "SpawnMultiCursor",
-               "Alt-m":        "SpawnMultiCursorSelect",
-               "AltShiftUp":   "SpawnMultiCursorUp",
-               "AltShiftDown": "SpawnMultiCursorDown",
-               "Alt-p":        "RemoveMultiCursor",
-               "Alt-c":        "RemoveAllMultiCursors",
-               "Alt-x":        "SkipMultiCursor",
-       }
+       "Alt-n":        "SpawnMultiCursor",
+       "Alt-m":        "SpawnMultiCursorSelect",
+       "AltShiftUp":   "SpawnMultiCursorUp",
+       "AltShiftDown": "SpawnMultiCursorDown",
+       "Alt-p":        "RemoveMultiCursor",
+       "Alt-c":        "RemoveAllMultiCursors",
+       "Alt-x":        "SkipMultiCursor",
 }
 
-func DefaultInfoBindings() map[string]string {
-       return map[string]string{
-               "Up":             "HistoryUp",
-               "Down":           "HistoryDown",
-               "Right":          "CursorRight",
-               "Left":           "CursorLeft",
-               "ShiftUp":        "SelectUp",
-               "ShiftDown":      "SelectDown",
-               "ShiftLeft":      "SelectLeft",
-               "ShiftRight":     "SelectRight",
-               "AltLeft":        "StartOfTextToggle",
-               "AltRight":       "EndOfLine",
-               "AltUp":          "CursorStart",
-               "AltDown":        "CursorEnd",
-               "AltShiftRight":  "SelectWordRight",
-               "AltShiftLeft":   "SelectWordLeft",
-               "CtrlLeft":       "WordLeft",
-               "CtrlRight":      "WordRight",
-               "CtrlShiftLeft":  "SelectToStartOfTextToggle",
-               "ShiftHome":      "SelectToStartOfTextToggle",
-               "CtrlShiftRight": "SelectToEndOfLine",
-               "ShiftEnd":       "SelectToEndOfLine",
-               "CtrlUp":         "CursorStart",
-               "CtrlDown":       "CursorEnd",
-               "CtrlShiftUp":    "SelectToStart",
-               "CtrlShiftDown":  "SelectToEnd",
-               "Enter":          "ExecuteCommand",
-               "CtrlH":          "Backspace",
-               "Backspace":      "Backspace",
-               "OldBackspace":   "Backspace",
-               "Alt-CtrlH":      "DeleteWordLeft",
-               "Alt-Backspace":  "DeleteWordLeft",
-               "Tab":            "CommandComplete",
-               "Backtab":        "CycleAutocompleteBack",
-               "Ctrl-z":         "Undo",
-               "Ctrl-y":         "Redo",
-               "Ctrl-c":         "CopyLine|Copy",
-               "Ctrl-x":         "Cut",
-               "Ctrl-k":         "CutLine",
-               "Ctrl-v":         "Paste",
-               "Home":           "StartOfTextToggle",
-               "End":            "EndOfLine",
-               "CtrlHome":       "CursorStart",
-               "CtrlEnd":        "CursorEnd",
-               "Delete":         "Delete",
-               "Ctrl-q":         "AbortCommand",
-               "Ctrl-e":         "EndOfLine",
-               "Ctrl-a":         "StartOfLine",
-               "Ctrl-w":         "DeleteWordLeft",
-               "Insert":         "ToggleOverwriteMode",
-               "Ctrl-b":         "WordLeft",
-               "Ctrl-f":         "WordRight",
-               "Ctrl-d":         "DeleteWordLeft",
-               "Ctrl-m":         "ExecuteCommand",
-               "Ctrl-n":         "HistoryDown",
-               "Ctrl-p":         "HistoryUp",
-               "Ctrl-u":         "SelectToStart",
+var infodefaults = map[string]string{
+       "Up":             "HistoryUp",
+       "Down":           "HistoryDown",
+       "Right":          "CursorRight",
+       "Left":           "CursorLeft",
+       "ShiftUp":        "SelectUp",
+       "ShiftDown":      "SelectDown",
+       "ShiftLeft":      "SelectLeft",
+       "ShiftRight":     "SelectRight",
+       "AltLeft":        "StartOfTextToggle",
+       "AltRight":       "EndOfLine",
+       "AltUp":          "CursorStart",
+       "AltDown":        "CursorEnd",
+       "AltShiftRight":  "SelectWordRight",
+       "AltShiftLeft":   "SelectWordLeft",
+       "CtrlLeft":       "WordLeft",
+       "CtrlRight":      "WordRight",
+       "CtrlShiftLeft":  "SelectToStartOfTextToggle",
+       "ShiftHome":      "SelectToStartOfTextToggle",
+       "CtrlShiftRight": "SelectToEndOfLine",
+       "ShiftEnd":       "SelectToEndOfLine",
+       "CtrlUp":         "CursorStart",
+       "CtrlDown":       "CursorEnd",
+       "CtrlShiftUp":    "SelectToStart",
+       "CtrlShiftDown":  "SelectToEnd",
+       "Enter":          "ExecuteCommand",
+       "CtrlH":          "Backspace",
+       "Backspace":      "Backspace",
+       "OldBackspace":   "Backspace",
+       "Alt-CtrlH":      "DeleteWordLeft",
+       "Alt-Backspace":  "DeleteWordLeft",
+       "Tab":            "CommandComplete",
+       "Backtab":        "CycleAutocompleteBack",
+       "Ctrl-z":         "Undo",
+       "Ctrl-y":         "Redo",
+       "Ctrl-c":         "CopyLine|Copy",
+       "Ctrl-x":         "Cut",
+       "Ctrl-k":         "CutLine",
+       "Ctrl-v":         "Paste",
+       "Home":           "StartOfTextToggle",
+       "End":            "EndOfLine",
+       "CtrlHome":       "CursorStart",
+       "CtrlEnd":        "CursorEnd",
+       "Delete":         "Delete",
+       "Ctrl-q":         "AbortCommand",
+       "Ctrl-e":         "EndOfLine",
+       "Ctrl-a":         "StartOfLine",
+       "Ctrl-w":         "DeleteWordLeft",
+       "Insert":         "ToggleOverwriteMode",
+       "Ctrl-b":         "WordLeft",
+       "Ctrl-f":         "WordRight",
+       "Ctrl-d":         "DeleteWordLeft",
+       "Ctrl-m":         "ExecuteCommand",
+       "Ctrl-n":         "HistoryDown",
+       "Ctrl-p":         "HistoryUp",
+       "Ctrl-u":         "SelectToStart",
 
-               // Emacs-style keybindings
-               "Alt-f": "WordRight",
-               "Alt-b": "WordLeft",
-               "Alt-a": "StartOfText",
-               "Alt-e": "EndOfLine",
+       // Emacs-style keybindings
+       "Alt-f": "WordRight",
+       "Alt-b": "WordLeft",
+       "Alt-a": "StartOfText",
+       "Alt-e": "EndOfLine",
 
-               // Integration with file managers
-               "F10": "AbortCommand",
-               "Esc": "AbortCommand",
+       // Integration with file managers
+       "F10": "AbortCommand",
+       "Esc": "AbortCommand",
 
-               // Mouse bindings
-               "MouseWheelUp":   "HistoryUp",
-               "MouseWheelDown": "HistoryDown",
-               "MouseLeft":      "MousePress",
-               "MouseMiddle":    "PastePrimary",
-       }
+       // Mouse bindings
+       "MouseWheelUp":   "HistoryUp",
+       "MouseWheelDown": "HistoryDown",
+       "MouseLeft":      "MousePress",
+       "MouseMiddle":    "PastePrimary",
 }
index 8c2c66903d85dfc677388676287acb5e971b1664..ed4aea291a74bef92998d8b02e8e27832990cdad 100644 (file)
@@ -20,7 +20,16 @@ func init() {
        InfoBufBindings = NewKeyTree()
 }
 
-func InfoMapKey(k Event, action string) {
+func InfoMapEvent(k Event, action string) {
+       switch e := k.(type) {
+       case KeyEvent, KeySequenceEvent, RawEvent:
+               infoMapKey(e, action)
+       case MouseEvent:
+               infoMapMouse(e, action)
+       }
+}
+
+func infoMapKey(k Event, action string) {
        if f, ok := InfoKeyActions[action]; ok {
                InfoBindings.RegisterKeyBinding(k, InfoKeyActionGeneral(f))
        } else if f, ok := BufKeyActions[action]; ok {
@@ -28,18 +37,19 @@ func InfoMapKey(k Event, action string) {
        }
 }
 
-func InfoMapMouse(k MouseEvent, action string) {
+func infoMapMouse(k MouseEvent, action string) {
+       // TODO: map mouse
        if f, ok := BufMouseActions[action]; ok {
                InfoBufBindings.RegisterMouseBinding(k, BufMouseActionGeneral(f))
        } else {
-               InfoMapKey(k, action)
+               infoMapKey(k, action)
        }
 }
 
 func InfoKeyActionGeneral(a InfoKeyAction) PaneKeyAction {
        return func(p Pane) bool {
                a(p.(*InfoPane))
-               return false
+               return true
        }
 }
 
@@ -107,7 +117,6 @@ func (h *InfoPane) HandleEvent(event tcell.Event) {
 
 // DoKeyEvent executes a key event for the command bar, doing any overridden actions
 func (h *InfoPane) DoKeyEvent(e KeyEvent) bool {
-       done := false
        action, more := InfoBindings.NextEvent(e, nil)
        if action != nil && !more {
                action(h)
@@ -119,15 +128,18 @@ func (h *InfoPane) DoKeyEvent(e KeyEvent) bool {
                // return false //TODO:?
        }
 
-       action, more = InfoBufBindings.NextEvent(e, nil)
-       if action != nil && !more {
-               done = action(h.BufPane)
-               InfoBufBindings.ResetEvents()
-       } else if action == nil && !more {
-               InfoBufBindings.ResetEvents()
+       if !more {
+               action, more = InfoBufBindings.NextEvent(e, nil)
+               if action != nil && !more {
+                       done := action(h.BufPane)
+                       InfoBufBindings.ResetEvents()
+                       return done
+               } else if action == nil && !more {
+                       InfoBufBindings.ResetEvents()
+               }
        }
 
-       return done
+       return more
 }
 
 // HistoryUp cycles history up
@@ -181,7 +193,7 @@ func (h *InfoPane) AbortCommand() {
        h.DonePrompt(true)
 }
 
-// BufKeyActions contains the list of all possible key actions the bufhandler could execute
+// InfoKeyActions contains the list of all possible key actions the infopane could execute
 var InfoKeyActions = map[string]InfoKeyAction{
        "HistoryUp":       (*InfoPane).HistoryUp,
        "HistoryDown":     (*InfoPane).HistoryDown,
index 860dc192ceabd08e9b5b7377c66757c3da56d033..59ee7e84e4e9c308a3958bcc7041a7b5e7a58d81 100644 (file)
@@ -12,6 +12,41 @@ import (
        "github.com/zyedidia/terminal"
 )
 
+type TermKeyAction func(*TermPane)
+
+var TermBindings *KeyTree
+
+func init() {
+       TermBindings = NewKeyTree()
+}
+
+func TermKeyActionGeneral(a TermKeyAction) PaneKeyAction {
+       return func(p Pane) bool {
+               a(p.(*TermPane))
+               return true
+       }
+}
+
+func TermMapEvent(k Event, action string) {
+       switch e := k.(type) {
+       case KeyEvent, KeySequenceEvent, RawEvent:
+               termMapKey(e, action)
+       case MouseEvent:
+               termMapMouse(e, action)
+       }
+}
+
+func termMapKey(k Event, action string) {
+       if f, ok := TermKeyActions[action]; ok {
+               TermBindings.RegisterKeyBinding(k, TermKeyActionGeneral(f))
+       }
+}
+
+func termMapMouse(k MouseEvent, action string) {
+       // TODO: map mouse
+       termMapKey(k, action)
+}
+
 type TermPane struct {
        *shell.Terminal
        display.Window
@@ -53,6 +88,7 @@ func (t *TermPane) Tab() *Tab {
 
 func (t *TermPane) Close() {}
 
+// Quit closes this termpane
 func (t *TermPane) Quit() {
        t.Close()
        if len(MainTab().Panes) > 1 {
@@ -66,6 +102,7 @@ func (t *TermPane) Quit() {
        }
 }
 
+// Unsplit removes this split
 func (t *TermPane) Unsplit() {
        n := MainTab().GetNode(t.id)
        n.Unsplit()
@@ -81,6 +118,26 @@ func (t *TermPane) Unsplit() {
 // copy-paste
 func (t *TermPane) HandleEvent(event tcell.Event) {
        if e, ok := event.(*tcell.EventKey); ok {
+               ke := KeyEvent{
+                       code: e.Key(),
+                       mod:  e.Modifiers(),
+                       r:    e.Rune(),
+               }
+               action, more := TermBindings.NextEvent(ke, nil)
+
+               if !more {
+                       if action != nil {
+                               action(t)
+                               TermBindings.ResetEvents()
+                               return
+                       }
+                       TermBindings.ResetEvents()
+               }
+
+               if more {
+                       return
+               }
+
                if t.Status == shell.TTDone {
                        switch e.Key() {
                        case tcell.KeyEscape, tcell.KeyCtrlQ, tcell.KeyEnter:
@@ -134,6 +191,41 @@ func (t *TermPane) HandleEvent(event tcell.Event) {
        }
 }
 
+// Exit closes the termpane
+func (t *TermPane) Exit() {
+       t.Terminal.Close()
+       t.Quit()
+}
+
+// CommandMode opens the termpane's command mode
+func (t *TermPane) CommandMode() {
+       InfoBar.Prompt("> ", "", "TerminalCommand", nil, func(resp string, canceled bool) {
+               if !canceled {
+                       t.HandleCommand(resp)
+               }
+       })
+}
+
+// NextSplit moves to the next split
+func (t *TermPane) NextSplit() {
+       a := t.tab.active
+       if a < len(t.tab.Panes)-1 {
+               a++
+       } else {
+               a = 0
+       }
+
+       t.tab.SetActive(a)
+}
+
+// HandleCommand handles a command for the term pane
 func (t *TermPane) HandleCommand(input string) {
        InfoBar.Error("Commands are unsupported in term for now")
 }
+
+// TermKeyActions contains the list of all possible key actions the termpane could execute
+var TermKeyActions = map[string]TermKeyAction{
+       "Exit":        (*TermPane).Exit,
+       "CommandMode": (*TermPane).CommandMode,
+       "NextSplit":   (*TermPane).NextSplit,
+}