"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)
// 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)
}
}
- 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("<(.+?)>")
parsed[k] = v
}
- BindKey(k, v)
+ BindKey(k, v, Binder["buffer"])
txt, _ := json.MarshalIndent(parsed, "", " ")
return true, ioutil.WriteFile(filename, append(txt, '\n'), 0644)
}
}
- 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)
package action
import (
- "log"
"strings"
"time"
}
}
-// 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
}
// 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)
}
}
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 {
--- /dev/null
+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{}
+ }
+}
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",
}
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",
}
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 {
}
}
-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
}
}
// 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)
// 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
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,
"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
func (t *TermPane) Close() {}
+// Quit closes this termpane
func (t *TermPane) Quit() {
t.Close()
if len(MainTab().Panes) > 1 {
}
}
+// Unsplit removes this split
func (t *TermPane) Unsplit() {
n := MainTab().GetNode(t.id)
n.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:
}
}
+// 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,
+}