X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=cmd%2Fmicro%2Fbuffer.go;h=da5e6757bbed9bd4230736d8a24b649e8cd40973;hb=bbcd33d9fda0ebd720082ed25d3383916aaad41c;hp=e7fa1096fa0ace0267806bdf2d04a4133a4304dc;hpb=273401d911a4f52ada23a21266a7a0d5d06cea2c;p=micro.git diff --git a/cmd/micro/buffer.go b/cmd/micro/buffer.go index e7fa1096..da5e6757 100644 --- a/cmd/micro/buffer.go +++ b/cmd/micro/buffer.go @@ -14,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 string - netInsertions int + 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` @@ -42,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() @@ -55,45 +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.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.netInsertions == 0 { - return b.savedText != b.text - } - return true -} - // Insert a string into the rope func (b *Buffer) Insert(idx int, value string) { - b.netInsertions += len(value) + b.IsModified = true b.r = b.r.Insert(idx, value) b.Update() } @@ -101,14 +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.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++ @@ -117,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()