]> git.lizzy.rs Git - micro.git/blobdiff - cmd/micro/buffer.go
Always use custom syntax files over default
[micro.git] / cmd / micro / buffer.go
index 9fcf8a7472fd27fff69c947660a4ab18f92f5092..b8071839c909f913be227814b7155ecd6e89dbc9 100644 (file)
@@ -28,7 +28,9 @@ type Buffer struct {
        // This stores all the text in the buffer as an array of lines
        *LineArray
 
-       Cursor Cursor
+       Cursor    Cursor
+       cursors   []*Cursor // for multiple cursors
+       curCursor int       // the current cursor
 
        // Path to the file on disk
        Path string
@@ -169,6 +171,8 @@ func NewBuffer(reader io.Reader, size int64, path string) *Buffer {
                file.Close()
        }
 
+       b.cursors = []*Cursor{&b.Cursor}
+
        return b
 }
 
@@ -204,7 +208,7 @@ func (b *Buffer) UpdateRules() {
                        }
 
                        ft := b.Settings["filetype"].(string)
-                       if ft == "Unknown" || ft == "" {
+                       if (ft == "Unknown" || ft == "") && !rehighlight {
                                if highlight.MatchFiletype(ftdetect, b.Path, b.lines[0].data) {
                                        header := new(highlight.Header)
                                        header.FileType = file.FileType
@@ -217,7 +221,7 @@ func (b *Buffer) UpdateRules() {
                                        rehighlight = true
                                }
                        } else {
-                               if file.FileType == ft {
+                               if file.FileType == ft && !rehighlight {
                                        header := new(highlight.Header)
                                        header.FileType = file.FileType
                                        header.FtDetect = ftdetect
@@ -305,6 +309,30 @@ func (b *Buffer) Update() {
        b.NumLines = len(b.lines)
 }
 
+func (b *Buffer) MergeCursors() {
+       var cursors []*Cursor
+       for i := 0; i < len(b.cursors); i++ {
+               c1 := b.cursors[i]
+               if c1 != nil {
+                       for j := 0; j < len(b.cursors); j++ {
+                               c2 := b.cursors[j]
+                               if c2 != nil && i != j && c1.Loc == c2.Loc {
+                                       b.cursors[j] = nil
+                               }
+                       }
+                       cursors = append(cursors, c1)
+               }
+       }
+
+       b.cursors = cursors
+}
+
+func (b *Buffer) UpdateCursors() {
+       for i, c := range b.cursors {
+               c.Num = i
+       }
+}
+
 // Save saves the buffer to its default path
 func (b *Buffer) Save() error {
        return b.SaveAs(b.Path)
@@ -338,7 +366,6 @@ func (b *Buffer) Serialize() error {
 func (b *Buffer) SaveAs(filename string) error {
        b.UpdateRules()
        dir, _ := homedir.Dir()
-       b.Path = strings.Replace(filename, "~", dir, 1)
        if b.Settings["rmtrailingws"].(bool) {
                r, _ := regexp.Compile(`[ \t]+$`)
                for lineNum, line := range b.Lines(0, b.NumLines) {
@@ -361,6 +388,7 @@ func (b *Buffer) SaveAs(filename string) error {
        data := []byte(str)
        err := ioutil.WriteFile(filename, data, 0644)
        if err == nil {
+               b.Path = strings.Replace(filename, "~", dir, 1)
                b.IsModified = false
                b.ModTime, _ = GetModTime(filename)
                return b.Serialize()
@@ -375,17 +403,9 @@ func (b *Buffer) SaveAsWithSudo(filename string) error {
        b.UpdateRules()
        b.Path = filename
 
-       // The user may have already used sudo in which case we won't need the password
-       // It's a bit nicer for them if they don't have to enter the password every time
-       _, err := RunShellCommand("sudo -v")
-       needPassword := err != nil
-
-       // If we need the password, we have to close the screen and ask using the shell
-       if needPassword {
-               // Shut down the screen because we're going to interact directly with the shell
-               screen.Fini()
-               screen = nil
-       }
+       // Shut down the screen because we're going to interact directly with the shell
+       screen.Fini()
+       screen = nil
 
        // Set up everything for the command
        cmd := exec.Command("sudo", "tee", filename)
@@ -403,13 +423,10 @@ func (b *Buffer) SaveAsWithSudo(filename string) error {
 
        // Start the command
        cmd.Start()
-       err = cmd.Wait()
+       err := cmd.Wait()
 
-       // If we needed the password, we closed the screen, so we have to initialize it again
-       if needPassword {
-               // Start the screen back up
-               InitScreen()
-       }
+       // Start the screen back up
+       InitScreen()
        if err == nil {
                b.IsModified = false
                b.ModTime, _ = GetModTime(filename)