]> git.lizzy.rs Git - micro.git/blobdiff - cmd/micro/buffer.go
Add a bit of "padding" to relocate
[micro.git] / cmd / micro / buffer.go
index 8fa620f00a6108d3b1d00b03c464927afbdcf146..da5e6757bbed9bd4230736d8a24b649e8cd40973 100644 (file)
@@ -1,7 +1,6 @@
 package main
 
 import (
-       "crypto/md5"
        "github.com/vinzmay/go-rope"
        "io/ioutil"
        "strings"
@@ -19,22 +18,18 @@ type Buffer struct {
        // Name of the buffer on the status line
        Name string
 
-       // This is the text stored every time the buffer is saved to check if the buffer is modified
-       savedText           [16]byte
-       netInsertions       int
-       dirtySinceLastCheck bool
+       IsModified bool
 
        // Provide efficient and easy access to text and lines so the rope String does not
        // need to be constantly recalculated
        // These variables are updated in the update() function
-       Text     string
        Lines    []string
        NumLines int
 
        // Syntax highlighting rules
        rules []SyntaxRule
        // The buffer's filetype
-       Filetype string
+       FileType string
 }
 
 // NewBuffer creates a new buffer from `txt` with path and name `path`
@@ -47,7 +42,6 @@ func NewBuffer(txt, path string) *Buffer {
        }
        b.Path = path
        b.Name = path
-       b.savedText = md5.Sum([]byte(txt))
 
        b.Update()
        b.UpdateRules()
@@ -58,21 +52,19 @@ func NewBuffer(txt, path string) *Buffer {
 // UpdateRules updates the syntax rules and filetype for this buffer
 // This is called when the colorscheme changes
 func (b *Buffer) UpdateRules() {
-       b.rules, b.Filetype = GetRules(b)
+       b.rules, b.FileType = GetRules(b)
 }
 
 func (b *Buffer) String() string {
-       return b.Text
+       if b.r.Len() != 0 {
+               return b.r.String()
+       }
+       return ""
 }
 
 // Update fetches the string from the rope and updates the `text` and `lines` in the buffer
 func (b *Buffer) Update() {
-       if b.r.Len() != 0 {
-               b.Text = b.r.String()
-       } else {
-               b.Text = ""
-       }
-       b.Lines = strings.Split(b.Text, "\n")
+       b.Lines = strings.Split(b.String(), "\n")
        b.NumLines = len(b.Lines)
 }
 
@@ -87,29 +79,14 @@ func (b *Buffer) SaveAs(filename string) error {
        data := []byte(b.String())
        err := ioutil.WriteFile(filename, data, 0644)
        if err == nil {
-               b.savedText = md5.Sum(data)
-               b.netInsertions = 0
+               b.IsModified = false
        }
        return err
 }
 
-// IsDirty returns whether or not the buffer has been modified compared to the one on disk
-func (b *Buffer) IsDirty() bool {
-       if !b.dirtySinceLastCheck {
-               return false
-       }
-       if b.netInsertions == 0 {
-               isDirty := b.savedText != md5.Sum([]byte(b.String()))
-               b.dirtySinceLastCheck = isDirty
-               return isDirty
-       }
-       return true
-}
-
 // Insert a string into the rope
 func (b *Buffer) Insert(idx int, value string) {
-       b.dirtySinceLastCheck = true
-       b.netInsertions += len(value)
+       b.IsModified = true
        b.r = b.r.Insert(idx, value)
        b.Update()
 }
@@ -117,15 +94,17 @@ func (b *Buffer) Insert(idx int, value string) {
 // Remove a slice of the rope from start to end (exclusive)
 // Returns the string that was removed
 func (b *Buffer) Remove(start, end int) string {
-       b.dirtySinceLastCheck = true
-       b.netInsertions -= end - start
+       b.IsModified = true
        if start < 0 {
                start = 0
        }
        if end > b.Len() {
                end = b.Len()
        }
-       removed := b.Text[start:end]
+       if start == end {
+               return ""
+       }
+       removed := b.Substr(start, end)
        // The rope implenentation I am using wants indicies starting at 1 instead of 0
        start++
        end++
@@ -134,6 +113,11 @@ func (b *Buffer) Remove(start, end int) string {
        return removed
 }
 
+// Substr returns the substring of the rope from start to end
+func (b *Buffer) Substr(start, end int) string {
+       return b.r.Substr(start+1, end-start).String()
+}
+
 // Len gives the length of the buffer
 func (b *Buffer) Len() int {
        return b.r.Len()