"strconv"
"unicode/utf8"
- "github.com/zyedidia/tcell"
runewidth "github.com/mattn/go-runewidth"
"github.com/zyedidia/micro/internal/buffer"
"github.com/zyedidia/micro/internal/config"
"github.com/zyedidia/micro/internal/screen"
"github.com/zyedidia/micro/internal/util"
+ "github.com/zyedidia/tcell"
)
// The BufWindow provides a way of displaying a certain section
func (w *BufWindow) Clear() {
for y := 0; y < w.Height; y++ {
for x := 0; x < w.Width; x++ {
- screen.Screen.SetContent(w.X+x, w.Y+y, ' ', nil, config.DefStyle)
+ screen.SetContent(w.X+x, w.Y+y, ' ', nil, config.DefStyle)
}
}
}
bufHeight--
}
+ bufWidth := w.Width
+ if w.Buf.Settings["scrollbar"].(bool) && w.Buf.LinesNum() > w.Height {
+ bufWidth--
+ }
+
// We need to know the string length of the largest line number
// so we can pad appropriately when displaying line numbers
maxLineNumLength := len(strconv.Itoa(b.LinesNum()))
totalwidth += width
// If we reach the end of the window then we either stop or we wrap for softwrap
- if vloc.X >= w.Width {
+ if vloc.X >= bufWidth {
if !softwrap {
break
} else {
}
vloc.X = 0
// This will draw an empty line number because the current line is wrapped
- vloc.X += maxLineNumLength + 1
+ if b.Settings["ruler"].(bool) {
+ vloc.X += maxLineNumLength + 1
+ }
}
}
}
break
}
}
- screen.Screen.SetContent(w.X+vloc.X, w.Y+vloc.Y, char, nil, s)
+ screen.SetContent(w.X+vloc.X, w.Y+vloc.Y, char, nil, s)
vloc.X++
- screen.Screen.SetContent(w.X+vloc.X, w.Y+vloc.Y, char, nil, s)
+ screen.SetContent(w.X+vloc.X, w.Y+vloc.Y, char, nil, s)
vloc.X++
}
// Write the spaces before the line number if necessary
for i := 0; i < maxLineNumLength-len(lineNum); i++ {
- screen.Screen.SetContent(w.X+vloc.X, w.Y+vloc.Y, ' ', nil, lineNumStyle)
+ screen.SetContent(w.X+vloc.X, w.Y+vloc.Y, ' ', nil, lineNumStyle)
vloc.X++
}
// Write the actual line number
for _, ch := range lineNum {
if softwrapped {
- screen.Screen.SetContent(w.X+vloc.X, w.Y+vloc.Y, ' ', nil, lineNumStyle)
+ screen.SetContent(w.X+vloc.X, w.Y+vloc.Y, ' ', nil, lineNumStyle)
} else {
- screen.Screen.SetContent(w.X+vloc.X, w.Y+vloc.Y, ch, nil, lineNumStyle)
+ screen.SetContent(w.X+vloc.X, w.Y+vloc.Y, ch, nil, lineNumStyle)
}
vloc.X++
}
// Write the extra space
- screen.Screen.SetContent(w.X+vloc.X, w.Y+vloc.Y, ' ', nil, lineNumStyle)
+ screen.SetContent(w.X+vloc.X, w.Y+vloc.Y, ' ', nil, lineNumStyle)
vloc.X++
}
func (w *BufWindow) showCursor(x, y int, main bool) {
if w.active {
if main {
- screen.Screen.ShowCursor(x, y)
+ screen.ShowCursor(x, y)
} else {
- r, _, _, _ := screen.Screen.GetContent(x, y)
- screen.Screen.SetContent(x, y, r, nil, config.DefStyle.Reverse(true))
+ screen.ShowFakeCursorMulti(x, y)
}
}
}
func (w *BufWindow) displayBuffer() {
b := w.Buf
+ if w.Height <= 0 || w.Width <= 0 {
+ return
+ }
+
hasMessage := len(b.Messages) > 0
bufHeight := w.Height
if w.drawStatus {
}
if b.Settings["syntax"].(bool) && b.SyntaxDef != nil {
- for _, c := range b.GetCursors() {
- // rehighlight starting from where the cursor is
- start := c.Y
- if start > 0 && b.Rehighlight(start-1) {
- b.Highlighter.ReHighlightLine(b, start-1)
- b.SetRehighlight(start-1, false)
+ for _, r := range b.Modifications {
+ final := -1
+ for i := r.X; i <= r.Y; i++ {
+ final = util.Max(b.Highlighter.ReHighlightStates(b, i), final)
}
-
- b.Highlighter.ReHighlightStates(b, start)
- b.Highlighter.HighlightMatches(b, w.StartLine, w.StartLine+bufHeight)
+ b.Highlighter.HighlightMatches(b, r.X, final+1)
}
+ b.ClearModifications()
}
var matchingBraces []buffer.Loc
}
curNumStyle := config.DefStyle
if style, ok := config.Colorscheme["current-line-number"]; ok {
- curNumStyle = style
+ if !b.Settings["cursorline"].(bool) {
+ curNumStyle = lineNumStyle
+ } else {
+ curNumStyle = style
+ }
}
// We need to know the string length of the largest line number
}
}
- screen.Screen.SetContent(w.X+vloc.X, w.Y+vloc.Y, r, nil, style)
+ screen.SetContent(w.X+vloc.X, w.Y+vloc.Y, r, nil, style)
if showcursor {
for _, c := range cursors {
}
vloc.X = 0
// This will draw an empty line number because the current line is wrapped
- w.drawLineNum(lineNumStyle, true, maxLineNumLength, &vloc, &bloc)
+ if b.Settings["ruler"].(bool) {
+ w.drawLineNum(lineNumStyle, true, maxLineNumLength, &vloc, &bloc)
+ }
}
}
}
curStyle = style.Background(fg)
}
}
- screen.Screen.SetContent(i+w.X, vloc.Y+w.Y, ' ', nil, curStyle)
+ screen.SetContent(i+w.X, vloc.Y+w.Y, ' ', nil, curStyle)
}
- for _, c := range cursors {
- if c.X == bloc.X && c.Y == bloc.Y && !c.HasSelection() {
- w.showCursor(w.X+vloc.X, w.Y+vloc.Y, c.Num == 0)
- }
+ if vloc.X != bufWidth {
+ draw(' ', curStyle, true)
}
- draw(' ', curStyle, false)
-
bloc.X = w.StartCol
bloc.Y++
if bloc.Y >= b.LinesNum() {
} else if w.Y+w.Height != infoY {
w.drawStatus = true
for x := w.X; x < w.X+w.Width; x++ {
- screen.Screen.SetContent(x, w.Y+w.Height-1, '-', nil, config.DefStyle.Reverse(true))
+ screen.SetContent(x, w.Y+w.Height-1, '-', nil, config.DefStyle.Reverse(true))
}
} else {
w.drawStatus = false
}
barstart := w.Y + int(float64(w.StartLine)/float64(w.Buf.LinesNum())*float64(w.Height))
for y := barstart; y < util.Min(barstart+barsize, w.Y+bufHeight); y++ {
- screen.Screen.SetContent(scrollX, y, '|', nil, config.DefStyle.Reverse(true))
+ screen.SetContent(scrollX, y, '|', nil, config.DefStyle.Reverse(true))
}
}
}