package main
import (
- "crypto/md5"
"github.com/vinzmay/go-rope"
"io/ioutil"
"strings"
// 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
// 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`
}
b.Path = path
b.Name = path
- b.savedText = md5.Sum([]byte(txt))
b.Update()
b.UpdateRules()
// 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 {
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()
}
// 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()
}
+ if start == end {
+ return ""
+ }
removed := b.Substr(start, end)
// The rope implenentation I am using wants indicies starting at 1 instead of 0
start++
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()
}