]> git.lizzy.rs Git - micro.git/blobdiff - cmd/micro/bindings.go
Fix replace cursor relocation
[micro.git] / cmd / micro / bindings.go
index 89cd2702c548f94d488085df4ccd7e2109542e11..56a9503a9de4c0e5c5450c984976ab7fc7347c68 100644 (file)
@@ -54,6 +54,7 @@ var bindingActions = map[string]func(*View) bool{
        "Cut":                 (*View).Cut,
        "CutLine":             (*View).CutLine,
        "DuplicateLine":       (*View).DuplicateLine,
+       "DeleteLine":          (*View).DeleteLine,
        "Paste":               (*View).Paste,
        "SelectAll":           (*View).SelectAll,
        "OpenFile":            (*View).OpenFile,
@@ -72,6 +73,9 @@ var bindingActions = map[string]func(*View) bool{
        "ShellMode":           (*View).ShellMode,
        "CommandMode":         (*View).CommandMode,
        "Quit":                (*View).Quit,
+       "AddTab":              (*View).AddTab,
+       "PreviousTab":         (*View).PreviousTab,
+       "NextTab":             (*View).NextTab,
 }
 
 var bindingKeys = map[string]tcell.Key{
@@ -379,6 +383,9 @@ func DefaultBindings() map[string]string {
                "CtrlD":          "DuplicateLine",
                "CtrlV":          "Paste",
                "CtrlA":          "SelectAll",
+               "CtrlT":          "AddTab",
+               "CtrlRightSq":    "PreviousTab",
+               "CtrlBackslash":  "NextTab",
                "Home":           "Start",
                "End":            "End",
                "PageUp":         "CursorPageUp",
@@ -724,7 +731,7 @@ func (v *View) Save() bool {
        }
        // If this is an empty buffer, ask for a filename
        if v.Buf.Path == "" {
-               filename, canceled := messenger.Prompt("Filename: ", "Save")
+               filename, canceled := messenger.Prompt("Filename: ", "Save", NoCompletion)
                if !canceled {
                        v.Buf.Path = filename
                        v.Buf.Name = filename
@@ -745,6 +752,7 @@ func (v *View) Save() bool {
                        }
                        messenger.Reset()
                        messenger.Clear()
+                       messenger.Message("Saved " + v.Buf.Path)
                } else {
                        messenger.Error(err.Error())
                }
@@ -859,6 +867,18 @@ func (v *View) DuplicateLine() bool {
        return true
 }
 
+// DeleteLine deletes the current line
+func (v *View) DeleteLine() bool {
+       v.Cursor.SelectLine()
+       if !v.Cursor.HasSelection() {
+               return false
+       }
+       v.Cursor.DeleteSelection()
+       v.Cursor.ResetSelection()
+       messenger.Message("Deleted line")
+       return true
+}
+
 // Paste whatever is in the system clipboard into the buffer
 // Delete and paste if the user has a selection
 func (v *View) Paste() bool {
@@ -887,9 +907,9 @@ func (v *View) SelectAll() bool {
 // OpenFile opens a new file in the buffer
 func (v *View) OpenFile() bool {
        if v.CanClose("Continue? (yes, no, save) ") {
-               filename, canceled := messenger.Prompt("File to open: ", "Open")
+               filename, canceled := messenger.Prompt("File to open: ", "Open", FileCompletion)
                if canceled {
-                       return true
+                       return false
                }
                home, _ := homedir.Dir()
                filename = strings.Replace(filename, "~", home, 1)
@@ -897,12 +917,13 @@ func (v *View) OpenFile() bool {
 
                if err != nil {
                        messenger.Error(err.Error())
-                       return true
+                       return false
                }
                buf := NewBuffer(file, filename)
                v.OpenBuffer(buf)
+               return true
        }
-       return true
+       return false
 }
 
 // Start moves the viewport to the start of the buffer
@@ -998,7 +1019,7 @@ func (v *View) ToggleRuler() bool {
 // JumpLine jumps to a line and moves the view accordingly.
 func (v *View) JumpLine() bool {
        // Prompt for line number
-       linestring, canceled := messenger.Prompt("Jump to line # ", "LineNumber")
+       linestring, canceled := messenger.Prompt("Jump to line # ", "LineNumber", NoCompletion)
        if canceled {
                return false
        }
@@ -1041,7 +1062,7 @@ func (v *View) ToggleHelp() bool {
 
 // ShellMode opens a terminal to run a shell command
 func (v *View) ShellMode() bool {
-       input, canceled := messenger.Prompt("$ ", "Shell")
+       input, canceled := messenger.Prompt("$ ", "Shell", NoCompletion)
        if !canceled {
                // The true here is for openTerm to make the command interactive
                HandleShellCommand(input, true)
@@ -1051,7 +1072,7 @@ func (v *View) ShellMode() bool {
 
 // CommandMode lets the user enter a command
 func (v *View) CommandMode() bool {
-       input, canceled := messenger.Prompt("> ", "Command")
+       input, canceled := messenger.Prompt("> ", "Command", NoCompletion)
        if !canceled {
                HandleCommand(input)
        }
@@ -1067,10 +1088,55 @@ func (v *View) Quit() bool {
                return v.ToggleHelp()
        }
        // Make sure not to quit if there are unsaved changes
-       if views[mainView].CanClose("Quit anyway? (yes, no, save) ") {
-               views[mainView].CloseBuffer()
-               screen.Fini()
-               os.Exit(0)
+       if v.CanClose("Quit anyway? (yes, no, save) ") {
+               v.CloseBuffer()
+               if len(tabs) > 1 {
+                       if len(tabs[v.TabNum].views) == 1 {
+                               tabs = tabs[:v.TabNum+copy(tabs[v.TabNum:], tabs[v.TabNum+1:])]
+                               for i, t := range tabs {
+                                       t.SetNum(i)
+                               }
+                               if curTab >= len(tabs) {
+                                       curTab--
+                               }
+                               if curTab == 0 {
+                                       CurView().Resize(screen.Size())
+                                       CurView().matches = Match(CurView())
+                               }
+                       }
+               } else {
+                       screen.Fini()
+                       os.Exit(0)
+               }
+       }
+       return false
+}
+
+func (v *View) AddTab() bool {
+       tab := NewTabFromView(NewView(NewBuffer([]byte{}, "")))
+       tab.SetNum(len(tabs))
+       tabs = append(tabs, tab)
+       curTab++
+       if len(tabs) == 2 {
+               for _, t := range tabs {
+                       for _, v := range t.views {
+                               v.Resize(screen.Size())
+                       }
+               }
+       }
+       return true
+}
+
+func (v *View) PreviousTab() bool {
+       if curTab > 0 {
+               curTab--
+       }
+       return false
+}
+
+func (v *View) NextTab() bool {
+       if curTab < len(tabs)-1 {
+               curTab++
        }
        return false
 }