]> 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 1f3e8686b90ab6619ea0dda9f3c7c37497ad9d27..da5e6757bbed9bd4230736d8a24b649e8cd40973 100644 (file)
@@ -1,7 +1,6 @@
 package main
 
 import (
-       "crypto/md5"
        "github.com/vinzmay/go-rope"
        "io/ioutil"
        "strings"
@@ -15,24 +14,22 @@ type Buffer struct {
        r *rope.Rope
 
        // Path to the file on disk
-       path string
+       Path string
        // Name of the buffer on the status line
-       name string
+       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
-       lines []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`
@@ -43,9 +40,8 @@ func NewBuffer(txt, path string) *Buffer {
        } else {
                b.r = rope.New(txt)
        }
-       b.path = path
-       b.name = path
-       b.savedText = md5.Sum([]byte(txt))
+       b.Path = path
+       b.Name = path
 
        b.Update()
        b.UpdateRules()
@@ -56,25 +52,25 @@ 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 {
-       text := ""
        if b.r.Len() != 0 {
-               text = b.r.String()
+               return b.r.String()
        }
-       return text
+       return ""
 }
 
 // Update fetches the string from the rope and updates the `text` and `lines` in the buffer
 func (b *Buffer) Update() {
-       b.lines = strings.Split(b.String(), "\n")
+       b.Lines = strings.Split(b.String(), "\n")
+       b.NumLines = len(b.Lines)
 }
 
 // Save saves the buffer to its default path
 func (b *Buffer) Save() error {
-       return b.SaveAs(b.path)
+       return b.SaveAs(b.Path)
 }
 
 // SaveAs saves the buffer to a specified path (filename), creating the file if it does not exist
@@ -83,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()
 }
@@ -113,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.r.Report(start+1, end-start)
+       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++
@@ -130,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()