Up Next:
+* highlight strings and characters
+* highlight classes of identifiers
+* higlight current line in gutter
+* ^A shortcut should set implicit mark
+
* move by words is inconsistent. Example:
var infoId = 'readerinfo'+reader.id;
* Add a way to CD using a builtin (buffers will track original dir)
The Future:
-* Syntax highlighting
* Case insensitive search
* Ctrl+Up,Down requires two undos to revert.
* Ctrl+Up,Down with non line selection should track column
else if (matches(buf, &off, syntax->comments.multi_beg))
for (; off < end && !matches(buf, &off, syntax->comments.multi_end); off++);
if (start != off)
- spans = mkspan(start, ++off, CLR_Comment, spans);
+ spans = mkspan(start, --off, CLR_Comment, spans);
if (!firstspan && spans)
firstspan = spans;
}
SyntaxSpan* curr = view->spans;
for (size_t r = 0; curr && r < view->nrows; r++) {
Row* row = view->rows[r];
- for (; curr && curr->end < row->off; curr = curr->next);
- if (curr) {
- size_t off = row->off, col = 0;
- while (col < row->len) {
- if (curr->beg <= off && off < curr->end && !(row->cols[col].attr & 0xFF00)) {
- uint32_t attr = row->cols[col].attr;
- row->cols[col].attr = (row->cols[col].attr & 0xFF00) | curr->color;
- }
- off++, col++;
- while (col < row->len && row->cols[col].rune == '\0')
- col++;
+ size_t off = row->off, col = 0;
+ while (col < row->len) {
+ /* skip irrelevant highlight regions */
+ for (; curr && curr->end < off; curr = curr->next);
+ if (!curr) { r = -1; break; } // Break both loops if we're done
+
+ /* check if we're in the current region */
+ if (curr->beg <= off && off <= curr->end && !(row->cols[col].attr & 0xFF00)) {
+ uint32_t attr = row->cols[col].attr;
+ row->cols[col].attr = (row->cols[col].attr & 0xFF00) | curr->color;
}
+ off++, col++;
+ while (col < row->len && row->cols[col].rune == '\0')
+ col++;
}
}