]> 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 9ab2ae79d8077e07f7bbcdc0e9695d126768a550..da5e6757bbed9bd4230736d8a24b649e8cd40973 100644 (file)
@@ -14,25 +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           string
-       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
+       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 = txt
+       b.Path = path
+       b.Name = path
 
        b.Update()
        b.UpdateRules()
@@ -56,52 +52,41 @@ 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 {
+       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 = ""
-       } else {
-               b.text = b.r.String()
-       }
-       b.lines = strings.Split(b.text, "\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
 func (b *Buffer) SaveAs(filename string) error {
        b.UpdateRules()
-       err := ioutil.WriteFile(filename, []byte(b.text), 0644)
+       data := []byte(b.String())
+       err := ioutil.WriteFile(filename, data, 0644)
        if err == nil {
-               b.savedText = b.text
-               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 != b.text
-               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()
 }
@@ -109,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++
@@ -126,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()