I have implemented basic syntax highlighting by properly setting the NSTextStorage delegate of my NSTextView and changing the text attributes in -textStorageDidProcessEditing.
The basic process is as follows
- (void)textStorageDidProcessEditing:(NSNotification *)notification {
NSTextStorage *storage = [notification object];
[storage beginEditing];
NSString *text = [storage string];
NSRange textRange = NSMakeRange(0, [text length]);
[storage removeAttribute:NSForegroundColorAttributeName range:textRange];
// Some regex matching here ...
[storage addAttribute:NSForegroundColorAttributeName
value:[COSyntax colorForPatternGroup:pattern.groupName]
range:capturedRanges[group]];
[storage endEditing];
}
Whenever -removeAttribute:range: or -addAttribute:value:range is invoked when a SPACE character is entered, the NSTextViews surrounding NSScrollView location begins to jump around (scroll knob goes to some random position near the )
What’s causing this?
I have finally found out from my observations that the jumping happens not only when pressing spacebar but for other keys such as backspace as well and this happens exactly when both of these happen.
– Non-contiguous layout is turned on
– Any modification, even to attributes, of text preceding the visible region is made inside
-textStorageDidProcessEditing:Looks like it is a bug in Non-contiguous layout feature! Would be good if an expert could confirm.
It appears to have nothing to do with calling
-beginEditingand-endEditing.