[txmt-dev] Implementing inline marks

Jacob Carlborg doob at me.com
Thu May 29 12:30:18 UTC 2014


This is a followup on the "Setting the background color of a specific 
line" [1] thread. As I said later in that thread I'm now working on 
implementing inline marks (errors, warnings, etc). The way I imagined 
this to work like is how it works in Xcode. The "mate" command will have 
a flag to set a mark and data (text string) on a particular line (as 
discussed in the thread [1]). This will be shown in TextMate by it 
drawing a background color on all lines with a mark and the mark's data 
will be drawn on the same line but to the right (where there's usually 
extra space).

I have changed the implementation of drawing a background color on a 
line to use marks related functions [2] in the buffer framework as 
suggested in the previously mentioned thread. The next step is I need to 
support displaying marks data (error messages). For that I have two 
questions:

1. I need to store the data (text) somewhere. Should I extend the 
"marks_t" [3] type to support storing some additional data or create a 
new separate type that behave like "marks_t"?

Actually, I've already tried and changed the implementation to store a 
std::vector<std::string> in the indexed map [4] instead of a 
std::string. The existing API in "marks_t" is complete backwards 
compatible and I've added new functions to return a 
std::vector<std::string> instead of a std::string. It works, but I don't 
know if it's a good idea.

2. When it comes to drawing the marks data I think there's two options:

A. Add the data as a text node
B. Draw it separately on a line

With A I don't know how well it works to basically have two separate 
text strings on the same line. One that will be draw from the left side 
(the code) and one that will be drawn from the right side (the mark data).

With B there's the issue with line wrapping. Usually there's plenty of 
space to the right of the text on a single line, because most developers 
try to keep their code within 80 columns (or similar). But if the main 
view gets too small, either by the window getting too small (or the 
output window is place inside the main window to the right) the mark 
data need to be able to wrap to not cover up the code in the main view.

I have already implemented option B with support for wrapping, but only 
for the same line, i.e. if the mark data would cover the code on the 
line which the mark is attached to, it will be rendered on the next 
line. But with the current implementation it will still cover code on 
the next line (if there is any). I'm wondering if I'm reimplementing 
some of TextMate's line wrapping by choosing option B.

[1] 
http://textmate.1073791.n5.nabble.com/txmt-dev-Setting-the-background-color-of-a-specific-line-td27632.html

[2] 
https://github.com/textmate/textmate/blob/master/Frameworks/buffer/src/buffer.h#L130-L136

[3] 
https://github.com/textmate/textmate/blob/master/Frameworks/buffer/src/meta_data.h#L38

[4] 
https://github.com/textmate/textmate/blob/master/Frameworks/buffer/src/meta_data.h#L53

-- 
/Jacob Carlborg



More information about the textmate-dev mailing list